Skip to content

Commit a5b834b

Browse files
Fix picotool enabled USB descriptor (#3162)
The old picotool interface was being added over and over each time the USB reconnected, resulting in invalid descriptors and a hang. Make sure to remove the picotool interface on a disconnect to fix.
1 parent 41ee45c commit a5b834b

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

cores/rp2040/USB.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ void USBClass::setupUSBDescriptor() {
341341

342342
#ifdef ENABLE_PICOTOOL_USB
343343
uint8_t picotool_desc[] = { TUD_RPI_RESET_DESCRIPTOR(1, USB.registerString("Reset")) };
344-
USB.registerInterface(1, picotool_desc, sizeof(picotool_desc), 100, 0);
344+
_picotool_itf_num = USB.registerInterface(1, picotool_desc, sizeof(picotool_desc), 100, 0);
345345
#endif
346346

347347
usbd_desc_cfg_len = TUD_CONFIG_DESC_LEN; // Always have a config descriptor
@@ -470,6 +470,9 @@ void USBClass::disconnect() {
470470
free(_hid_report);
471471
_hid_report = nullptr;
472472
_hid_report_len = 0;
473+
#ifdef ENABLE_PICOTOOL_USB
474+
unregisterInterface(_picotool_itf_num);
475+
#endif
473476
}
474477

475478
void USBClass::connect() {
@@ -608,12 +611,14 @@ extern "C" void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t pr
608611

609612
#ifdef ENABLE_PICOTOOL_USB
610613

614+
static uint32_t _itf_num = 0;
615+
611616
static void resetd_init() {
612617
}
613618

614619
static void resetd_reset(uint8_t rhport) {
615620
(void) rhport;
616-
_picotool_itf_num = 0;
621+
_itf_num = 0;
617622
}
618623

619624
static uint16_t resetd_open(uint8_t rhport,
@@ -626,7 +631,7 @@ static uint16_t resetd_open(uint8_t rhport,
626631
uint16_t const drv_len = sizeof(tusb_desc_interface_t);
627632
TU_VERIFY(max_len >= drv_len, 0);
628633

629-
_picotool_itf_num = itf_desc->bInterfaceNumber;
634+
_itf_num = itf_desc->bInterfaceNumber;
630635
return drv_len;
631636
}
632637

@@ -639,7 +644,7 @@ static bool resetd_control_xfer_cb(uint8_t rhport, uint8_t stage,
639644
return true;
640645
}
641646

642-
if (request->wIndex == _picotool_itf_num) {
647+
if (request->wIndex == _itf_num) {
643648
if (request->bRequest == RESET_REQUEST_BOOTSEL) {
644649
reset_usb_boot(0, (request->wValue & 0x7f));
645650
// does not return, otherwise we'd return true

0 commit comments

Comments
 (0)