@@ -228,7 +228,7 @@ typedef struct TU_ATTR_PACKED {
228228static tinyusb_desc_webusb_url_t tinyusb_url_descriptor = {
229229 .bLength = 3 ,
230230 .bDescriptorType = 3 , // WEBUSB URL type
231- .bScheme = 1 , // URL Scheme Prefix: 0: "http://", 1: "https://", 255: ""
231+ .bScheme = 255 , // URL Scheme Prefix: 0: "http://", 1: "https://", 255: ""
232232 .url = ""
233233};
234234
@@ -317,12 +317,11 @@ uint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid)
317317 */
318318uint8_t const * tud_descriptor_bos_cb (void )
319319{
320- //log_d ("");
320+ //log_v ("");
321321 return tinyusb_bos_descriptor ;
322322}
323323
324- __attribute__ ((weak )) bool tinyusb_vendor_control_request_cb (uint8_t rhport , tusb_control_request_t const * request ){ return false; }
325- __attribute__ ((weak )) bool tinyusb_vendor_control_complete_cb (uint8_t rhport , tusb_control_request_t const * request ){ return true; }
324+ __attribute__ ((weak )) bool tinyusb_vendor_control_request_cb (uint8_t rhport , uint8_t stage , tusb_control_request_t const * request ){ return false; }
326325
327326/**
328327 * @brief Handle WebUSB and Vendor requests.
@@ -331,30 +330,26 @@ bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_requ
331330{
332331 if (WEBUSB_ENABLED && (request -> bRequest == VENDOR_REQUEST_WEBUSB
333332 || (request -> bRequest == VENDOR_REQUEST_MICROSOFT && request -> wIndex == 7 ))){
334- if (request -> bRequest == VENDOR_REQUEST_WEBUSB ){
335- // match vendor request in BOS descriptor
336- // Get landing page url
337- tinyusb_url_descriptor .bLength = 3 + strlen (WEBUSB_URL );
338- snprintf (tinyusb_url_descriptor .url , 127 , "%s" , WEBUSB_URL );
339- return tud_control_xfer (rhport , request , (void * ) & tinyusb_url_descriptor , tinyusb_url_descriptor .bLength );
333+ // we only care for SETUP stage
334+ if (stage == CONTROL_STAGE_SETUP ) {
335+ if (request -> bRequest == VENDOR_REQUEST_WEBUSB ){
336+ // match vendor request in BOS descriptor
337+ // Get landing page url
338+ tinyusb_url_descriptor .bLength = 3 + strlen (WEBUSB_URL );
339+ snprintf (tinyusb_url_descriptor .url , 127 , "%s" , WEBUSB_URL );
340+ return tud_control_xfer (rhport , request , (void * ) & tinyusb_url_descriptor , tinyusb_url_descriptor .bLength );
341+ }
342+ // Get Microsoft OS 2.0 compatible descriptor
343+ uint16_t total_len ;
344+ memcpy (& total_len , tinyusb_ms_os_20_descriptor + 8 , 2 );
345+ return tud_control_xfer (rhport , request , (void * ) tinyusb_ms_os_20_descriptor , total_len );
340346 }
341- // Get Microsoft OS 2.0 compatible descriptor
342- uint16_t total_len ;
343- memcpy (& total_len , tinyusb_ms_os_20_descriptor + 8 , 2 );
344- return tud_control_xfer (rhport , request , (void * ) tinyusb_ms_os_20_descriptor , total_len );
347+ return true;
345348 }
346- return tinyusb_vendor_control_request_cb (rhport , request );
349+ log_v ("rhport: %u, stage: %u, type: 0x%x, request: 0x%x" , rhport , stage , request -> bmRequestType_bit .type , request -> bRequest );
350+ return tinyusb_vendor_control_request_cb (rhport , stage , request );
347351}
348352
349- // bool tud_vendor_control_complete_cb(uint8_t rhport, tusb_control_request_t const * request)
350- // {
351- // if(!WEBUSB_ENABLED || !(request->bRequest == VENDOR_REQUEST_WEBUSB
352- // || (request->bRequest == VENDOR_REQUEST_MICROSOFT && request->wIndex == 7))){
353- // return tinyusb_vendor_control_complete_cb(rhport, request);
354- // }
355- // return true;
356- // }
357-
358353/*
359354 * Required Callbacks
360355 * */
@@ -537,6 +532,9 @@ static void IRAM_ATTR usb_persist_shutdown_handler(void)
537532 REG_WRITE (RTC_CNTL_OPTION1_REG , RTC_CNTL_FORCE_DOWNLOAD_BOOT );
538533 } else if (usb_persist_mode == RESTART_BOOTLOADER_DFU ) {
539534 //DFU Download
535+ // Reset USB Core
536+ USB0 .grstctl |= USB_CSFTRST ;
537+ while ((USB0 .grstctl & USB_CSFTRST ) == USB_CSFTRST ){}
540538 chip_usb_set_persist_flags (USBDC_BOOT_DFU );
541539 REG_WRITE (RTC_CNTL_OPTION1_REG , RTC_CNTL_FORCE_DOWNLOAD_BOOT );
542540 } else if (usb_persist_enabled ) {
0 commit comments