From 82d000417b437051ea05ac16145b9a35befc9372 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 27 Nov 2024 12:08:24 -0800 Subject: [PATCH 1/6] Enable USB on ESP32-P4 --- lib/tinyusb | 2 +- ports/espressif/Makefile | 5 ++++- .../mpconfigboard.h | 3 --- .../mpconfigboard.mk | 14 ++++++------- .../mpconfigboard.mk | 14 ++++++------- .../esp-idf-config/sdkconfig-esp32p4.defaults | 21 +++++++++++++++++++ ports/espressif/mpconfigport.h | 2 ++ ports/espressif/mpconfigport.mk | 11 +++++++--- ports/espressif/supervisor/usb.c | 7 +++++++ supervisor/shared/usb/tusb_config.h | 6 ++++++ 10 files changed, 63 insertions(+), 22 deletions(-) diff --git a/lib/tinyusb b/lib/tinyusb index 5217cee5de4cd..5bb90efd5ff59 160000 --- a/lib/tinyusb +++ b/lib/tinyusb @@ -1 +1 @@ -Subproject commit 5217cee5de4cd555018da90f9f1bcc87fb1c1d3a +Subproject commit 5bb90efd5ff59d3b1d67f3c9269ce1aa57a925a6 diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index ba522f099e85d..9a565a43dc040 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -95,6 +95,7 @@ INC += \ -isystem esp-idf/components/esp_hw_support/dma/include \ -isystem esp-idf/components/esp_hw_support/include \ -isystem esp-idf/components/esp_hw_support/include/soc \ + -isystem esp-idf/components/esp_mm/include \ -isystem esp-idf/components/esp_netif/include \ -isystem esp-idf/components/esp_partition/include \ -isystem esp-idf/components/esp_pm/include \ @@ -412,7 +413,9 @@ SRC_C += peripherals/touch.c endif ifneq ($(CIRCUITPY_USB_DEVICE),0) -SRC_C += lib/tinyusb/src/portable/espressif/esp32sx/dcd_esp32sx.c +SRC_C += \ + lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c \ + lib/tinyusb/src/portable/synopsys/dwc2/dwc2_common.c endif ifneq ($(CIRCUITPY_AUDIOBUSIO),0) diff --git a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h index 37ade1fc539af..b62439a319909 100644 --- a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h +++ b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.h @@ -15,6 +15,3 @@ #define DEFAULT_UART_BUS_RX (&pin_GPIO38) #define DEFAULT_UART_BUS_TX (&pin_GPIO37) - -#define CIRCUITPY_CONSOLE_UART_TX DEFAULT_UART_BUS_TX -#define CIRCUITPY_CONSOLE_UART_RX DEFAULT_UART_BUS_RX diff --git a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.mk b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.mk index 43ab506659e3c..247a1371192f8 100644 --- a/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.mk +++ b/ports/espressif/boards/espressif_esp32p4_function_ev/mpconfigboard.mk @@ -1,14 +1,14 @@ -# USB_VID = 0x303A -# USB_PID = 0x7003 -# USB_PRODUCT = "ESP32-P4-Function-EV" -# USB_MANUFACTURER = "Espressif" +USB_VID = 0x303A +USB_PID = 0x7013 +USB_PRODUCT = "ESP32-P4-Function-EV" +USB_MANUFACTURER = "Espressif" IDF_TARGET = esp32p4 CIRCUITPY_ESP_FLASH_SIZE = 16MB -CIRCUITPY_ESP_FLASH_MODE = opi +CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 32MB -CIRCUITPY_ESP_PSRAM_MODE = opi -CIRCUITPY_ESP_PSRAM_FREQ = 80m +CIRCUITPY_ESP_PSRAM_MODE = hpi +CIRCUITPY_ESP_PSRAM_FREQ = 200m diff --git a/ports/espressif/boards/solderparty_esp32p4_stamp_xl/mpconfigboard.mk b/ports/espressif/boards/solderparty_esp32p4_stamp_xl/mpconfigboard.mk index 7354998c96db3..ff633cbae2a9e 100644 --- a/ports/espressif/boards/solderparty_esp32p4_stamp_xl/mpconfigboard.mk +++ b/ports/espressif/boards/solderparty_esp32p4_stamp_xl/mpconfigboard.mk @@ -1,14 +1,14 @@ -# USB_VID = 0x303A -# USB_PID = 0x7003 -# USB_PRODUCT = "ESP32-P4 Stamp XL" -# USB_MANUFACTURER = "Solder Party" +USB_VID = 0x1209 +USB_PID = 0x0001 +USB_PRODUCT = "ESP32-P4 Stamp XL" +USB_MANUFACTURER = "Solder Party" IDF_TARGET = esp32p4 CIRCUITPY_ESP_FLASH_SIZE = 16MB -CIRCUITPY_ESP_FLASH_MODE = opi +CIRCUITPY_ESP_FLASH_MODE = qio CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_PSRAM_SIZE = 32MB -CIRCUITPY_ESP_PSRAM_MODE = opi -CIRCUITPY_ESP_PSRAM_FREQ = 80m +CIRCUITPY_ESP_PSRAM_MODE = hpi +CIRCUITPY_ESP_PSRAM_FREQ = 200m diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32p4.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32p4.defaults index e69de29bb2d1d..0806066e20bcc 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32p4.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32p4.defaults @@ -0,0 +1,21 @@ +# +# Espressif IoT Development Framework Configuration +# +# +# Component config +# +# +# Bluetooth +# +# CONFIG_BT_ENABLED is not set +# end of Bluetooth + +# +# mbedTLS +# +# CONFIG_MBEDTLS_CMAC_C is not set +# end of mbedTLS + +# end of Component config + +# end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/mpconfigport.h b/ports/espressif/mpconfigport.h index 98c1986240b73..81c799b79bb9a 100644 --- a/ports/espressif/mpconfigport.h +++ b/ports/espressif/mpconfigport.h @@ -17,6 +17,8 @@ #define CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY (1) +#define CIRCUITPY_USB_DEVICE_INSTANCE 1 + #include "py/circuitpy_mpconfig.h" #define MICROPY_NLR_SETJMP (1) diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index 7f4b7600e364f..8f0bacb37b5db 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -196,9 +196,14 @@ CIRCUITPY_SSL = 0 CIRCUITPY_TOUCHIO = 1 CIRCUITPY_TOUCHIO_USE_NATIVE = 0 -# TinyUSB doesn't have it upstreamed -# https://github.com/hathach/tinyusb/issues/2791 -CIRCUITPY_USB_DEVICE = 0 +# Second stage bootloader doesn't work when the factory partition is empty due to +# UF2 missing. +UF2_BOOTLOADER = 0 +USB_HIGHSPEED = 1 +CIRCUITPY_USB_HID = 0 +CIRCUITPY_USB_MIDI = 0 +CIRCUITPY_TUSB_MEM_ALIGN = 64 + CIRCUITPY_MAX3421E = 0 # Update this for the 40mhz processor. diff --git a/ports/espressif/supervisor/usb.c b/ports/espressif/supervisor/usb.c index 3cd070e7c5d2b..ead4db725f48e 100644 --- a/ports/espressif/supervisor/usb.c +++ b/ports/espressif/supervisor/usb.c @@ -94,7 +94,14 @@ void init_usb_hardware(void) { // Configure USB PHY usb_phy_config_t phy_conf = { .controller = USB_PHY_CTRL_OTG, + .target = USB_PHY_TARGET_INT, + .otg_mode = USB_OTG_MODE_DEVICE, + #ifdef CONFIG_IDF_TARGET_ESP32P4 + .otg_speed = USB_PHY_SPEED_HIGH, + #else + .otg_speed = USB_PHY_SPEED_FULL, + #endif }; usb_new_phy(&phy_conf, &phy_hdl); diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h index a3ac3e3237d09..8f198e8c0af72 100644 --- a/supervisor/shared/usb/tusb_config.h +++ b/supervisor/shared/usb/tusb_config.h @@ -89,6 +89,12 @@ extern "C" { #endif #endif +// Use DMA with the USB peripheral. +#ifdef CONFIG_IDF_TARGET_ESP32P4 +#define CFG_TUD_DWC2_DMA_ENABLE (1) +#define CFG_TUH_DWC2_DMA_ENABLE (1) +#endif + // Vendor name included in Inquiry response, max 8 bytes #define CFG_TUD_MSC_VENDOR USB_MANUFACTURER_8 From 91ecb6c04b99713fa51f59582b80c4341ec52051 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Mon, 2 Dec 2024 12:37:15 -0800 Subject: [PATCH 2/6] Fix many builds * DWC common has been factored out. * New time API to implement. --- ports/broadcom/Makefile | 1 + ports/stm/Makefile | 4 +++- supervisor/shared/usb/tusb_config.h | 2 +- supervisor/shared/usb/usb.c | 5 +++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ports/broadcom/Makefile b/ports/broadcom/Makefile index 56c8c3237443e..d49ac82189d4d 100644 --- a/ports/broadcom/Makefile +++ b/ports/broadcom/Makefile @@ -48,6 +48,7 @@ SRC_C += bindings/videocore/__init__.c \ lib/sdmmc/sdmmc_mmc.c \ lib/sdmmc/sdmmc_sd.c \ lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c \ + lib/tinyusb/src/portable/synopsys/dwc2/dwc2_common.c \ peripherals/broadcom/caches.c \ peripherals/broadcom/gen/interrupt_handlers.c \ peripherals/broadcom/gen/pins.c \ diff --git a/ports/stm/Makefile b/ports/stm/Makefile index d42ebdc727612..04fde9bff9369 100755 --- a/ports/stm/Makefile +++ b/ports/stm/Makefile @@ -197,7 +197,9 @@ ifneq ($(CIRCUITPY_AUDIOBUSIO_PDMIN),0) endif ifneq ($(CIRCUITPY_USB),0) -SRC_C += lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c +SRC_C += \ + lib/tinyusb/src/portable/synopsys/dwc2/dcd_dwc2.c \ + lib/tinyusb/src/portable/synopsys/dwc2/dwc2_common.c endif SRC_S = \ diff --git a/supervisor/shared/usb/tusb_config.h b/supervisor/shared/usb/tusb_config.h index 8f198e8c0af72..c7191ac1c5d37 100644 --- a/supervisor/shared/usb/tusb_config.h +++ b/supervisor/shared/usb/tusb_config.h @@ -90,7 +90,7 @@ extern "C" { #endif // Use DMA with the USB peripheral. -#ifdef CONFIG_IDF_TARGET_ESP32P4 +#if defined(CONFIG_IDF_TARGET_ESP32P4) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) #define CFG_TUD_DWC2_DMA_ENABLE (1) #define CFG_TUH_DWC2_DMA_ENABLE (1) #endif diff --git a/supervisor/shared/usb/usb.c b/supervisor/shared/usb/usb.c index b87cf78e903d8..e6a08d78661fb 100644 --- a/supervisor/shared/usb/usb.c +++ b/supervisor/shared/usb/usb.c @@ -7,6 +7,7 @@ #include "py/objstr.h" #include "supervisor/background_callback.h" #include "supervisor/linker.h" +#include "supervisor/shared/tick.h" #include "supervisor/usb.h" #include "shared/readline/readline.h" @@ -152,6 +153,10 @@ void usb_background(void) { } } +uint32_t tusb_time_millis_api(void) { + return supervisor_ticks_ms32(); +} + static background_callback_t usb_callback; static void usb_background_do(void *unused) { usb_background(); From 0485390f7e49e2d09b9675e3791fa95149924528 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 3 Dec 2024 10:17:31 -0800 Subject: [PATCH 3/6] Update TinyUSB --- lib/tinyusb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tinyusb b/lib/tinyusb index 5bb90efd5ff59..eabf68bd91546 160000 --- a/lib/tinyusb +++ b/lib/tinyusb @@ -1 +1 @@ -Subproject commit 5bb90efd5ff59d3b1d67f3c9269ce1aa57a925a6 +Subproject commit eabf68bd9154672821531c9139118a63076b9e9d From 46df242950082b5aab4d316c7e3335589ae72080 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 4 Dec 2024 14:06:57 -0800 Subject: [PATCH 4/6] Add new psram settings files --- ports/espressif/esp-idf-config/sdkconfig-psram-200m.defaults | 4 ++++ ports/espressif/esp-idf-config/sdkconfig-psram-hpi.defaults | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 ports/espressif/esp-idf-config/sdkconfig-psram-200m.defaults create mode 100644 ports/espressif/esp-idf-config/sdkconfig-psram-hpi.defaults diff --git a/ports/espressif/esp-idf-config/sdkconfig-psram-200m.defaults b/ports/espressif/esp-idf-config/sdkconfig-psram-200m.defaults new file mode 100644 index 0000000000000..8fdb028c734ed --- /dev/null +++ b/ports/espressif/esp-idf-config/sdkconfig-psram-200m.defaults @@ -0,0 +1,4 @@ +# For ESP32-P4 +CONFIG_SPIRAM_SPEED_200M=y +# CONFIG_SPIRAM_SPEED_20M is not set +CONFIG_SPIRAM_SPEED=200 diff --git a/ports/espressif/esp-idf-config/sdkconfig-psram-hpi.defaults b/ports/espressif/esp-idf-config/sdkconfig-psram-hpi.defaults new file mode 100644 index 0000000000000..4795ee78772a4 --- /dev/null +++ b/ports/espressif/esp-idf-config/sdkconfig-psram-hpi.defaults @@ -0,0 +1,3 @@ +# CONFIG_SPIRAM_MODE_QUAD is not set +# CONFIG_SPIRAM_MODE_OCT is not set +CONFIG_SPIRAM_MODE_HEX=y From b202dddc26f146e33828badfb2bb9ddba9ae0955 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 4 Dec 2024 14:24:48 -0800 Subject: [PATCH 5/6] shrink stm32f411ve_discovery --- ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk index e17fa4d1b7457..f34fac4047a72 100644 --- a/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk +++ b/ports/stm/boards/stm32f411ve_discovery/mpconfigboard.mk @@ -13,10 +13,12 @@ LD_COMMON = boards/common_default.ld LD_FILE = boards/STM32F411_fs.ld # Too big for the flash +CIRCUITPY_AESIO = 0 CIRCUITPY_AUDIOCORE = 0 CIRCUITPY_AUDIOPWMIO = 0 CIRCUITPY_BITMAPFILTER = 0 CIRCUITPY_BITMAPTOOLS = 0 CIRCUITPY_BLEIO_HCI = 0 +CIRCUITPY_CODEOP = 0 CIRCUITPY_MSGPACK = 0 CIRCUITPY_VECTORIO = 0 From 946198ee0b516129c7b86903fc79ea4f701a371d Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Thu, 5 Dec 2024 12:01:50 -0800 Subject: [PATCH 6/6] Fix P4 UF2 ID and memory layout --- ports/espressif/Makefile | 1 + ports/espressif/tools/build_memory_info.py | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 9a565a43dc040..cd9bf237f9e0b 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -769,6 +769,7 @@ endif UF2_FAMILY_ID_esp32s2 = 0xbfdd4eee UF2_FAMILY_ID_esp32s3 = 0xc47e5767 +UF2_FAMILY_ID_esp32p4 = 0x540ddf62 $(BUILD)/firmware.uf2: $(BUILD)/circuitpython-firmware.bin $(STEPECHO) "Create $@" diff --git a/ports/espressif/tools/build_memory_info.py b/ports/espressif/tools/build_memory_info.py index ba4b6db4cbce4..9a3c55501388e 100644 --- a/ports/espressif/tools/build_memory_info.py +++ b/ports/espressif/tools/build_memory_info.py @@ -40,11 +40,10 @@ ], "esp32p4": [ # Name, Start, Length - ("RTC Fast Memory", (0x600F_E000,), 8 * 1024), - ("RTC Slow Memory", (0x5000_0000,), 8 * 1024), - ("Internal SRAM 0", (0x4037_0000,), 32 * 1024), - ("Internal SRAM 1", (0x3FC8_0000, 0x4037_8000), 416 * 1024), - ("Internal SRAM 2", (0x3FCF_0000,), 64 * 1024), + ("HP RAM", (0x3010_0000,), 8 * 1024), + ("PSRAM", (0x4800_0000,), 64 * 1024 * 1024), + ("L2MEM", (0x4FF0_0000,), 768 * 1024), + ("LP RAM", (0x5010_8000,), 32 * 1024), ], "esp32c2": [ # Name, Start, Length