diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h index ff332e8f7a60bc2a02e53c6b1f07694f64b7011b..91afb252d91e91965e6ae1999965eb54555774d7 100644 --- a/components/drivers/include/drivers/usb_common.h +++ b/components/drivers/include/drivers/usb_common.h @@ -422,6 +422,53 @@ struct usb_os_comp_id_descriptor }; typedef struct usb_os_comp_id_descriptor * usb_os_comp_id_desc_t; +struct usb_os_property_header +{ + rt_uint32_t dwLength; + rt_uint16_t bcdVersion; + rt_uint16_t wIndex; + rt_uint16_t wCount; +}; +typedef struct usb_os_property_header * usb_os_property_header_t; +struct usb_os_proerty +{ + rt_uint32_t dwSize; + rt_uint32_t dwPropertyDataType; + rt_uint16_t wPropertyNameLength; + const char * bPropertyName; + rt_uint32_t dwPropertyDataLength; + const char * bPropertyData; +}; +typedef struct usb_os_proerty * usb_os_proerty_t; + +// Value Description +// 1 A NULL-terminated Unicode String (REG_SZ) +// 2 A NULL-terminated Unicode String that includes environment variables (REG_EXPAND_SZ) +// 3 Free-form binary (REG_BINARY) +// 4 A little-endian 32-bit integer (REG_DWORD_LITTLE_ENDIAN) +// 5 A big-endian 32-bit integer (REG_DWORD_BIG_ENDIAN) +// 6 A NULL-terminated Unicode string that contains a symbolic link (REG_LINK) +// 7 Multiple NULL-terminated Unicode strings (REG_MULTI_SZ) +#define USB_OS_PROERTY_TYPE_REG_SZ 0x01UL +#define USB_OS_PROERTY_TYPE_REG_EXPAND_SZ 0x02UL +#define USB_OS_PROERTY_TYPE_REG_BINARY 0x03UL +#define USB_OS_PROERTY_TYPE_REG_DWORD_LITTLE_ENDIAN 0x04UL +#define USB_OS_PROERTY_TYPE_REG_DWORD_BIG_ENDIAN 0x05UL +#define USB_OS_PROERTY_TYPE_REG_LINK 0x06UL +#define USB_OS_PROERTY_TYPE_REG_MULTI_SZ 0x07UL + +#define USB_OS_PROERTY_DESC(PropertyDataType,PropertyName,PropertyData) \ +{\ + .dwSize = sizeof(struct usb_os_proerty)-sizeof(const char *)*2\ + +sizeof(PropertyName)*2+sizeof(PropertyData)*2,\ + .dwPropertyDataType = PropertyDataType,\ + .wPropertyNameLength = sizeof(PropertyName)*2,\ + .bPropertyName = PropertyName,\ + .dwPropertyDataLength = sizeof(PropertyData)*2,\ + .bPropertyData = PropertyData\ +} + + #ifndef HID_SUB_DESCRIPTOR_MAX #define HID_SUB_DESCRIPTOR_MAX 1 #endif diff --git a/components/drivers/include/drivers/usb_device.h b/components/drivers/include/drivers/usb_device.h index 11ae60858231d885e803754339746e901757bc69..8f2c1d1116a68de6223925d282e33be47a2512f3 100644 --- a/components/drivers/include/drivers/usb_device.h +++ b/components/drivers/include/drivers/usb_device.h @@ -410,5 +410,49 @@ rt_inline rt_err_t dcd_ep_clear_stall(udcd_t dcd, rt_uint8_t address) return dcd->ops->ep_clear_stall(address); } - +rt_inline void usbd_os_proerty_descriptor_send(ufunction_t func, ureq_t setup, usb_os_proerty_t usb_os_proerty, rt_uint8_t number_of_proerty) +{ + struct usb_os_property_header header; + static rt_uint8_t * data; + rt_uint8_t * pdata; + rt_uint8_t index,i; + if(data == RT_NULL) + { + header.dwLength = sizeof(struct usb_os_property_header); + header.bcdVersion = 0x0100; + header.wIndex = 0x05; + header.wCount = number_of_proerty; + for(index = 0;index < number_of_proerty;index++) + { + header.dwLength += usb_os_proerty[index].dwSize; + } + data = (rt_uint8_t *)rt_malloc(header.dwLength); + RT_ASSERT(data != RT_NULL); + pdata = data; + rt_memcpy((void *)pdata,(void *)&header,sizeof(struct usb_os_property_header)); + pdata += sizeof(struct usb_os_property_header); + for(index = 0;index < number_of_proerty;index++) + { + rt_memcpy((void *)pdata,(void *)&usb_os_proerty[index],10); + pdata += 10; + for(i = 0;i < usb_os_proerty[index].wPropertyNameLength;i++) + { + *pdata = usb_os_proerty[index].bPropertyName[i]; + pdata++; + *pdata = 0; + pdata++; + } + *((rt_uint32_t *)pdata) = usb_os_proerty[index].dwPropertyDataLength; + pdata += 4; + for(i = 0;i < usb_os_proerty[index].dwPropertyDataLength;i++) + { + *pdata = usb_os_proerty[index].bPropertyData[i]; + pdata++; + *pdata = 0; + pdata++; + } + } + } + rt_usbd_ep0_write(func->device, data, setup->wLength); +} #endif diff --git a/components/drivers/usb/usbdevice/class/winusb.c b/components/drivers/usb/usbdevice/class/winusb.c index 4da9333789ca0f032a47f29b14a00c1e798ac859..0ce0d88064c25f145299762eb385fa7b0128f7df 100644 --- a/components/drivers/usb/usbdevice/class/winusb.c +++ b/components/drivers/usb/usbdevice/class/winusb.c @@ -25,7 +25,7 @@ static struct udevice_descriptor dev_desc = USB_DESC_LENGTH_DEVICE, //bLength; USB_DESC_TYPE_DEVICE, //type; USB_BCD_VERSION, //bcdUSB; - 0x00, //bDeviceClass; + 0x00, //bDeviceClass; 0x00, //bDeviceSubClass; 0x00, //bDeviceProtocol; 0x40, //bMaxPacketSize0; @@ -100,6 +100,11 @@ const static char* _ustring[] = "Interface", USB_STRING_OS//must be }; +struct usb_os_proerty winusb_proerty[] = +{ + USB_OS_PROERTY_DESC(USB_OS_PROERTY_TYPE_REG_SZ,"DeviceInterfaceGUID","{6860DC3C-C05F-4807-8807-1CA861CC1D66}"), +}; + struct usb_os_function_comp_id_descriptor winusb_func_comp_id_desc = { .bFirstInterfaceNumber = USB_DYNAMIC, @@ -127,6 +132,18 @@ static rt_err_t _ep_in_handler(ufunction_t func, rt_size_t size) } static rt_err_t _interface_handler(ufunction_t func, ureq_t setup) { + switch(setup->bRequest) + { + case 'A': + switch(setup->wIndex) + { + case 0x05: + usbd_os_proerty_descriptor_send(func,setup,winusb_proerty,sizeof(winusb_proerty)/sizeof(winusb_proerty[0])); + break; + } + break; + } + return RT_EOK; } static rt_err_t _function_enable(ufunction_t func) diff --git a/components/drivers/usb/usbdevice/class/winusb.h b/components/drivers/usb/usbdevice/class/winusb.h index 514dd0a184f16453a8cb3eb95dc69bf081091fa4..86aa7f413cf4b976fdc52a731ccb04ff81356bd6 100644 --- a/components/drivers/usb/usbdevice/class/winusb.h +++ b/components/drivers/usb/usbdevice/class/winusb.h @@ -20,18 +20,4 @@ struct winusb_descriptor }; typedef struct winusb_descriptor* winusb_desc_t; - -struct winusb_os_header_properties_descriptor -{ - rt_uint32_t dwLength; - rt_uint16_t bcdVersion; - rt_uint16_t wIndex; - rt_uint16_t bCount; -}; -typedef struct winusb_os_header_properties_descriptor * winusb_os_header_prop_desc_t; - - - - - #endif diff --git a/components/drivers/usb/usbdevice/core/core.c b/components/drivers/usb/usbdevice/core/core.c index 4786d7db32483c112dc633dda2e983075d01c070..3c0d8f1e264432c91549c03c127e62340acba4b5 100644 --- a/components/drivers/usb/usbdevice/core/core.c +++ b/components/drivers/usb/usbdevice/core/core.c @@ -669,6 +669,8 @@ static rt_err_t _vendor_request(udevice_t device, ureq_t setup) static rt_uint8_t * usb_comp_id_desc = RT_NULL; static rt_uint32_t usb_comp_id_desc_size = 0; usb_os_func_comp_id_desc_t func_comp_id_desc; + uintf_t intf; + ufunction_t func; switch(setup->bRequest) { case 'A': @@ -704,6 +706,13 @@ static rt_err_t _vendor_request(udevice_t device, ureq_t setup) } rt_usbd_ep0_write(device, (void*)usb_comp_id_desc, setup->wLength); break; + case 0x05: + intf = rt_usbd_find_interface(device, setup->wValue & 0xFF, &func); + if(intf != RT_NULL) + { + intf->handler(func, setup); + } + break; } break;