From 7061367484ba42c8a1aaaa1ecb45ad14fa3ac20e Mon Sep 17 00:00:00 2001 From: sakimisu <1203593632@qq.com> Date: Wed, 28 Jun 2023 22:11:14 +0800 Subject: [PATCH] support multi winusb --- common/usb_def.h | 5 +---- core/usbd_core.c | 41 +++++++++++++++++++++++++++------------ 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