Skip to content

Commit 52377b4

Browse files
authored
Merge pull request #10703 from tannewt/mipidsi
Add `mipidsi` module for MIPI DSI displays
2 parents 5c2d12b + 292d209 commit 52377b4

File tree

35 files changed

+1197
-51
lines changed

35 files changed

+1197
-51
lines changed

locale/circuitpython.pot

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,6 @@ msgstr ""
159159
msgid "%q length must be >= %d"
160160
msgstr ""
161161

162-
#: py/runtime.c
163-
msgid "%q moved from %q to %q"
164-
msgstr ""
165-
166162
#: py/argcheck.c
167163
msgid "%q must be %d"
168164
msgstr ""
@@ -838,6 +834,10 @@ msgstr ""
838834
msgid "Clock unit in use"
839835
msgstr ""
840836

837+
#: ports/espressif/common-hal/mipidsi/Display.c
838+
msgid "Color depth must be 16 or 24"
839+
msgstr ""
840+
841841
#: shared-bindings/_bleio/Connection.c
842842
msgid ""
843843
"Connection has been disconnected and can no longer be used. Create a new "
@@ -932,6 +932,7 @@ msgstr ""
932932
#: shared-bindings/busdisplay/BusDisplay.c
933933
#: shared-bindings/epaperdisplay/EPaperDisplay.c
934934
#: shared-bindings/framebufferio/FramebufferDisplay.c
935+
#: shared-bindings/mipidsi/Display.c
935936
msgid "Display rotation must be in 90 degree increments"
936937
msgstr ""
937938

@@ -1276,7 +1277,8 @@ msgstr ""
12761277
#: ports/raspberrypi/bindings/rp2pio/StateMachine.c
12771278
#: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c
12781279
#: shared-bindings/digitalio/DigitalInOut.c
1279-
#: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c
1280+
#: shared-bindings/epaperdisplay/EPaperDisplay.c
1281+
#: shared-bindings/mipidsi/Display.c shared-bindings/pwmio/PWMOut.c
12801282
#: shared-bindings/supervisor/__init__.c
12811283
#: shared-module/aurora_epaper/aurora_framebuffer.c
12821284
#: shared-module/lvfontio/OnDiskFont.c
@@ -2266,6 +2268,7 @@ msgid "Unable to allocate to the heap."
22662268
msgstr ""
22672269

22682270
#: ports/espressif/common-hal/busio/I2C.c
2271+
#: ports/espressif/common-hal/busio/SPI.c
22692272
msgid "Unable to create lock"
22702273
msgstr ""
22712274

@@ -3174,10 +3177,6 @@ msgstr ""
31743177
msgid "file write is not available"
31753178
msgstr ""
31763179

3177-
#: shared-bindings/storage/__init__.c
3178-
msgid "filesystem must provide mount method"
3179-
msgstr ""
3180-
31813180
#: extmod/ulab/code/numpy/vector.c
31823181
msgid "first argument must be a callable"
31833182
msgstr ""

ports/espressif/Makefile

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ INC += \
7676
-isystem esp-idf/components/esp_driver_uart/include \
7777
-isystem esp-idf/components/esp_event/include \
7878
-isystem esp-idf/components/esp_hw_support/dma/include \
79+
-isystem esp-idf/components/esp_hw_support/ldo/include \
7980
-isystem esp-idf/components/esp_hw_support/include \
8081
-isystem esp-idf/components/esp_hw_support/include/soc \
8182
-isystem esp-idf/components/esp_hw_support/port/$(IDF_TARGET)/private_include \
@@ -171,7 +172,8 @@ REGISTRATION_FUNCTIONS = \
171172
-u esp_libc_init_funcs \
172173
-u include_esp_phy_override \
173174
-u vfs_include_syscalls_impl \
174-
-u esp_vfs_include_nullfs_register
175+
-u esp_vfs_include_nullfs_register \
176+
-u usb_serial_jtag_vfs_include_dev_init
175177

176178

177179
#Debugging/Optimization
@@ -329,7 +331,8 @@ LDFLAGS += \
329331

330332

331333
CHIP_COMPONENTS = \
332-
esp_driver_tsens
334+
esp_driver_tsens \
335+
esp_driver_usb_serial_jtag
333336

334337
else ifeq ($(IDF_TARGET),esp32h2)
335338
LDFLAGS += \
@@ -467,6 +470,13 @@ CFLAGS += \
467470
-isystem esp-idf/components/esp_lcd/rgb/include
468471
endif
469472

473+
ifneq ($(CIRCUITPY_MIPIDSI),0)
474+
CFLAGS += \
475+
-isystem esp-idf/components/esp_lcd/include \
476+
-isystem esp-idf/components/esp_lcd/interface \
477+
-isystem esp-idf/components/esp_lcd/dsi/include
478+
endif
479+
470480
ifneq ($(CIRCUITPY_ESPCAMERA),0)
471481
SRC_CAMERA := \
472482
$(wildcard common-hal/espcamera/*.c) \
@@ -757,6 +767,9 @@ endif
757767
ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0)
758768
ESP_IDF_COMPONENTS_LINK += esp_lcd
759769
endif
770+
ifneq ($(CIRCUITPY_MIPIDSI),0)
771+
ESP_IDF_COMPONENTS_LINK += esp_lcd
772+
endif
760773
ifneq ($(CIRCUITPY_PARALLELDISPLAYBUS),0)
761774
ESP_IDF_COMPONENTS_LINK += esp_lcd
762775
endif

ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is part of the CircuitPython project: https://circuitpython.org
22
//
3-
// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries
44
//
55
// SPDX-License-Identifier: MIT
66

@@ -16,5 +16,10 @@
1616
#define DEFAULT_UART_BUS_RX (&pin_GPIO38)
1717
#define DEFAULT_UART_BUS_TX (&pin_GPIO37)
1818

19+
#define DEFAULT_I2C_BUS_SCL (&pin_GPIO8)
20+
#define DEFAULT_I2C_BUS_SDA (&pin_GPIO7)
21+
1922
// Use the second USB device (numbered 0 and 1)
2023
#define CIRCUITPY_USB_DEVICE_INSTANCE 1
24+
25+
#define CIRCUITPY_USB_HOST_INSTANCE 0
Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// This file is part of the CircuitPython project: https://circuitpython.org
22
//
3-
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries
44
//
55
// SPDX-License-Identifier: MIT
66

@@ -9,47 +9,82 @@
99
static const mp_rom_map_elem_t board_module_globals_table[] = {
1010
CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS
1111

12-
{ MP_ROM_QSTR(MP_QSTR_IO0), MP_ROM_PTR(&pin_GPIO0) },
13-
{ MP_ROM_QSTR(MP_QSTR_IO1), MP_ROM_PTR(&pin_GPIO1) },
14-
{ MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) },
15-
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
16-
{ MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) },
17-
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
18-
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
12+
// Header Block J1
13+
{ MP_ROM_QSTR(MP_QSTR_I2C_SDA), MP_ROM_PTR(&pin_GPIO7) },
1914
{ MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) },
15+
16+
{ MP_ROM_QSTR(MP_QSTR_I2C_SCL), MP_ROM_PTR(&pin_GPIO8) },
2017
{ MP_ROM_QSTR(MP_QSTR_IO8), MP_ROM_PTR(&pin_GPIO8) },
21-
{ MP_ROM_QSTR(MP_QSTR_IO9), MP_ROM_PTR(&pin_GPIO9) },
22-
{ MP_ROM_QSTR(MP_QSTR_IO10), MP_ROM_PTR(&pin_GPIO10) },
23-
{ MP_ROM_QSTR(MP_QSTR_IO11), MP_ROM_PTR(&pin_GPIO11) },
24-
{ MP_ROM_QSTR(MP_QSTR_IO12), MP_ROM_PTR(&pin_GPIO12) },
25-
{ MP_ROM_QSTR(MP_QSTR_IO13), MP_ROM_PTR(&pin_GPIO13) },
26-
{ MP_ROM_QSTR(MP_QSTR_IO14), MP_ROM_PTR(&pin_GPIO14) },
27-
{ MP_ROM_QSTR(MP_QSTR_IO15), MP_ROM_PTR(&pin_GPIO15) },
28-
{ MP_ROM_QSTR(MP_QSTR_IO16), MP_ROM_PTR(&pin_GPIO16) },
29-
{ MP_ROM_QSTR(MP_QSTR_IO17), MP_ROM_PTR(&pin_GPIO17) },
30-
{ MP_ROM_QSTR(MP_QSTR_IO18), MP_ROM_PTR(&pin_GPIO18) },
31-
{ MP_ROM_QSTR(MP_QSTR_IO19), MP_ROM_PTR(&pin_GPIO19) },
32-
{ MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) },
33-
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) },
34-
{ MP_ROM_QSTR(MP_QSTR_IO35), MP_ROM_PTR(&pin_GPIO35) },
35-
{ MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) },
18+
19+
{ MP_ROM_QSTR(MP_QSTR_IO23), MP_ROM_PTR(&pin_GPIO23) },
20+
21+
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO37) },
3622
{ MP_ROM_QSTR(MP_QSTR_IO37), MP_ROM_PTR(&pin_GPIO37) },
23+
24+
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO38) },
3725
{ MP_ROM_QSTR(MP_QSTR_IO38), MP_ROM_PTR(&pin_GPIO38) },
38-
{ MP_ROM_QSTR(MP_QSTR_IO39), MP_ROM_PTR(&pin_GPIO39) },
39-
{ MP_ROM_QSTR(MP_QSTR_IO40), MP_ROM_PTR(&pin_GPIO40) },
40-
{ MP_ROM_QSTR(MP_QSTR_IO41), MP_ROM_PTR(&pin_GPIO41) },
41-
{ MP_ROM_QSTR(MP_QSTR_IO42), MP_ROM_PTR(&pin_GPIO42) },
42-
{ MP_ROM_QSTR(MP_QSTR_IO43), MP_ROM_PTR(&pin_GPIO43) },
43-
{ MP_ROM_QSTR(MP_QSTR_IO44), MP_ROM_PTR(&pin_GPIO44) },
44-
{ MP_ROM_QSTR(MP_QSTR_IO45), MP_ROM_PTR(&pin_GPIO45) },
26+
27+
{ MP_ROM_QSTR(MP_QSTR_IO21), MP_ROM_PTR(&pin_GPIO21) },
28+
{ MP_ROM_QSTR(MP_QSTR_IO22), MP_ROM_PTR(&pin_GPIO22) },
29+
{ MP_ROM_QSTR(MP_QSTR_IO20), MP_ROM_PTR(&pin_GPIO20) },
30+
31+
{ MP_ROM_QSTR(MP_QSTR_C6_WAKEUP), MP_ROM_PTR(&pin_GPIO6) },
32+
{ MP_ROM_QSTR(MP_QSTR_IO6), MP_ROM_PTR(&pin_GPIO6) },
33+
34+
{ MP_ROM_QSTR(MP_QSTR_IO5), MP_ROM_PTR(&pin_GPIO5) },
35+
{ MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) },
36+
{ MP_ROM_QSTR(MP_QSTR_IO3), MP_ROM_PTR(&pin_GPIO3) },
37+
{ MP_ROM_QSTR(MP_QSTR_IO2), MP_ROM_PTR(&pin_GPIO2) },
38+
{ MP_ROM_QSTR(MP_QSTR_IO36), MP_ROM_PTR(&pin_GPIO36) },
39+
40+
{ MP_ROM_QSTR(MP_QSTR_IO32), MP_ROM_PTR(&pin_GPIO32) },
41+
{ MP_ROM_QSTR(MP_QSTR_IO24), MP_ROM_PTR(&pin_GPIO24) },
42+
{ MP_ROM_QSTR(MP_QSTR_IO25), MP_ROM_PTR(&pin_GPIO25) },
43+
44+
{ MP_ROM_QSTR(MP_QSTR_IO33), MP_ROM_PTR(&pin_GPIO33) },
45+
{ MP_ROM_QSTR(MP_QSTR_IO26), MP_ROM_PTR(&pin_GPIO26) },
46+
47+
{ MP_ROM_QSTR(MP_QSTR_C6_EN), MP_ROM_PTR(&pin_GPIO54) },
48+
{ MP_ROM_QSTR(MP_QSTR_IO54), MP_ROM_PTR(&pin_GPIO54) },
49+
50+
{ MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) },
51+
52+
{ MP_ROM_QSTR(MP_QSTR_PA_CTRL), MP_ROM_PTR(&pin_GPIO53) },
53+
{ MP_ROM_QSTR(MP_QSTR_IO53), MP_ROM_PTR(&pin_GPIO53) },
54+
4555
{ MP_ROM_QSTR(MP_QSTR_IO46), MP_ROM_PTR(&pin_GPIO46) },
4656
{ MP_ROM_QSTR(MP_QSTR_IO47), MP_ROM_PTR(&pin_GPIO47) },
47-
{ MP_ROM_QSTR(MP_QSTR_IO48), MP_ROM_PTR(&pin_GPIO48) },
48-
{ MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO48) },
57+
{ MP_ROM_QSTR(MP_QSTR_IO27), MP_ROM_PTR(&pin_GPIO27) },
58+
59+
// I2S
60+
{ MP_ROM_QSTR(MP_QSTR_I2S_DSDIN), MP_ROM_PTR(&pin_GPIO9) },
61+
{ MP_ROM_QSTR(MP_QSTR_I2S_LRCK), MP_ROM_PTR(&pin_GPIO10) },
62+
{ MP_ROM_QSTR(MP_QSTR_I2S_ASDOUT), MP_ROM_PTR(&pin_GPIO11) },
63+
{ MP_ROM_QSTR(MP_QSTR_I2S_SCLK), MP_ROM_PTR(&pin_GPIO12) },
64+
{ MP_ROM_QSTR(MP_QSTR_I2S_MCLK), MP_ROM_PTR(&pin_GPIO13) },
65+
66+
// Ethernet
67+
{ MP_ROM_QSTR(MP_QSTR_RMII_RXDV), MP_ROM_PTR(&pin_GPIO28) },
68+
{ MP_ROM_QSTR(MP_QSTR_RMII_RXD0), MP_ROM_PTR(&pin_GPIO29) },
69+
{ MP_ROM_QSTR(MP_QSTR_RMII_RXD1), MP_ROM_PTR(&pin_GPIO30) },
70+
{ MP_ROM_QSTR(MP_QSTR_MDC), MP_ROM_PTR(&pin_GPIO31) },
71+
{ MP_ROM_QSTR(MP_QSTR_RMII_TXD0), MP_ROM_PTR(&pin_GPIO34) },
72+
{ MP_ROM_QSTR(MP_QSTR_RMII_TXD1), MP_ROM_PTR(&pin_GPIO35) },
73+
{ MP_ROM_QSTR(MP_QSTR_RMII_TXEN), MP_ROM_PTR(&pin_GPIO49) },
74+
{ MP_ROM_QSTR(MP_QSTR_RMII_CLK), MP_ROM_PTR(&pin_GPIO50) },
75+
{ MP_ROM_QSTR(MP_QSTR_PHY_RSTN), MP_ROM_PTR(&pin_GPIO51) },
76+
{ MP_ROM_QSTR(MP_QSTR_MDIO), MP_ROM_PTR(&pin_GPIO52) },
4977

50-
{ MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO43) },
51-
{ MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO44) },
78+
// SD Card
79+
{ MP_ROM_QSTR(MP_QSTR_SD_DATA0), MP_ROM_PTR(&pin_GPIO39) },
80+
{ MP_ROM_QSTR(MP_QSTR_SD_DATA1), MP_ROM_PTR(&pin_GPIO40) },
81+
{ MP_ROM_QSTR(MP_QSTR_SD_DATA2), MP_ROM_PTR(&pin_GPIO41) },
82+
{ MP_ROM_QSTR(MP_QSTR_SD_DATA3), MP_ROM_PTR(&pin_GPIO42) },
83+
{ MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO43) },
84+
{ MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO44) },
85+
{ MP_ROM_QSTR(MP_QSTR_SD_PWRN), MP_ROM_PTR(&pin_GPIO45) },
5286

87+
{ MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) },
5388
{ MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) },
5489
};
5590
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "supervisor/board.h"
8+
9+
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2019 Scott Shawcroft for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
// Micropython setup
10+
11+
#define MICROPY_HW_BOARD_NAME "M5Stack Tab5"
12+
#define MICROPY_HW_MCU_NAME "ESP32P4"
13+
14+
// I2C bus for touch, IMU, RTC, power monitor, and GPIO expanders
15+
#define CIRCUITPY_BOARD_I2C (1)
16+
#define CIRCUITPY_BOARD_I2C_PIN {{.scl = &pin_GPIO32, .sda = &pin_GPIO31}}
17+
18+
// UART
19+
#define DEFAULT_UART_BUS_RX (&pin_GPIO38)
20+
#define DEFAULT_UART_BUS_TX (&pin_GPIO37)
21+
22+
// SPI on M5-Bus
23+
#define DEFAULT_SPI_BUS_SCK (&pin_GPIO5)
24+
#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO18)
25+
#define DEFAULT_SPI_BUS_MISO (&pin_GPIO19)
26+
27+
// Use the second USB device (numbered 0 and 1)
28+
#define CIRCUITPY_USB_DEVICE_INSTANCE 1
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
USB_VID = 0x303A
2+
USB_PID = 0x832B
3+
USB_PRODUCT = "M5Stack Tab5"
4+
USB_MANUFACTURER = "M5Stack"
5+
6+
IDF_TARGET = esp32p4
7+
8+
CIRCUITPY_ESP_FLASH_SIZE = 16MB
9+
CIRCUITPY_ESP_FLASH_MODE = qio
10+
CIRCUITPY_ESP_FLASH_FREQ = 80m
11+
12+
CIRCUITPY_ESP_PSRAM_SIZE = 32MB
13+
CIRCUITPY_ESP_PSRAM_MODE = hpi
14+
CIRCUITPY_ESP_PSRAM_FREQ = 200m

0 commit comments

Comments
 (0)