Skip to content

feat(board): add Duoduo S3 Voice board - #2288

Open
lllwan wants to merge 1 commit into
78:mainfrom
lllwan:feat/duoduo-s3-voice
Open

lllwan wants to merge 1 commit into
78:mainfrom
lllwan:feat/duoduo-s3-voice

Conversation

@lllwan

@lllwan lllwan commented Oct 4, 2026

Copy link
Copy Markdown

A minimal audio-only ESP32-S3 board built around the WROOM-1 N8R2 module (8MB quad flash, 2MB quad PSRAM). An INMP441 I2S microphone and a MAX98357 amplifier are wired directly to the chip with no codec, so audio runs through the codec-less simplex I2S path. Only a BOOT button (GPIO0) and a status LED (GPIO45) are exposed; there is no display.

Because the board has no display, lv_init() is called in the board constructor: Assets::Apply() creates fonts through the LVGL allocator during activation, and every existing board initializes LVGL in its display constructor, so without it the device crash-loops right after the first network connect.

Tested on hardware: boots, activates, Wi-Fi/MQTT connect, offline wake word (wn9_nihaoxiaozhi_tts via AFE) and full conversations all work.

@lllwan
lllwan force-pushed the feat/duoduo-s3-voice branch 4 times, most recently from a4f4e59 to 27318f5 Compare October 6, 2026 12:52
A compact audio-first ESP32-S3 board with expansion headers for a TFT
display, a DVP camera and an optional 4G modem, built around the
WROOM-1 module (default N8R2 variant; an N8R8 build variant is provided
for octal PSRAM modules on the same footprint).

Audio needs no codec chip: an MP34DT05-A PDM MEMS microphone and a
PT8211 I2S DAC feeding an NS4160 5W class-D amplifier are wired directly
to the chip. The PDM mic captures at 32 kHz so the 64x PDM clock stays
above the MP34DT05-A ~1.2 MHz power-down threshold, and the audio
service resamples it for the wake-word engine. The NS4160 CTRL pin is
driven by GPIO6, raised only after the I2S channel starts and lowered
before teardown to avoid power-on pops (pattern from the T-Circle-S3
V1.1 board).

The remaining interfaces follow existing board patterns: SPI TFT panels
on an 8-pin header (ST7789/ILI9341/GC9A01 via the shared Kconfig LCD
choice, like bread-compact-wifi-cam), an 8-bit DVP camera on a 2x8
header (Esp32Camera, QVGA by default so the framebuffer fits the 2 MB
PSRAM alongside the LVGL pool and AFE models), and an ML307/EC801E
Cat.1 modem on UART1 via DualNetworkBoard with WiFi as the default and
a BOOT double-click to switch. The console runs on the USB-JTAG port so
a single Type-C cable handles power, flashing and monitoring, leaving
GPIO43/44 free for the modem.

Bring-up was done on a breadboard with an INMP441 + MAX98357 front end
(codec-less simplex I2S): boots, activates, Wi-Fi/MQTT connect, offline
wake word (wn9_nihaoxiaozhi_tts via AFE) and full conversations all
work. The final PDM + DAC/amplifier chain follows the same proven path
used by the T-Circle-S3 V1.1 board.

Co-Authored-By: Claude Code <noreply@anthropic.com>
@lllwan
lllwan force-pushed the feat/duoduo-s3-voice branch from 27318f5 to 631b753 Compare October 6, 2026 13:00
@78

78 commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

I checked the CI failure logs. The failure occurs in the Test build tooling step, before firmware compilation begins. Two changes are needed:

  1. In main/Kconfig.projbuild, the new BOARD_TYPE_DUODUO_S3_VOICE entry breaks the board menu's natural sort order. Please move it after BOARD_TYPE_DU_CHATX and before BOARD_TYPE_ELECTRON_BOT. This causes test_board_menu_is_sorted_and_matches_cmake to fail.
  2. In main/boards/duoduo-s3-voice/config.json, the duoduo-s3-voice-n16r8 variant repeats these project defaults. Please remove both entries so the variant inherits them from sdkconfig.defaults:
    CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
    CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/16m.csv"
    
    This causes test_default_flash_options_are_not_repeated to fail. Keep the flash size and partition overrides for the two 8MB variants.

I reproduced both failures in a temporary copy of this PR's merge snapshot. After applying the minimal changes above, all 98 tests passed with python3 -m unittest discover -s scripts/tests -v. This validation covers the host-side tests only; firmware builds and hardware testing have not been performed.

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.

2 participants