Просмотр исходного кода

Fix unintended control transfers in webserial example.

Ivo Popov 5 лет назад
Родитель
Сommit
ce7fb36337
1 измененных файлов с 39 добавлено и 44 удалено
  1. 39 44
      examples/device/webusb_serial/src/main.c

+ 39 - 44
examples/device/webusb_serial/src/main.c

@@ -151,52 +151,47 @@ bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_requ
   // nothing to with DATA & ACK stage
   if (stage != CONTROL_STAGE_SETUP ) return true;
 
-  switch (request->bRequest)
-  {
-    case VENDOR_REQUEST_WEBUSB:
-      // match vendor request in BOS descriptor
-      // Get landing page url
-      return tud_control_xfer(rhport, request, (void*) &desc_url, desc_url.bLength);
-
-    case VENDOR_REQUEST_MICROSOFT:
-      if ( request->wIndex == 7 )
-      {
-        // Get Microsoft OS 2.0 compatible descriptor
-        uint16_t total_len;
-        memcpy(&total_len, desc_ms_os_20+8, 2);
-
-        return tud_control_xfer(rhport, request, (void*) desc_ms_os_20, total_len);
-      }else
-      {
-        return false;
-      }
-
-    case 0x22:
-      // Webserial simulate the CDC_REQUEST_SET_CONTROL_LINE_STATE (0x22) to
-      // connect and disconnect.
-      web_serial_connected = (request->wValue != 0);
-
-      // Always lit LED if connected
-      if ( web_serial_connected )
-      {
-        board_led_write(true);
-        blink_interval_ms = BLINK_ALWAYS_ON;
-
-        tud_vendor_write_str("\r\nTinyUSB WebUSB device example\r\n");
-      }else
-      {
-        blink_interval_ms = BLINK_MOUNTED;
-      }
-
-      // response with status OK
-      return tud_control_status(rhport, request);
-
-    default:
-      // stall unknown request
-      return false;
+  if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR) {
+    switch (request->bRequest) {
+      case VENDOR_REQUEST_WEBUSB:
+        // match vendor request in BOS descriptor
+        // Get landing page url
+        return tud_control_xfer(rhport, request, (void*) &desc_url, desc_url.bLength);
+
+      case VENDOR_REQUEST_MICROSOFT:
+        if ( request->wIndex == 7 ) {
+          // Get Microsoft OS 2.0 compatible descriptor
+          uint16_t total_len;
+          memcpy(&total_len, desc_ms_os_20+8, 2);
+
+          return tud_control_xfer(rhport, request, (void*) desc_ms_os_20, total_len);
+        } else {
+          return false;
+        }
+    }
+  } else if (
+        request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&
+        request->bRequest == 0x22) {
+    // Webserial simulate the CDC_REQUEST_SET_CONTROL_LINE_STATE (0x22) to
+    // connect and disconnect.
+    web_serial_connected = (request->wValue != 0);
+
+    // Always lit LED if connected
+    if ( web_serial_connected ) {
+      board_led_write(true);
+      blink_interval_ms = BLINK_ALWAYS_ON;
+
+      tud_vendor_write_str("\r\nTinyUSB WebUSB device example\r\n");
+    } else {
+      blink_interval_ms = BLINK_MOUNTED;
+    }
+
+    // response with status OK
+    return tud_control_status(rhport, request);
   }
 
-  return true;
+  // stall unknown request
+  return false;
 }
 
 void webserial_task(void)