@@ -69,7 +69,7 @@ enum picoboot_device_result picoboot_open_device(libusb_device *device, libusb_d
69
69
int ret = libusb_get_device_descriptor (device , & desc );
70
70
enum picoboot_device_result res = dr_vidpid_unknown ;
71
71
if (ret && verbose ) {
72
- output ("Failed to read device descriptor\n" );
72
+ output ("Failed to read device descriptor %s \n" , libusb_error_name ( ret ) );
73
73
}
74
74
if (!ret ) {
75
75
if (pid >= 0 ) {
@@ -107,14 +107,14 @@ enum picoboot_device_result picoboot_open_device(libusb_device *device, libusb_d
107
107
}
108
108
ret = libusb_get_active_config_descriptor (device , & config );
109
109
if (ret && verbose ) {
110
- output ("Failed to read config descriptor\n" );
110
+ output ("Failed to read config descriptor %s \n" , libusb_error_name ( ret ) );
111
111
}
112
112
}
113
113
114
114
if (!ret ) {
115
115
ret = libusb_open (device , dev_handle );
116
116
if (ret && verbose ) {
117
- output ("Failed to open device %d \n" , ret );
117
+ output ("Failed to open device %s \n" , libusb_error_name ( ret ) );
118
118
}
119
119
if (ret ) {
120
120
if (vid == 0 || strlen (ser ) != 0 ) {
@@ -169,7 +169,7 @@ enum picoboot_device_result picoboot_open_device(libusb_device *device, libusb_d
169
169
if (verbose ) output ("Found PICOBOOT interface\n" );
170
170
ret = libusb_claim_interface (* dev_handle , interface );
171
171
if (ret ) {
172
- if (verbose ) output ("Failed to claim interface\n" );
172
+ if (verbose ) output ("Failed to claim interface %s \n" , libusb_error_name ( ret ) );
173
173
return dr_vidpid_bootrom_no_interface ;
174
174
}
175
175
} else {
@@ -180,16 +180,22 @@ enum picoboot_device_result picoboot_open_device(libusb_device *device, libusb_d
180
180
181
181
if (!ret ) {
182
182
if (* model == unknown ) {
183
- struct picoboot_get_info_cmd info_cmd ;
184
- info_cmd .bType = PICOBOOT_GET_INFO_SYS ,
185
- info_cmd .dParams [0 ] = (uint32_t ) (SYS_INFO_CHIP_INFO );
186
- uint32_t word_buf [64 ];
187
- // RP2040 doesn't have this function, so returns non-zero
188
- int info_ret = picoboot_get_info (* dev_handle , & info_cmd , (uint8_t * )word_buf , sizeof (word_buf ));
189
- if (info_ret ) {
183
+ if (desc .idVendor == VENDOR_ID_RASPBERRY_PI && desc .idProduct == PRODUCT_ID_RP2040_USBBOOT ) {
184
+ // Set model based on bootrom vid/pid for RP2040, as it cannot be white-labelled
190
185
* model = rp2040 ;
191
186
} else {
192
- * model = rp2350 ;
187
+ // Otherwise check the chip info
188
+ struct picoboot_get_info_cmd info_cmd ;
189
+ info_cmd .bType = PICOBOOT_GET_INFO_SYS ,
190
+ info_cmd .dParams [0 ] = (uint32_t ) (SYS_INFO_CHIP_INFO );
191
+ uint32_t word_buf [64 ];
192
+ // RP2040 doesn't have this function, so returns non-zero
193
+ int info_ret = picoboot_get_info (* dev_handle , & info_cmd , (uint8_t * )word_buf , sizeof (word_buf ));
194
+ if (info_ret ) {
195
+ * model = rp2040 ;
196
+ } else {
197
+ * model = rp2350 ;
198
+ }
193
199
}
194
200
}
195
201
if (strlen (ser ) != 0 ) {
@@ -301,7 +307,7 @@ int picoboot_cmd(libusb_device_handle *usb_device, struct picoboot_cmd *cmd, uin
301
307
ret = libusb_bulk_transfer (usb_device , out_ep , (uint8_t * ) cmd , sizeof (struct picoboot_cmd ), & sent , 3000 );
302
308
303
309
if (ret != 0 || sent != sizeof (struct picoboot_cmd )) {
304
- output (" ...failed to send command %d \n" , ret );
310
+ output (" ...failed to send command %s \n" , libusb_error_name ( ret ) );
305
311
return ret ;
306
312
}
307
313
@@ -321,15 +327,15 @@ int picoboot_cmd(libusb_device_handle *usb_device, struct picoboot_cmd *cmd, uin
321
327
int received = 0 ;
322
328
ret = libusb_bulk_transfer (usb_device , in_ep , buffer , cmd -> dTransferLength , & received , timeout );
323
329
if (ret != 0 || received != (int ) cmd -> dTransferLength ) {
324
- output (" ...failed to receive data %d %d/%d\n" , ret , received , cmd -> dTransferLength );
330
+ output (" ...failed to receive data %s %d/%d\n" , libusb_error_name ( ret ) , received , cmd -> dTransferLength );
325
331
if (!ret ) ret = 1 ;
326
332
return ret ;
327
333
}
328
334
} else {
329
335
if (verbose ) output (" send %d...\n" , cmd -> dTransferLength );
330
336
ret = libusb_bulk_transfer (usb_device , out_ep , buffer , cmd -> dTransferLength , & sent , timeout );
331
337
if (ret != 0 || sent != (int ) cmd -> dTransferLength ) {
332
- output (" ...failed to send data %d %d/%d\n" , ret , sent , cmd -> dTransferLength );
338
+ output (" ...failed to send data %s %d/%d\n" , libusb_error_name ( ret ) , sent , cmd -> dTransferLength );
333
339
if (!ret ) ret = 1 ;
334
340
picoboot_cmd_status_verbose (usb_device , NULL , true);
335
341
return ret ;
0 commit comments