Procházet zdrojové kódy

fix #139, correct usbd request intepreting, Non-STD request to Interface must be forward to class driver

hathach před 6 roky
rodič
revize
c3598f0301
1 změnil soubory, kde provedl 31 přidání a 20 odebrání
  1. 31 20
      src/device/usbd.c

+ 31 - 20
src/device/usbd.c

@@ -439,33 +439,44 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
 
       TU_VERIFY(drvid < USBD_CLASS_DRIVER_COUNT);
 
-      switch ( p_request->bRequest )
+      if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
       {
-        case TUSB_REQ_GET_INTERFACE:
+        switch ( p_request->bRequest )
         {
-          // TODO not support alternate interface yet
-          uint8_t alternate = 0;
-          tud_control_xfer(rhport, p_request, &alternate, 1);
-        }
-        break;
+          case TUSB_REQ_GET_INTERFACE:
+          {
+            // TODO not support alternate interface yet
+            uint8_t alternate = 0;
+            tud_control_xfer(rhport, p_request, &alternate, 1);
+          }
+          break;
 
-        case TUSB_REQ_SET_INTERFACE:
-        {
-          uint8_t alternate = (uint8_t) p_request->wValue;
+          case TUSB_REQ_SET_INTERFACE:
+          {
+            uint8_t const alternate = (uint8_t) p_request->wValue;
 
-          // TODO not support alternate interface yet
-          TU_ASSERT(alternate == 0);
+            // TODO not support alternate interface yet
+            TU_ASSERT(alternate == 0);
+            tud_control_status(rhport, p_request);
+          }
+          break;
 
-          tud_control_status(rhport, p_request);
+          default:
+            // forward to class driver: "STD request to Interface"
+            // GET HID REPORT DESCRIPTOR falls into this case
+            usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
+
+            // stall control endpoint if driver return false
+            TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request));
+          break;
         }
-        break;
+      }else
+      {
+        // forward to class driver: "non-STD request to Interface"
+        usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
 
-        default:
-          // forward to class driver
-          // stall control endpoint if driver return false
-          usbd_control_set_complete_callback(usbd_class_drivers[drvid].control_complete);
-          TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request));
-        break;
+        // stall control endpoint if driver return false
+        TU_ASSERT(usbd_class_drivers[drvid].control_request(rhport, p_request));
       }
     }
     break;