Skip to content

Commit

Permalink
Allow using thirdparty VID for reboot interface (#177)
Browse files Browse the repository at this point in the history
With this change you can reboot a device with third party VID/PID from application firmware into bootloader with:

```
picotool reboot --vid 0x32ac --pid 0x001f -f -u
```

Signed-off-by: Daniel Schaefer <dhs@frame.work>
  • Loading branch information
JohnAZoidberg authored Nov 20, 2024
1 parent 877282d commit 2f2e8df
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 0 deletions.
1 change: 1 addition & 0 deletions picoboot_connection/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ cc_library(
"@pico-sdk//src/common/boot_picoboot_headers",
"@pico-sdk//src/rp2_common/boot_bootrom_headers",
"@pico-sdk//src/rp2_common/pico_bootrom:pico_bootrom_headers",
"@pico-sdk//src/rp2_common/pico_stdio_usb:reset_interface_headers",
],
)
12 changes: 12 additions & 0 deletions picoboot_connection/picoboot_connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include "picoboot_connection.h"
#include "boot/bootrom_constants.h"
#include "pico/stdio_usb/reset_interface.h"

#if ENABLE_DEBUG_LOG
#include <stdio.h>
Expand Down Expand Up @@ -142,6 +143,17 @@ enum picoboot_device_result picoboot_open_device(libusb_device *device, libusb_d
}
}

// Runtime reset interface with thirdparty VID
if (!ret) {
for (int i = 0; i < config->bNumInterfaces; i++) {
if (config->interface[i].altsetting[0].bInterfaceClass == 0xff &&
config->interface[i].altsetting[0].bInterfaceSubClass == RESET_INTERFACE_SUBCLASS &&
config->interface[i].altsetting[0].bInterfaceProtocol == RESET_INTERFACE_PROTOCOL) {
return dr_vidpid_stdio_usb;
}
}
}

if (!ret) {
if (config->bNumInterfaces == 1) {
interface = 0;
Expand Down

0 comments on commit 2f2e8df

Please sign in to comment.