diff --git a/arch/arm/src/rp2040/rp2040_rom.h b/arch/arm/src/rp2040/rp2040_rom.h index 40eacb6ff22..8e89ac417d4 100644 --- a/arch/arm/src/rp2040/rp2040_rom.h +++ b/arch/arm/src/rp2040/rp2040_rom.h @@ -63,3 +63,5 @@ ****************************************************************************/ typedef void *(*rom_table_lookup_fn)(uint16_t *table, uint32_t code); +typedef void (*rom_reset_usb_boot_fn)(uint32_t usb_activity_gpio_pin_mask, + uint32_t disable_interface_mask); diff --git a/boards/arm/rp2040/common/src/rp2040_reset.c b/boards/arm/rp2040/common/src/rp2040_reset.c index e59d2d65d90..97f382be2e0 100644 --- a/boards/arm/rp2040/common/src/rp2040_reset.c +++ b/boards/arm/rp2040/common/src/rp2040_reset.c @@ -28,6 +28,10 @@ #include #include +#include + +#include "rp2040_rom.h" + #ifdef CONFIG_BOARDCTL_RESET /**************************************************************************** @@ -56,7 +60,18 @@ int board_reset(int status) { - up_systemreset(); + if (status == BOARDIOC_SOFTRESETCAUSE_ENTER_BOOTLOADER) + { + rom_reset_usb_boot_fn reset_usb_boot; + + reset_usb_boot = (rom_reset_usb_boot_fn)ROM_LOOKUP(ROM_RESET_USB_BOOT); + reset_usb_boot(0, 0); + } + else + { + up_systemreset(); + } + return 0; }