From bbf7a72ee3dc52f3e8060a07d9039fe627d76423 Mon Sep 17 00:00:00 2001 From: ohararp Date: Sat, 31 Jan 2026 14:55:33 -0500 Subject: [PATCH 1/2] Add OHARARP ESP32-B board definition ESP32-S3-WROOM-1-N16R8 based Feather-compatible board with: - 16MB QIO flash, 8MB OPI PSRAM - Native USB-C - DS3231MZ+ RTC with coin cell backup - AT24CS32 I2C EEPROM - Micro SD card (SPI) - NeoPixel (SK6805), status LED, 2 user buttons - STEMMA/Qwiic I2C breakout (JST-SH) Co-Authored-By: Claude Opus 4.5 --- ports/espressif/boards/ohararp_esp32b/board.c | 10 +++ .../boards/ohararp_esp32b/mpconfigboard.h | 30 +++++++++ .../boards/ohararp_esp32b/mpconfigboard.mk | 16 +++++ ports/espressif/boards/ohararp_esp32b/pins.c | 64 +++++++++++++++++++ .../espressif/boards/ohararp_esp32b/sdkconfig | 17 +++++ 5 files changed, 137 insertions(+) create mode 100644 ports/espressif/boards/ohararp_esp32b/board.c create mode 100644 ports/espressif/boards/ohararp_esp32b/mpconfigboard.h create mode 100644 ports/espressif/boards/ohararp_esp32b/mpconfigboard.mk create mode 100644 ports/espressif/boards/ohararp_esp32b/pins.c create mode 100644 ports/espressif/boards/ohararp_esp32b/sdkconfig diff --git a/ports/espressif/boards/ohararp_esp32b/board.c b/ports/espressif/boards/ohararp_esp32b/board.c new file mode 100644 index 0000000000000..356f60b424c0e --- /dev/null +++ b/ports/espressif/boards/ohararp_esp32b/board.c @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2025 OHARARP LLC +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" +#include "mpconfigboard.h" +#include "shared-bindings/microcontroller/Pin.h" + +void board_init(void) { +} diff --git a/ports/espressif/boards/ohararp_esp32b/mpconfigboard.h b/ports/espressif/boards/ohararp_esp32b/mpconfigboard.h new file mode 100644 index 0000000000000..2c67373b46600 --- /dev/null +++ b/ports/espressif/boards/ohararp_esp32b/mpconfigboard.h @@ -0,0 +1,30 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2025 OHARARP LLC +// SPDX-License-Identifier: MIT + +#pragma once + +#define MICROPY_HW_BOARD_NAME "OHARARP ESP32-B" +#define MICROPY_HW_MCU_NAME "ESP32-S3" + +// USB configuration +#define MICROPY_HW_USB_VID 0x303A +#define MICROPY_HW_USB_PID 0x8249 + +// NeoPixel +#define MICROPY_HW_NEOPIXEL (&pin_GPIO48) + +// Status LED +#define MICROPY_HW_LED (&pin_GPIO21) +#define MICROPY_HW_LED_STATUS (&pin_GPIO21) + +// Default bus pins +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO9) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO8) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO12) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO11) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO13) + +#define DEFAULT_UART_BUS_TX (&pin_GPIO43) +#define DEFAULT_UART_BUS_RX (&pin_GPIO44) diff --git a/ports/espressif/boards/ohararp_esp32b/mpconfigboard.mk b/ports/espressif/boards/ohararp_esp32b/mpconfigboard.mk new file mode 100644 index 0000000000000..5dd5c7b2765ad --- /dev/null +++ b/ports/espressif/boards/ohararp_esp32b/mpconfigboard.mk @@ -0,0 +1,16 @@ +USB_VID = 0x303A +USB_PID = 0x8249 +USB_PRODUCT = "ESP32-B" +USB_MANUFACTURER = "OHARARP LLC" + +IDF_TARGET = esp32s3 + +CIRCUITPY_ESP_FLASH_SIZE = 16MB +CIRCUITPY_ESP_FLASH_MODE = qio +CIRCUITPY_ESP_FLASH_FREQ = 80m + +CIRCUITPY_ESP_PSRAM_SIZE = 8MB +CIRCUITPY_ESP_PSRAM_MODE = opi +CIRCUITPY_ESP_PSRAM_FREQ = 80m + +CIRCUITPY_NEOPIXEL_WRITE = 1 diff --git a/ports/espressif/boards/ohararp_esp32b/pins.c b/ports/espressif/boards/ohararp_esp32b/pins.c new file mode 100644 index 0000000000000..69ba7822cf7ca --- /dev/null +++ b/ports/espressif/boards/ohararp_esp32b/pins.c @@ -0,0 +1,64 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// SPDX-FileCopyrightText: Copyright (c) 2025 OHARARP LLC +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +STATIC const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + // Analog pins (accent Feather pinout) + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_GPIO7) }, + + // Digital pins (Feather pinout) + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO39) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO47) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO18) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO14) }, + + // UART + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) }, + + // I2C + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO8) }, + + // SPI + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO12) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO13) }, + + // SD card + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_SD_CD), MP_ROM_PTR(&pin_GPIO38) }, + + // RTC interrupt + { MP_ROM_QSTR(MP_QSTR_RTC_INT), MP_ROM_PTR(&pin_GPIO17) }, + + // NeoPixel + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO48) }, + + // Status LED + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO21) }, + { MP_ROM_QSTR(MP_QSTR_STATUS_LED), MP_ROM_PTR(&pin_GPIO21) }, + + // User buttons + { MP_ROM_QSTR(MP_QSTR_BUTTON_A), MP_ROM_PTR(&pin_GPIO41) }, + { MP_ROM_QSTR(MP_QSTR_BUTTON_B), MP_ROM_PTR(&pin_GPIO42) }, + { MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_GPIO0) }, + + // I2C, SPI, UART bus objects + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); diff --git a/ports/espressif/boards/ohararp_esp32b/sdkconfig b/ports/espressif/boards/ohararp_esp32b/sdkconfig new file mode 100644 index 0000000000000..e37bb64b278b1 --- /dev/null +++ b/ports/espressif/boards/ohararp_esp32b/sdkconfig @@ -0,0 +1,17 @@ +CONFIG_ESP32S3_SPIRAM_SUPPORT=y + +CONFIG_SPIRAM_MODE_OCT=y +CONFIG_SPIRAM_TYPE_AUTO=y +CONFIG_DEFAULT_PSRAM_CLK_IO=30 +CONFIG_DEFAULT_PSRAM_CS_IO=26 +CONFIG_SPIRAM_SPEED_80M=y + +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y +CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 + +CONFIG_ESP32S3_DATA_CACHE_64KB=y +CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y + +# USB CDC on native USB pins (IO19/IO20) +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=n +CONFIG_ESP_CONSOLE_USB_CDC=y From d053e365411a057cc53eb8a0904a03cb9ad26a72 Mon Sep 17 00:00:00 2001 From: ohararp Date: Sat, 31 Jan 2026 16:17:00 -0500 Subject: [PATCH 2/2] Fix pins.c: replace deprecated STATIC with static The STATIC macro was removed in CircuitPython 10.x. Use plain `static` to fix the CI build error. Co-Authored-By: Claude Opus 4.5 --- ports/espressif/boards/ohararp_esp32b/pins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/boards/ohararp_esp32b/pins.c b/ports/espressif/boards/ohararp_esp32b/pins.c index 69ba7822cf7ca..dc30246e2cfad 100644 --- a/ports/espressif/boards/ohararp_esp32b/pins.c +++ b/ports/espressif/boards/ohararp_esp32b/pins.c @@ -4,7 +4,7 @@ #include "shared-bindings/board/__init__.h" -STATIC const mp_rom_map_elem_t board_module_globals_table[] = { +static const mp_rom_map_elem_t board_module_globals_table[] = { CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS // Analog pins (accent Feather pinout)