diff --git a/components/esp_rom/CMakeLists.txt b/components/esp_rom/CMakeLists.txt index f2fdb079d4..73e8e31894 100644 --- a/components/esp_rom/CMakeLists.txt +++ b/components/esp_rom/CMakeLists.txt @@ -295,5 +295,5 @@ else() # Regular app build endif() if(target STREQUAL "esp32s2") - target_sources(${COMPONENT_LIB} PRIVATE "esp32s2/usb_descriptors.c") + target_sources(${COMPONENT_LIB} PRIVATE "esp32s2/usb_patches.c") endif() diff --git a/components/esp_rom/esp32s2/usb_descriptors.c b/components/esp_rom/esp32s2/usb_patches.c similarity index 76% rename from components/esp_rom/esp32s2/usb_descriptors.c rename to components/esp_rom/esp32s2/usb_patches.c index 279930095d..978c9b1f78 100644 --- a/components/esp_rom/esp32s2/usb_descriptors.c +++ b/components/esp_rom/esp32s2/usb_patches.c @@ -65,3 +65,19 @@ void rom_usb_cdc_set_descriptor_patch(void) /* Override the pointer to descriptors structure */ rom_usb_curr_desc = &s_acm_usb_descriptors_override; } + +/* On ESP32-S2, ROM doesn't provide interfaces to clear usb_dev and usb_dw_ctrl structures. + * Starting from ESP32-S3, usb_dev_deinit and usb_dw_ctrl_deinit ROM functions are available. + * Here we implement the missing functionality for the ESP32-S2. + */ +void usb_dev_deinit(void) +{ + extern char rom_usb_dev, rom_usb_dev_end; + memset((void *) &rom_usb_dev, 0, &rom_usb_dev_end - &rom_usb_dev); +} + +void usb_dw_ctrl_deinit(void) +{ + extern char rom_usb_dw_ctrl, rom_usb_dw_ctrl_end; + memset((void *) &rom_usb_dw_ctrl, 0, &rom_usb_dw_ctrl_end - &rom_usb_dw_ctrl); +} diff --git a/components/esp_system/port/soc/esp32s2/usb_console.c b/components/esp_system/port/soc/esp32s2/usb_console.c index c2a5783ce9..c1875c2a44 100644 --- a/components/esp_system/port/soc/esp32s2/usb_console.c +++ b/components/esp_system/port/soc/esp32s2/usb_console.c @@ -232,12 +232,9 @@ void esp_usb_console_before_restart(void) */ static void esp_usb_console_rom_cleanup(void) { - extern char rom_usb_dev, rom_usb_dev_end; - extern char rom_usb_dw_ctrl, rom_usb_dw_ctrl_end; - + usb_dev_deinit(); + usb_dw_ctrl_deinit(); uart_acm_dev = NULL; - memset((void *) &rom_usb_dev, 0, &rom_usb_dev_end - &rom_usb_dev); - memset((void *) &rom_usb_dw_ctrl, 0, &rom_usb_dw_ctrl_end - &rom_usb_dw_ctrl); } esp_err_t esp_usb_console_init(void)