Sfoglia il codice sorgente

support multi winusb

sakimisu 2 anni fa
parent
commit
7061367484
3 ha cambiato i file con 31 aggiunte e 20 eliminazioni
  1. 1 4
      common/usb_def.h
  2. 29 12
      core/usbd_core.c
  3. 1 4
      demo/winusb1.0_template.c

+ 1 - 4
common/usb_def.h

@@ -485,12 +485,9 @@ struct usb_msosv1_comp_id_function_descriptor {
 
 struct usb_msosv1_descriptor {
     uint8_t *string;
-    uint8_t string_len;
     uint8_t vendor_code;
     uint8_t *compat_id;
-    uint16_t compat_id_len;
-    uint8_t *comp_id_property;
-    uint16_t comp_id_property_len;
+    uint8_t **comp_id_property;
 };
 
 /* MS OS 2.0 Header descriptor */

+ 29 - 12
core/usbd_core.c

@@ -288,8 +288,8 @@ static bool usbd_get_descriptor(uint16_t type_index, uint8_t **data, uint32_t *l
         }
 
         //*data = (uint8_t *)g_usbd_core.msosv1_desc->string;
-        memcpy(*data, (uint8_t *)g_usbd_core.msosv1_desc->string, g_usbd_core.msosv1_desc->string_len);
-        *len = g_usbd_core.msosv1_desc->string_len;
+        memcpy(*data, (uint8_t *)g_usbd_core.msosv1_desc->string, g_usbd_core.msosv1_desc->string[0]);
+        *len = g_usbd_core.msosv1_desc->string[0];
 
         return true;
     } else if (type == USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE) {
@@ -789,19 +789,30 @@ static int usbd_class_request_handler(struct usb_setup_packet *setup, uint8_t **
  */
 static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t **data, uint32_t *len)
 {
+    uint32_t desclen;
 #ifdef CONFIG_USBDEV_ADVANCE_DESC
     if (g_usbd_core.descriptors->msosv1_descriptor) {
         if (setup->bRequest == g_usbd_core.descriptors->msosv1_descriptor->vendor_code) {
             switch (setup->wIndex) {
                 case 0x04:
                     USB_LOG_INFO("get Compat ID\r\n");
+                    desclen = g_usbd_core.msosv1_desc->compat_id[0] +
+                              (g_usbd_core.msosv1_desc->compat_id[1] << 8) +
+                              (g_usbd_core.msosv1_desc->compat_id[2] << 16) +
+                              (g_usbd_core.msosv1_desc->compat_id[3] << 24);
+
                     *data = (uint8_t *)g_usbd_core.descriptors->msosv1_descriptor->compat_id;
-                    *len = g_usbd_core.descriptors->msosv1_descriptor->compat_id_len;
+                    *len = desclen;
                     return 0;
                 case 0x05:
                     USB_LOG_INFO("get Compat id properties\r\n");
-                    *data = (uint8_t *)g_usbd_core.descriptors->msosv1_descriptor->comp_id_property;
-                    *len = g_usbd_core.descriptors->msosv1_descriptor->comp_id_property_len;
+                    desclen = g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][0] +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][1] << 8) +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][2] << 16) +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][3] << 24);
+
+                    *data = (uint8_t *)g_usbd_core.descriptors->msosv1_descriptor->comp_id_property[setup->wValue];
+                    *len = desclen;
                     return 0;
                 default:
                     USB_LOG_ERR("unknown vendor code\r\n");
@@ -842,16 +853,22 @@ static int usbd_vendor_request_handler(struct usb_setup_packet *setup, uint8_t *
                 case 0x04:
                     USB_LOG_INFO("get Compat ID\r\n");
                     //*data = (uint8_t *)msosv1_desc->compat_id;
-                    memcpy(*data, g_usbd_core.msosv1_desc->compat_id, g_usbd_core.msosv1_desc->compat_id_len);
-                    *len = g_usbd_core.msosv1_desc->compat_id_len;
-
+                    desclen = g_usbd_core.msosv1_desc->compat_id[0] +
+                              (g_usbd_core.msosv1_desc->compat_id[1] << 8) +
+                              (g_usbd_core.msosv1_desc->compat_id[2] << 16) +
+                              (g_usbd_core.msosv1_desc->compat_id[3] << 24);
+                    memcpy(*data, g_usbd_core.msosv1_desc->compat_id, desclen);
+                    *len = desclen;
                     return 0;
                 case 0x05:
                     USB_LOG_INFO("get Compat id properties\r\n");
-                    //*data = (uint8_t *)msosv1_desc->comp_id_property;
-                    memcpy(*data, g_usbd_core.msosv1_desc->comp_id_property, g_usbd_core.msosv1_desc->comp_id_property_len);
-                    *len = g_usbd_core.msosv1_desc->comp_id_property_len;
-
+                    //*data = (uint8_t *)msosv1_desc->comp_id_property[setup->wValue];
+                    desclen = g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][0] +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][1] << 8) +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][2] << 16) +
+                              (g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][3] << 24);
+                    memcpy(*data, g_usbd_core.msosv1_desc->comp_id_property[setup->wValue], desclen);
+                    *len = desclen;
                     return 0;
                 default:
                     USB_LOG_ERR("unknown vendor code\r\n");

+ 1 - 4
demo/winusb1.0_template.c

@@ -75,12 +75,9 @@ __ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties[142] __ALIGN_END = {
 
 struct usb_msosv1_descriptor msosv1_desc = {
     .string = (uint8_t *)WCID_StringDescriptor_MSOS,
-    .string_len = 18,
     .vendor_code = WCID_VENDOR_CODE,
     .compat_id = (uint8_t *)WINUSB_WCIDDescriptor,
-    .compat_id_len = sizeof(WINUSB_WCIDDescriptor),
-    .comp_id_property = (uint8_t *)WINUSB_IF0_WCIDProperties,
-    .comp_id_property_len = sizeof(WINUSB_IF0_WCIDProperties),
+    .comp_id_property = (uint8_t **)&WINUSB_IF0_WCIDProperties,
 };
 
 #define WINUSB_IN_EP  0x81