diff options
| author | sakimisu <[email protected]> | 2023-06-28 22:11:14 +0800 |
|---|---|---|
| committer | sakimisu <[email protected]> | 2023-06-28 22:59:22 +0800 |
| commit | 7061367484ba42c8a1aaaa1ecb45ad14fa3ac20e (patch) | |
| tree | a8f5701c6bd5a228599a5ccde830759a6fdb04c4 | |
| parent | faf90663a95022de4c3cea7ed4e03ae94d041e43 (diff) | |
support multi winusb
| -rw-r--r-- | common/usb_def.h | 5 | ||||
| -rw-r--r-- | core/usbd_core.c | 41 | ||||
| -rw-r--r-- | demo/winusb1.0_template.c | 5 |
3 files changed, 31 insertions, 20 deletions
diff --git a/common/usb_def.h b/common/usb_def.h index 5bd9228d..3e942ef2 100644 --- a/common/usb_def.h +++ b/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 */ diff --git a/core/usbd_core.c b/core/usbd_core.c index 5bb09d92..ea4afa94 100644 --- a/core/usbd_core.c +++ b/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"); diff --git a/demo/winusb1.0_template.c b/demo/winusb1.0_template.c index 1a8dc11b..40cc8529 100644 --- a/demo/winusb1.0_template.c +++ b/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 |
