Skip to content

Add ESP32-S3 Super Mini board support - #11557

Closed
unconditional wants to merge 3 commits into
adafruit:mainfrom
unconditional:main
Closed

unconditional wants to merge 3 commits into
adafruit:mainfrom
unconditional:main

Conversation

@unconditional

@unconditional unconditional commented Oct 11, 2026 •

Copy link
Copy Markdown

Add ESP32-S3 Super Mini board support

Board specifications

  • MCU: ESP32-S3FH4R2 (dual-core Xtensa LX7 @ 240 MHz)
  • Flash: 4 MB embedded
  • PSRAM: 2 MB QSPI (quad-SPI, enabled by default)
  • USB: USB-C native USB (no USB-UART bridge)
  • Dimensions: 23.5 × 18 mm, 2.54 mm pin pitch
  • Onboard LEDs:
    • WS2812 RGB LED on GPIO48 (exposed as board.NEOPIXEL)
    • Red power LED on GPIO48 (exposed as board.RED_LED)
  • Battery: LiPo/Li-ion charger on back pads (BAT+/BAT-), BOOST jumper (100mA/300mA)
  • Battery monitoring: VBAT=GPIO10 (board.VBAT), VBUS=GPIO33 (board.VBUS)
  • Strapping pins: GPIO3 (JTAG source), GPIO45 (VDD_SPI voltage), GPIO46 (boot mode)
  • Available GPIOs: 35 (GPIO1-18, GPIO21, GPIO33-48)

Pin mappings

  • I2C: SCL=GPIO6, SDA=GPIO7 (board.I2C())
  • SPI: SCK=GPIO36, MOSI=GPIO35, MISO=GPIO37 (board.SPI())
  • UART: TX=GPIO43, RX=GPIO44 (board.UART())
  • Analog: A0-A9 on GPIO1-10
  • BOOT button: GPIO0 (board.BUTTON)

Reference
Board documentation: https://www.espboards.dev/esp32/esp32-s3-super-mini/

Testing

  • ✅ CI build passes
  • ✅ REPL works, board name correct
  • ✅ All 35 GPIOs exposed with aliases
  • ✅ NeoPixel (WS2812) functional
  • ✅ Red LED digital control functional
  • ✅ I2C, SPI, UART initialize
  • ✅ PSRAM enabled (2MB free memory confirmed)

Comment thread ports/espressif/boards/esp32s3_supermini/mpconfigboard.h
@grgrant

grgrant commented Oct 12, 2026 •

Copy link
Copy Markdown

I seem to have collided with you because we were both trying to get this board added to CircuitPython this afternoon. You might check out my PR #11563. I really don't have a preference whether your or my PR gets merged. I do have a few notes:

Edit: Dropped Neopixed GRB comment

  • There is already a TinyUF2 board definition for this board and it uses espressif registered USB_VID = 0x303a and USB_PID = 0x8247
  • I never found any documentation showing VBAT sense and 5V Sense -- do you have any source for that? It is a nice addition if truly connected on the board. In my testing so far I don't see GPIO33 showing any indication that 5V is present unless it is active low.
  • I like your added I2C pin defines. I could never find any pinout that documented those particular ones but as you note if they are safe pins (and the I2C are often on those pins) why not define them.

@unconditional

Copy link
Copy Markdown
Author

@grgrant I also don't have any preference which PR is merged as long as the board is supported as soon as possible.

Regarding the questions:

  • In my testing all boards seem to handle the RGB led colors correctly when triggered by the neopixel library without MICROPY_HW_NEOPIXEL_ORDER_GRB

  • Not sure what to do with this. I checked 5 boards from different batches and all have VID_303A&PID_1001

  • This is actually my mistake, thanks for catching

  • The I2C pins (GPIO6=SCL, GPIO7=SDA) were chosen as safe general-purpose pins based on the ESP32-S3 pinout:

    • Not strapping pins (unlike GPIO0, 3, 45, 46)
    • Not used for flash/PSRAM (GPIO26-32 reserved)
    • Not USB/JTAG (GPIO19-20, 39-42, 43-44)
    • ADC-capable (ADC1_CH5/CH6)
    • Broken out on side headers
      This seems to follow CircuitPython convention for boards with broken-out IOs but no fixed I2C peripheral.

@dhalbert

Copy link
Copy Markdown
Collaborator

We generally don't assign board.I2C(), etc. without there being specific silkscreen markings or a convention across multiple boards. For instance, on the Pi Pico, we didn't do that, because there was actually more than one choice for the default devices (unfortunately).

We could be argued out of that, but it's been our style.

If you have not seen https://learn.adafruit.com/how-to-add-a-new-board-to-circuitpython/, it's worth looking at.

@grgrant

grgrant commented Oct 12, 2026 •

Copy link
Copy Markdown

VID/PID

This was my first board so I was figuring things out. I'm pretty positive you need:
USB_VID = 0x303a and USB_PID = 0x8247 The VID/PID you said you saw was coming from the default in the espressif silicon and would be the same for every ESP32S series that had not had a boot loader loaded.

In the learn guide Dan linked to above there is a FAQ entry talking about the USB VID/PIDs. Adafruit requires each different hardware have a unique VID/PID pair for each mode. In the FAQ entry on "Why does Circuit Python require a VID:PID for every board definition" it says:

With a few legacy exceptions, each different hardware product that runs CircuitPython needs a different unique identifier. Furthermore, if a piece of hardware has different operating modes (such as UF2 bootloader, Arduino, CircuitPython), each mode should have a different unique ID.

And as I noted in my PR the person creating the boot loader for tinyuf2 in 2024 already registered three VID:PIDs for the board with espressif. espressif/usb-pids#183 https://github.com/espressif/usb-pids/pull/183/changes

Pin Comments

When I created my pin list I followed a similar board either the MakerGo ESP32C3 or C6 Supermini. It has all the under board pads. While not every board does this (the QyPy ESP32S3 doesnt), the MakerGo version also defined IO1, IO2 IO3 ... That would make a ton of pin defs due to how many are present on the SuperMini but apparently the MakerGo folks thought it nice to have the IO versions.

They did not have SCL and SDA defined since their boards don't show those pins. Some vendors don't have a silk screen but their online resource will call out a SDA/SCL pin. In the case of the ESP32S2 Supermini no docs I see have called out specific SDA/SCL so I can see why Dan suggested removing the I2C definition.

@tannewt

tannewt commented Oct 12, 2026

Copy link
Copy Markdown
Member

Thanks for this! I merge in #11563 because it has a valid USB PID. This one is the bootloader PID I believe.

@tannewt tannewt closed this Oct 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants