support multi winusb
This commit is contained in:
@@ -485,12 +485,9 @@ struct usb_msosv1_comp_id_function_descriptor {
|
|||||||
|
|
||||||
struct usb_msosv1_descriptor {
|
struct usb_msosv1_descriptor {
|
||||||
uint8_t *string;
|
uint8_t *string;
|
||||||
uint8_t string_len;
|
|
||||||
uint8_t vendor_code;
|
uint8_t vendor_code;
|
||||||
uint8_t *compat_id;
|
uint8_t *compat_id;
|
||||||
uint16_t compat_id_len;
|
uint8_t **comp_id_property;
|
||||||
uint8_t *comp_id_property;
|
|
||||||
uint16_t comp_id_property_len;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* MS OS 2.0 Header descriptor */
|
/* MS OS 2.0 Header descriptor */
|
||||||
|
|||||||
@@ -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;
|
//*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);
|
memcpy(*data, (uint8_t *)g_usbd_core.msosv1_desc->string, g_usbd_core.msosv1_desc->string[0]);
|
||||||
*len = g_usbd_core.msosv1_desc->string_len;
|
*len = g_usbd_core.msosv1_desc->string[0];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} else if (type == USB_DESCRIPTOR_TYPE_BINARY_OBJECT_STORE) {
|
} 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)
|
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
|
#ifdef CONFIG_USBDEV_ADVANCE_DESC
|
||||||
if (g_usbd_core.descriptors->msosv1_descriptor) {
|
if (g_usbd_core.descriptors->msosv1_descriptor) {
|
||||||
if (setup->bRequest == g_usbd_core.descriptors->msosv1_descriptor->vendor_code) {
|
if (setup->bRequest == g_usbd_core.descriptors->msosv1_descriptor->vendor_code) {
|
||||||
switch (setup->wIndex) {
|
switch (setup->wIndex) {
|
||||||
case 0x04:
|
case 0x04:
|
||||||
USB_LOG_INFO("get Compat ID\r\n");
|
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;
|
*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;
|
return 0;
|
||||||
case 0x05:
|
case 0x05:
|
||||||
USB_LOG_INFO("get Compat id properties\r\n");
|
USB_LOG_INFO("get Compat id properties\r\n");
|
||||||
*data = (uint8_t *)g_usbd_core.descriptors->msosv1_descriptor->comp_id_property;
|
desclen = g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][0] +
|
||||||
*len = g_usbd_core.descriptors->msosv1_descriptor->comp_id_property_len;
|
(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;
|
return 0;
|
||||||
default:
|
default:
|
||||||
USB_LOG_ERR("unknown vendor code\r\n");
|
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:
|
case 0x04:
|
||||||
USB_LOG_INFO("get Compat ID\r\n");
|
USB_LOG_INFO("get Compat ID\r\n");
|
||||||
//*data = (uint8_t *)msosv1_desc->compat_id;
|
//*data = (uint8_t *)msosv1_desc->compat_id;
|
||||||
memcpy(*data, g_usbd_core.msosv1_desc->compat_id, g_usbd_core.msosv1_desc->compat_id_len);
|
desclen = g_usbd_core.msosv1_desc->compat_id[0] +
|
||||||
*len = g_usbd_core.msosv1_desc->compat_id_len;
|
(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;
|
return 0;
|
||||||
case 0x05:
|
case 0x05:
|
||||||
USB_LOG_INFO("get Compat id properties\r\n");
|
USB_LOG_INFO("get Compat id properties\r\n");
|
||||||
//*data = (uint8_t *)msosv1_desc->comp_id_property;
|
//*data = (uint8_t *)msosv1_desc->comp_id_property[setup->wValue];
|
||||||
memcpy(*data, g_usbd_core.msosv1_desc->comp_id_property, g_usbd_core.msosv1_desc->comp_id_property_len);
|
desclen = g_usbd_core.msosv1_desc->comp_id_property[setup->wValue][0] +
|
||||||
*len = g_usbd_core.msosv1_desc->comp_id_property_len;
|
(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;
|
return 0;
|
||||||
default:
|
default:
|
||||||
USB_LOG_ERR("unknown vendor code\r\n");
|
USB_LOG_ERR("unknown vendor code\r\n");
|
||||||
|
|||||||
@@ -75,12 +75,9 @@ __ALIGN_BEGIN const uint8_t WINUSB_IF0_WCIDProperties[142] __ALIGN_END = {
|
|||||||
|
|
||||||
struct usb_msosv1_descriptor msosv1_desc = {
|
struct usb_msosv1_descriptor msosv1_desc = {
|
||||||
.string = (uint8_t *)WCID_StringDescriptor_MSOS,
|
.string = (uint8_t *)WCID_StringDescriptor_MSOS,
|
||||||
.string_len = 18,
|
|
||||||
.vendor_code = WCID_VENDOR_CODE,
|
.vendor_code = WCID_VENDOR_CODE,
|
||||||
.compat_id = (uint8_t *)WINUSB_WCIDDescriptor,
|
.compat_id = (uint8_t *)WINUSB_WCIDDescriptor,
|
||||||
.compat_id_len = sizeof(WINUSB_WCIDDescriptor),
|
.comp_id_property = (uint8_t **)&WINUSB_IF0_WCIDProperties,
|
||||||
.comp_id_property = (uint8_t *)WINUSB_IF0_WCIDProperties,
|
|
||||||
.comp_id_property_len = sizeof(WINUSB_IF0_WCIDProperties),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define WINUSB_IN_EP 0x81
|
#define WINUSB_IN_EP 0x81
|
||||||
|
|||||||
Reference in New Issue
Block a user