diy: add ESP32-S3-DevKitC-1 build with ST7789, OV2640 and 3 buttons
What changed, and why it matters
This commit adds support for a new do-it-yourself hardware build of the Blockstream Jade wallet using an ESP32-S3 development board, a small LCD screen, and a camera module. It only adds configuration files, documentation, and a build job. There is no indication of a security fix or vulnerability.
No security action required. This is a hardware support/documentation addition.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit introduces a new DIY target: ESP32-S3-DevKitC-1 with ST7789 display and OV2640 camera. Changes include a new sdkconfig defaults file (configs/sdkconfig_diycam_esp32-s3-devkitc-1.defaults), README documentation, an image, and a GitLab CI build job. No source code logic is modified. No security-relevant changes are present in the diff.
Changed components
configs/sdkconfig_diycam_esp32-s3-devkitc-1.defaultsdiy/README.mddiy/esp32-s3-devkitc-1/README.mddiy/img/esp32-s3-devkitc-1.jpggitlab/diy_fw.ymlInspect captured patch +220 / −0
diff --git a/configs/sdkconfig_diycam_esp32-s3-devkitc-1.defaults b/configs/sdkconfig_diycam_esp32-s3-devkitc-1.defaults
new file mode 100644
index 0000000..33ba3fd
--- /dev/null
+++ b/configs/sdkconfig_diycam_esp32-s3-devkitc-1.defaults
@@ -0,0 +1,154 @@
+# diycam esp32-s3-devkitc-1
+CONFIG_APP_REPRODUCIBLE_BUILD=y
+CONFIG_BF20A6_SUPPORT=n
+CONFIG_BF3005_SUPPORT=n
+CONFIG_BOARD_TYPE_CUSTOM=y
+CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
+CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
+CONFIG_BOOTLOADER_WDT_ENABLE=n
+CONFIG_BT_ENABLED=y
+CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=517
+CONFIG_BT_NIMBLE_ENABLED=y
+CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=11
+CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=5632
+CONFIG_BT_NIMBLE_LOG_LEVEL_NONE=y
+CONFIG_BT_NIMBLE_MAX_CONNECTIONS=1
+CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
+CONFIG_BT_NIMBLE_NVS_PERSIST=y
+CONFIG_BT_NIMBLE_ROLE_BROADCASTER=n
+CONFIG_BT_NIMBLE_ROLE_CENTRAL=n
+CONFIG_BT_NIMBLE_ROLE_OBSERVER=n
+CONFIG_BT_NIMBLE_SM_LEGACY=n
+CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="j"
+CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=100
+CONFIG_BUTTON_LONG_PRESS_TIME_MS=500
+CONFIG_CAMERA_D0=4
+CONFIG_CAMERA_D1=5
+CONFIG_CAMERA_D2=6
+CONFIG_CAMERA_D3=7
+CONFIG_CAMERA_D4=8
+CONFIG_CAMERA_D5=9
+CONFIG_CAMERA_D6=16
+CONFIG_CAMERA_D7=17
+CONFIG_CAMERA_FRONT_FACING=n
+CONFIG_CAMERA_HREF=39
+CONFIG_CAMERA_PCLK=21
+CONFIG_CAMERA_PWDN=-1
+CONFIG_CAMERA_RESET=-1
+CONFIG_CAMERA_ROTATE_180=n
+CONFIG_CAMERA_ROTATE_270=n
+CONFIG_CAMERA_ROTATE_90=y
+CONFIG_CAMERA_SCL=41
+CONFIG_CAMERA_SDA=40
+CONFIG_CAMERA_VSYNC=38
+CONFIG_CAMERA_XCLK=-1
+CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT=y
+CONFIG_COMPILER_OPTIMIZATION_SIZE=y
+CONFIG_COMPILER_STACK_CHECK_MODE_STRONG=y
+CONFIG_COMPILER_WARN_WRITE_STRINGS=y
+CONFIG_DCS_ADDRESS_MODE_BGR_SELECTED=n
+CONFIG_DCS_ADDRESS_MODE_MIRROR_X_SELECTED=y
+CONFIG_DCS_ADDRESS_MODE_MIRROR_Y_SELECTED=n
+CONFIG_DCS_ADDRESS_MODE_SWAP_XY_SELECTED=y
+CONFIG_DEBUG_MODE=y
+CONFIG_DISPLAY_HEIGHT=135
+CONFIG_DISPLAY_INVERT=y
+CONFIG_DISPLAY_OFFSET_X=40
+CONFIG_DISPLAY_OFFSET_Y=53
+CONFIG_DISPLAY_PIN_BL=15
+CONFIG_DISPLAY_PIN_CLK=12
+CONFIG_DISPLAY_PIN_CS=10
+CONFIG_DISPLAY_PIN_DC=13
+CONFIG_DISPLAY_PIN_MISO=-1
+CONFIG_DISPLAY_PIN_MOSI=11
+CONFIG_DISPLAY_PIN_RST=14
+CONFIG_DISPLAY_SPI_CLOCK=32000000
+CONFIG_DISPLAY_SPI_HOST=1
+CONFIG_DISPLAY_WIDTH=240
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=n
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=12288
+CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=n
+CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=n
+CONFIG_ESP_SYSTEM_BBPLL_RECALIB=n
+CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT=y
+CONFIG_ESP_TASK_WDT_EN=n
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=n
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=n
+CONFIG_ESP_WIFI_IRAM_OPT=n
+CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=n
+CONFIG_ESP_WIFI_NVS_ENABLED=n
+CONFIG_ESP_WIFI_RX_IRAM_OPT=n
+CONFIG_ESP_WIFI_SOFTAP_SUPPORT=n
+CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
+CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
+CONFIG_FATFS_LFN_HEAP=y
+CONFIG_FATFS_VFS_FSTAT_BLKSIZE=4096
+CONFIG_FATFS_VOLUME_COUNT=1
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=3
+CONFIG_GC0308_SUPPORT=n
+CONFIG_GC032A_SUPPORT=n
+CONFIG_GC2145_SUPPORT=n
+CONFIG_HAS_CAMERA=y
+CONFIG_I2C_SCL=-1
+CONFIG_I2C_SDA=-1
+CONFIG_IDF_TARGET="esp32s3"
+CONFIG_INPUT_BTN_A=1
+CONFIG_INPUT_BTN_B=42
+CONFIG_INPUT_FRONT_SW=2
+CONFIG_INPUT_INVERT_WHEEL=n
+CONFIG_INPUT_ONE_BUTTON_MODE=n
+CONFIG_INPUT_WHEEL_A=-1
+CONFIG_INPUT_WHEEL_B=-1
+CONFIG_INPUT_WHEEL_SW=-1
+CONFIG_LCD_BACKLIGHT_PIN_NUM=-1
+CONFIG_LCD_CMD_BITS=-1
+CONFIG_LCD_PARAM_BITS=-1
+CONFIG_LCD_PIXEL_CLOCK_HZ=-1
+CONFIG_LCD_POWER_PIN_NUM=-1
+CONFIG_LCD_RD_PIN_NUM=-1
+CONFIG_LOG_DEFAULT_LEVEL_INFO=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
+CONFIG_NEWLIB_NANO_FORMAT=y
+CONFIG_NT99141_SUPPORT=n
+CONFIG_OV2640_SUPPORT=y
+CONFIG_OV3660_SUPPORT=n
+CONFIG_OV5640_SUPPORT=n
+CONFIG_OV7670_SUPPORT=n
+CONFIG_OV7725_SUPPORT=n
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitionss3.csv"
+CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
+CONFIG_PIN_NUM_CS=-1
+CONFIG_PIN_NUM_DATA0=-1
+CONFIG_PIN_NUM_DATA1=-1
+CONFIG_PIN_NUM_DATA2=-1
+CONFIG_PIN_NUM_DATA3=-1
+CONFIG_PIN_NUM_DATA4=-1
+CONFIG_PIN_NUM_DATA5=-1
+CONFIG_PIN_NUM_DATA6=-1
+CONFIG_PIN_NUM_DATA7=-1
+CONFIG_PIN_NUM_DC=-1
+CONFIG_PIN_NUM_RST=-1
+CONFIG_PIN_NUM_WR=-1
+CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=n
+CONFIG_PSRAM_DATA_ALIGNMENT=-1
+CONFIG_SC030IOT_SUPPORT=n
+CONFIG_SCCB_CLK_FREQ=200000
+CONFIG_SPI_FLASH_VERIFY_WRITE=y
+CONFIG_SPI_MASTER_ISR_IN_IRAM=n
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=n
+CONFIG_SPIRAM=y
+CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y
+CONFIG_SPIRAM_FETCH_INSTRUCTIONS=y
+CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=256
+CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536
+CONFIG_SPIRAM_MEMTEST=n
+CONFIG_SPIRAM_MODE_OCT=y
+CONFIG_SPIRAM_RODATA=y
+CONFIG_SPIRAM_SPEED_80M=y
+CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP=y
+CONFIG_TINYUSB_CDC_ENABLED=y
+CONFIG_TINYUSB_CDC_RX_BUFSIZE=64
+CONFIG_UI_WRAP_ALL_MENUS=y
diff --git a/diy/README.md b/diy/README.md
index 9966917..e551577 100644
--- a/diy/README.md
+++ b/diy/README.md
@@ -119,6 +119,19 @@ There are a number of hardware devices that can run Jade firmware with minimal c
* [3d printed case, example STL files available here](https://www.printables.com/model/493485-cases-for-diy-jade-based-on-esp32-cam)
* [Assembly Guide & Hardware Notes](./esp32-cam/)
+### ESP32-S3-DevKitC-1 + ST7789 1.14" LCD + OV2640 Camera
+
+* Costs ~$10-15 USD for the dev board + ~$5-10 USD for display and camera modules
+* Three button interface (left / select / right)
+* USB VendorID:303a ProductID:1001 (Different to retail Jade)
+* Typically supports Secure Boot V2
+* Hardware Required (No Soldering Required)
+ * [ESP32-S3-DevKitC-1](https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitc-1/index.html) (N8R8 variant, 8MB flash + 8MB Octal PSRAM)
+ * ST7789 1.14" 135*240 SPI LCD module
+ * OV2640 camera module (STM32-compatible red module with onboard oscillator)
+ * Dupont wires
+* [Assembly Guide & Hardware Notes](./esp32-s3-devkitc-1/)
+
### Waveshare S3 Touch LCD 2

* Costs ~$20 USD from manufacturer
diff --git a/diy/esp32-s3-devkitc-1/README.md b/diy/esp32-s3-devkitc-1/README.md
new file mode 100644
index 0000000..4d543fb
--- /dev/null
+++ b/diy/esp32-s3-devkitc-1/README.md
@@ -0,0 +1,50 @@
+# ESP32-S3-DevKitC-1 Assembly
+
+**Note on the OV2640 Camera Module**
+
+This build uses the STM32-compatible OV2640 red module (common on AliExpress). Unlike other OV2640 modules, this one has an **onboard 24 MHz oscillator**, so the XCLK pin is not connected. The pixel clock output on this module is labelled **DCLK** (not PCLK), connect it to GPIO 21.
+
+## Power Pins
+| Function | Pin Number (On ESP32-S3) |
+| --- | --- |
+| VCC (Display, Camera) | 3.3V |
+| GND (Display, Camera, Buttons) | GND |
+
+## Display Pins (ST7789 1.14" SPI)
+| Function Pin (On Display) | Pin Number (On ESP32-S3) |
+| --- | --- |
+| SDA (MOSI) | 11 |
+| SCL (CLK) | 12 |
+| CS | 10 |
+| DC | 13 |
+| RES (RST) | 14 |
+| BL (Backlight) | 15 |
+
+## Camera Pins (OV2640)
+| Function Pin (On Camera) | Pin Number (On ESP32-S3) |
+| --- | --- |
+| D0 | 4 |
+| D1 | 5 |
+| D2 | 6 |
+| D3 | 7 |
+| D4 | 8 |
+| D5 | 9 |
+| D6 | 16 |
+| D7 | 17 |
+| XCLK | Not Connected (onboard oscillator) |
+| DCLK (PCLK) | 21 |
+| VSYNC | 38 |
+| HREF | 39 |
+| SDA (SCCB) | 40 |
+| SCL (SCCB) | 41 |
+| PWDN | GND (tie directly) |
+| RESET | 3.3V (tie directly) |
+
+## Button Pins
+Wire each button with one leg to the Pin Number (On ESP32-S3) and the other to GND. Internal pull-ups are enabled, no external resistors needed.
+
+| Button | Pin Number (On ESP32-S3) | Function |
+| --- | --- | --- |
+| LEFT | 1 | Navigate left / back |
+| SELECT | 2 | Confirm / select |
+| RIGHT | 42 | Navigate right |
diff --git a/diy/img/esp32-s3-devkitc-1.jpg b/diy/img/esp32-s3-devkitc-1.jpg
new file mode 100644
index 0000000..c2640f6
Binary files /dev/null and b/diy/img/esp32-s3-devkitc-1.jpg differ
diff --git a/gitlab/diy_fw.yml b/gitlab/diy_fw.yml
index d67b611..4b957a2 100644
--- a/gitlab/diy_fw.yml
+++ b/gitlab/diy_fw.yml
@@ -48,6 +48,9 @@ build_diy_diycam_esp32-cam:
build_diy_diycam_esp32-wrover-cam:
extends: .build_diy_template
+build_diy_diycam_esp32-s3-devkitc-1:
+ extends: .build_diy_template
+
build_diy_diycam_tcameraplus:
extends: .build_diy_template
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.