summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsakimisu <[email protected]>2023-06-28 22:11:14 +0800
committersakimisu <[email protected]>2023-06-28 22:59:22 +0800
commit7061367484ba42c8a1aaaa1ecb45ad14fa3ac20e (patch)
treea8f5701c6bd5a228599a5ccde830759a6fdb04c4
parentfaf90663a95022de4c3cea7ed4e03ae94d041e43 (diff)
support multi winusb
-rw-r--r--common/usb_def.h5
-rw-r--r--core/usbd_core.c41
-rw-r--r--demo/winusb1.0_template.c5
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