Merge pull request #1044 from uestczyh222/JM
[Components][Drivers][USB]WinUSB And Core update
This commit is contained in:
commit
81cc09a3fc
|
@ -422,6 +422,53 @@ struct usb_os_comp_id_descriptor
|
||||||
};
|
};
|
||||||
typedef struct usb_os_comp_id_descriptor * usb_os_comp_id_desc_t;
|
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
|
#ifndef HID_SUB_DESCRIPTOR_MAX
|
||||||
#define HID_SUB_DESCRIPTOR_MAX 1
|
#define HID_SUB_DESCRIPTOR_MAX 1
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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);
|
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
|
#endif
|
||||||
|
|
|
@ -25,7 +25,7 @@ static struct udevice_descriptor dev_desc =
|
||||||
USB_DESC_LENGTH_DEVICE, //bLength;
|
USB_DESC_LENGTH_DEVICE, //bLength;
|
||||||
USB_DESC_TYPE_DEVICE, //type;
|
USB_DESC_TYPE_DEVICE, //type;
|
||||||
USB_BCD_VERSION, //bcdUSB;
|
USB_BCD_VERSION, //bcdUSB;
|
||||||
0x00, //bDeviceClass;
|
0x00, //bDeviceClass;
|
||||||
0x00, //bDeviceSubClass;
|
0x00, //bDeviceSubClass;
|
||||||
0x00, //bDeviceProtocol;
|
0x00, //bDeviceProtocol;
|
||||||
0x40, //bMaxPacketSize0;
|
0x40, //bMaxPacketSize0;
|
||||||
|
@ -100,6 +100,11 @@ const static char* _ustring[] =
|
||||||
"Interface",
|
"Interface",
|
||||||
USB_STRING_OS//must be
|
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 =
|
struct usb_os_function_comp_id_descriptor winusb_func_comp_id_desc =
|
||||||
{
|
{
|
||||||
.bFirstInterfaceNumber = USB_DYNAMIC,
|
.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)
|
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;
|
return RT_EOK;
|
||||||
}
|
}
|
||||||
static rt_err_t _function_enable(ufunction_t func)
|
static rt_err_t _function_enable(ufunction_t func)
|
||||||
|
|
|
@ -20,18 +20,4 @@ struct winusb_descriptor
|
||||||
};
|
};
|
||||||
typedef struct winusb_descriptor* winusb_desc_t;
|
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
|
#endif
|
||||||
|
|
|
@ -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_uint8_t * usb_comp_id_desc = RT_NULL;
|
||||||
static rt_uint32_t usb_comp_id_desc_size = 0;
|
static rt_uint32_t usb_comp_id_desc_size = 0;
|
||||||
usb_os_func_comp_id_desc_t func_comp_id_desc;
|
usb_os_func_comp_id_desc_t func_comp_id_desc;
|
||||||
|
uintf_t intf;
|
||||||
|
ufunction_t func;
|
||||||
switch(setup->bRequest)
|
switch(setup->bRequest)
|
||||||
{
|
{
|
||||||
case 'A':
|
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);
|
rt_usbd_ep0_write(device, (void*)usb_comp_id_desc, setup->wLength);
|
||||||
break;
|
break;
|
||||||
|
case 0x05:
|
||||||
|
intf = rt_usbd_find_interface(device, setup->wValue & 0xFF, &func);
|
||||||
|
if(intf != RT_NULL)
|
||||||
|
{
|
||||||
|
intf->handler(func, setup);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue