From effcee25b7cbb2bb42d4134d37dc8a9ec4635130 Mon Sep 17 00:00:00 2001 From: Dillon Min Date: Thu, 11 Mar 2021 17:29:41 +0800 Subject: [PATCH 1/3] component: driver: usb: Add usb interface string(iInterface) setting To make compositive usb device string more reansonable, not all devices just show same "RTT Composite Device" on windows device manager. add a interface rt_usbd_device_set_interface_string to set respective interface string. Signed-off-by: Dillon Min v1 -> v2: remove all tabs to space, to match rt-thread coding style --- .../drivers/include/drivers/usb_device.h | 7 +++- .../drivers/usb/usbdevice/class/audio_mic.c | 12 +++++-- .../usb/usbdevice/class/audio_speaker.c | 12 +++++-- .../drivers/usb/usbdevice/class/cdc_vcom.c | 12 +++++-- components/drivers/usb/usbdevice/class/ecm.c | 10 +++++- components/drivers/usb/usbdevice/class/hid.c | 15 ++++++--- .../drivers/usb/usbdevice/class/mstorage.c | 11 +++++-- .../drivers/usb/usbdevice/class/rndis.c | 11 +++++-- .../drivers/usb/usbdevice/class/winusb.c | 10 +++++- .../usb/usbdevice/core/usbdevice_core.c | 32 +++++++++++++++++-- 10 files changed, 113 insertions(+), 19 deletions(-) diff --git a/components/drivers/include/drivers/usb_device.h b/components/drivers/include/drivers/usb_device.h index 26f0c4cf4a..e9f5bc467d 100644 --- a/components/drivers/include/drivers/usb_device.h +++ b/components/drivers/include/drivers/usb_device.h @@ -34,6 +34,10 @@ extern "C" { #define _PRODUCT_ID 0x0001 #endif +#ifndef MAX_INTF_STR +#define MAX_INTF_STR 20 +#endif + #define USB_BCD_DEVICE 0x0200 /* USB Specification Release Number in Binary-Coded Decimal */ #define USB_BCD_VERSION 0x0200 /* USB 2.0 */ #define EP0_IN_ADDR 0x80 @@ -193,7 +197,7 @@ struct udevice struct usb_qualifier_descriptor * dev_qualifier; usb_os_comp_id_desc_t os_comp_id_desc; const char** str; - + const char *str_intf[MAX_INTF_STR]; udevice_state_t state; rt_list_t cfg_list; uconfig_t curr_cfg; @@ -260,6 +264,7 @@ rt_err_t rt_usbd_event_signal(struct udev_msg* msg); rt_err_t rt_usbd_device_set_controller(udevice_t device, udcd_t dcd); rt_err_t rt_usbd_device_set_descriptor(udevice_t device, udev_desc_t dev_desc); rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring); +rt_err_t rt_usbd_device_set_interface_string(udevice_t device, int index, const char* string); rt_err_t rt_usbd_device_set_qualifier(udevice_t device, struct usb_qualifier_descriptor* qualifier); rt_err_t rt_usbd_device_set_os_comp_id_desc(udevice_t device, usb_os_comp_id_desc_t os_comp_id_desc); rt_err_t rt_usbd_device_add_config(udevice_t device, uconfig_t cfg); diff --git a/components/drivers/usb/usbdevice/class/audio_mic.c b/components/drivers/usb/usbdevice/class/audio_mic.c index 23ade2d9b6..793be71728 100644 --- a/components/drivers/usb/usbdevice/class/audio_mic.c +++ b/components/drivers/usb/usbdevice/class/audio_mic.c @@ -35,6 +35,7 @@ #define EVENT_RECORD_STOP (1 << 1) #define EVENT_RECORD_DATA (1 << 2) +#define MIC_INTF_STR_INDEX 8 /* * uac mic descriptor define */ @@ -128,7 +129,7 @@ const static char *_ustring[] = { "Language", "RT-Thread Team.", - "Microphone", + "RT-Thread Audio Microphone", "32021919830108", "Configuration", "Interface", @@ -160,7 +161,11 @@ static struct uac_ac_descriptor ac_desc = USB_CLASS_AUDIO, USB_SUBCLASS_AUDIOCONTROL, 0x00, +#ifdef RT_USB_DEVICE_COMPOSITE + MIC_INTF_STR_INDEX, +#else 0x00, +#endif }, /* Header Descriptor */ { @@ -495,9 +500,12 @@ ufunction_t rt_usbd_function_uac_mic_create(udevice_t device) /* parameter check */ RT_ASSERT(device != RT_NULL); +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, MIC_INTF_STR_INDEX, _ustring[2]); +#else /* set usb device string description */ rt_usbd_device_set_string(device, _ustring); - +#endif /* create a uac function */ func = rt_usbd_function_new(device, &dev_desc, &ops); //not support HS diff --git a/components/drivers/usb/usbdevice/class/audio_speaker.c b/components/drivers/usb/usbdevice/class/audio_speaker.c index e9a3ffaf40..56e8e5378f 100644 --- a/components/drivers/usb/usbdevice/class/audio_speaker.c +++ b/components/drivers/usb/usbdevice/class/audio_speaker.c @@ -35,6 +35,7 @@ #define EVENT_AUDIO_STOP (1 << 1) #define EVENT_AUDIO_DATA (1 << 2) +#define SPK_INTF_STR_INDEX 9 /* * uac speaker descriptor define */ @@ -128,7 +129,7 @@ const static char *_ustring[] = { "Language", "RT-Thread Team.", - "RT-Thread Speaker", + "RT-Thread Audio Speaker", "32021919830108", "Configuration", "Interface", @@ -160,7 +161,11 @@ static struct uac_ac_descriptor ac_desc = USB_CLASS_AUDIO, USB_SUBCLASS_AUDIOCONTROL, 0x00, +#ifdef RT_USB_DEVICE_COMPOSITE + SPK_INTF_STR_INDEX, +#else 0x00, +#endif }, /* Header Descriptor */ { @@ -496,9 +501,12 @@ ufunction_t rt_usbd_function_uac_speaker_create(udevice_t device) /* parameter check */ RT_ASSERT(device != RT_NULL); +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, SPK_INTF_STR_INDEX, _ustring[2]); +#else /* set usb device string description */ rt_usbd_device_set_string(device, _ustring); - +#endif /* create a uac function */ func = rt_usbd_function_new(device, &dev_desc, &ops); //not support HS diff --git a/components/drivers/usb/usbdevice/class/cdc_vcom.c b/components/drivers/usb/usbdevice/class/cdc_vcom.c index f9ea466bd5..5cd4a676a1 100644 --- a/components/drivers/usb/usbdevice/class/cdc_vcom.c +++ b/components/drivers/usb/usbdevice/class/cdc_vcom.c @@ -20,6 +20,7 @@ #ifdef RT_USB_DEVICE_CDC +#define VCOM_INTF_STR_INDEX 5 #ifdef RT_VCOM_TX_TIMEOUT #define VCOM_TX_TIMEOUT RT_VCOM_TX_TIMEOUT #else /*!RT_VCOM_TX_TIMEOUT*/ @@ -151,7 +152,11 @@ const static struct ucdc_comm_descriptor _comm_desc = USB_CDC_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_PROTOCOL_V25TER, - 0x00, +#ifdef RT_USB_DEVICE_COMPOSITE + VCOM_INTF_STR_INDEX, +#else + 0, +#endif }, /* Header Functional Descriptor */ { @@ -582,9 +587,12 @@ ufunction_t rt_usbd_function_cdc_create(udevice_t device) rt_memset(serno, 0, _SER_NO_LEN + 1); rt_memcpy(serno, _SER_NO, rt_strlen(_SER_NO)); } +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, VCOM_INTF_STR_INDEX, _ustring[2]); +#else /* set usb device string description */ rt_usbd_device_set_string(device, _ustring); - +#endif /* create a cdc function */ func = rt_usbd_function_new(device, &dev_desc, &ops); diff --git a/components/drivers/usb/usbdevice/class/ecm.c b/components/drivers/usb/usbdevice/class/ecm.c index 36557dad74..ba9a259d3c 100644 --- a/components/drivers/usb/usbdevice/class/ecm.c +++ b/components/drivers/usb/usbdevice/class/ecm.c @@ -24,6 +24,7 @@ #define USB_ETH_MTU 1514 #endif #define MAX_ADDR_LEN 6 +#define ECM_INTF_STR_INDEX 10 struct rt_ecm_eth { @@ -96,7 +97,11 @@ const static struct ucdc_eth_descriptor _comm_desc = USB_CDC_CLASS_COMM, USB_CDC_SUBCLASS_ETH, USB_CDC_PROTOCOL_NONE, +#ifdef RT_USB_DEVICE_COMPOSITE + ECM_INTF_STR_INDEX, +#else 0x00, +#endif }, /* Header Functional Descriptor */ { @@ -560,8 +565,11 @@ ufunction_t rt_usbd_function_ecm_create(udevice_t device) RT_ASSERT(device != RT_NULL); /* set usb device string description */ +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, ECM_INTF_STR_INDEX, _ustring[2]); +#else rt_usbd_device_set_string(device, _ustring); - +#endif /* create a cdc class */ cdc = rt_usbd_function_new(device, &_dev_desc, &ops); rt_usbd_device_set_qualifier(device, &dev_qualifier); diff --git a/components/drivers/usb/usbdevice/class/hid.c b/components/drivers/usb/usbdevice/class/hid.c index 52e50296a4..7dc344365d 100644 --- a/components/drivers/usb/usbdevice/class/hid.c +++ b/components/drivers/usb/usbdevice/class/hid.c @@ -17,7 +17,7 @@ #include "hid.h" #ifdef RT_USB_DEVICE_HID - +#define HID_INTF_STR_INDEX 7 struct hid_s { struct rt_device parent; @@ -318,8 +318,12 @@ const static struct uhid_comm_descriptor _hid_comm_desc = #else USB_HID_PROTOCOL_MOUSE, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ #endif - 0, /* iInterface: Index of string descriptor */ - }, +#ifdef RT_USB_DEVICE_COMPOSITE + HID_INTF_STR_INDEX, /* iInterface: Index of string descriptor */ +#else + 0, +#endif + }, /* HID Descriptor */ { @@ -685,8 +689,11 @@ ufunction_t rt_usbd_function_hid_create(udevice_t device) RT_ASSERT(device != RT_NULL); /* set usb device string description */ +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, HID_INTF_STR_INDEX, _ustring[2]); +#else rt_usbd_device_set_string(device, _ustring); - +#endif /* create a cdc function */ func = rt_usbd_function_new(device, &_dev_desc, &ops); diff --git a/components/drivers/usb/usbdevice/class/mstorage.c b/components/drivers/usb/usbdevice/class/mstorage.c index 6991d97eae..25735e175e 100644 --- a/components/drivers/usb/usbdevice/class/mstorage.c +++ b/components/drivers/usb/usbdevice/class/mstorage.c @@ -18,8 +18,8 @@ #ifdef RT_USING_DFS_MNTTABLE #include "dfs_fs.h" #endif - #ifdef RT_USB_DEVICE_MSTORAGE +#define MSTRORAGE_INTF_STR_INDEX 11 enum STAT { @@ -131,7 +131,11 @@ const static struct umass_descriptor _mass_desc = USB_CLASS_MASS_STORAGE, //bInterfaceClass; 0x06, //bInterfaceSubClass; 0x50, //bInterfaceProtocol; +#ifdef RT_USB_DEVICE_COMPOSITE + MSTRORAGE_INTF_STR_INDEX, +#else 0x00, //iInterface; +#endif }, { @@ -1097,8 +1101,11 @@ ufunction_t rt_usbd_function_mstorage_create(udevice_t device) RT_ASSERT(device != RT_NULL); /* set usb device string description */ +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, MSTRORAGE_INTF_STR_INDEX, _ustring[2]); +#else rt_usbd_device_set_string(device, _ustring); - +#endif /* create a mass storage function */ func = rt_usbd_function_new(device, &dev_desc, &ops); device->dev_qualifier = &dev_qualifier; diff --git a/components/drivers/usb/usbdevice/class/rndis.c b/components/drivers/usb/usbdevice/class/rndis.c index 93e0ba6ae2..98e557f0ff 100644 --- a/components/drivers/usb/usbdevice/class/rndis.c +++ b/components/drivers/usb/usbdevice/class/rndis.c @@ -28,7 +28,7 @@ #define DBG_SECTION_NAME "RNDIS" #include - +#define RNDIS_INTF_STR_INDEX 12 /* RT-Thread LWIP ethernet interface */ #include @@ -123,7 +123,11 @@ const static struct ucdc_comm_descriptor _comm_desc = USB_CDC_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_PROTOCOL_VENDOR, +#ifdef RT_USB_DEVICE_COMPOSITE + RNDIS_INTF_STR_INDEX, +#else 0x00, +#endif }, /* Header Functional Descriptor */ { @@ -1318,8 +1322,11 @@ ufunction_t rt_usbd_function_rndis_create(udevice_t device) RT_ASSERT(device != RT_NULL); /* set usb device string description */ +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, RNDIS_INTF_STR_INDEX, _ustring[2]); +#else rt_usbd_device_set_string(device, _ustring); - +#endif /* create a cdc class */ cdc = rt_usbd_function_new(device, &_dev_desc, &ops); rt_usbd_device_set_qualifier(device, &dev_qualifier); diff --git a/components/drivers/usb/usbdevice/class/winusb.c b/components/drivers/usb/usbdevice/class/winusb.c index 4af6dba3cf..6a44a3567b 100644 --- a/components/drivers/usb/usbdevice/class/winusb.c +++ b/components/drivers/usb/usbdevice/class/winusb.c @@ -19,7 +19,7 @@ struct winusb_device uep_t ep_out; uep_t ep_in; }; - +#define WINUSB_INTF_STR_INDEX 13 typedef struct winusb_device * winusb_device_t; ALIGN(4) @@ -82,7 +82,11 @@ struct winusb_descriptor _winusb_desc = 0xFF, //bInterfaceClass; 0x00, //bInterfaceSubClass; 0x00, //bInterfaceProtocol; +#ifdef RT_USB_DEVICE_COMPOSITE + WINUSB_INTF_STR_INDEX, +#else 0x00, //iInterface; +#endif }, /*endpoint descriptor*/ { @@ -308,7 +312,11 @@ ufunction_t rt_usbd_function_winusb_create(udevice_t device) RT_ASSERT(device != RT_NULL); /* set usb device string description */ +#ifdef RT_USB_DEVICE_COMPOSITE + rt_usbd_device_set_interface_string(device, WINUSB_INTF_STR_INDEX, _ustring[2]); +#else rt_usbd_device_set_string(device, _ustring); +#endif /* create a cdc function */ func = rt_usbd_function_new(device, &dev_desc, &ops); diff --git a/components/drivers/usb/usbdevice/core/usbdevice_core.c b/components/drivers/usb/usbdevice/core/usbdevice_core.c index ef569d7bf2..063d5781bc 100644 --- a/components/drivers/usb/usbdevice/core/usbdevice_core.c +++ b/components/drivers/usb/usbdevice/core/usbdevice_core.c @@ -123,12 +123,18 @@ static rt_err_t _get_string_descriptor(struct udevice* device, ureq_t setup) } else { - len = rt_strlen(device->str[index]); + if(index < 5) + len = rt_strlen(device->str[index]); + else + len = rt_strlen(device->str_intf[index]); str_desc.bLength = len*2 + 2; for(i=0; istr[index][i]; + if(index < 5) + str_desc.String[i*2] = device->str[index][i]; + else + str_desc.String[i*2] = device->str_intf[index][i]; str_desc.String[i*2 + 1] = 0; } } @@ -1044,6 +1050,28 @@ rt_err_t rt_usbd_device_set_string(udevice_t device, const char** ustring) return RT_EOK; } +/** + * This function will set usb device interface string description. + * + * @param device the usb device object. + * @param index of interface string + * @param string pointer to interface string description. + * + * @return RT_EOK. + */ +rt_err_t rt_usbd_device_set_interface_string(udevice_t device, int index, const char* string) +{ + /* parameter check */ + RT_ASSERT(device != RT_NULL); + RT_ASSERT(string != RT_NULL); + RT_ASSERT(index < MAX_INTF_STR); + + /* set string descriptor array to the device object */ + device->str_intf[index] = string; + + return RT_EOK; +} + rt_err_t rt_usbd_device_set_os_comp_id_desc(udevice_t device, usb_os_comp_id_desc_t os_comp_id_desc) { /* parameter check */ From 9e711404027ef98cee49571c9e4827880128622f Mon Sep 17 00:00:00 2001 From: Dillon Min Date: Thu, 11 Mar 2021 17:31:35 +0800 Subject: [PATCH 2/3] component: driver: usb: enlarge uconfig_descriptor's data array space if you add more compositive usb device(more than 4), the data[256] can't hold all the devices's config information, array out of bounds. Signed-off-by: Dillon Min --- components/drivers/include/drivers/usb_common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h index 4d85a85e35..a6c73c5601 100644 --- a/components/drivers/include/drivers/usb_common.h +++ b/components/drivers/include/drivers/usb_common.h @@ -112,7 +112,7 @@ extern "C" { #define USB_STRING_CONFIG_INDEX 0x04 #define USB_STRING_INTERFACE_INDEX 0x05 #define USB_STRING_OS_INDEX 0x06 -#define USB_STRING_MAX USB_STRING_OS_INDEX +#define USB_STRING_MAX 0xff #define USB_STRING_OS "MSFT100A" @@ -301,7 +301,7 @@ struct uconfig_descriptor rt_uint8_t iConfiguration; rt_uint8_t bmAttributes; rt_uint8_t MaxPower; - rt_uint8_t data[256]; + rt_uint8_t data[2048]; }; typedef struct uconfig_descriptor* ucfg_desc_t; From 9789e4c930fc1b3869f75a36e481a0c17e341d6a Mon Sep 17 00:00:00 2001 From: Dillon Min Date: Thu, 11 Mar 2021 17:31:35 +0800 Subject: [PATCH 3/3] component: driver: usb: enlarge uconfig_descriptor's data array space if you add more compositive usb device(more than 4), the data[256] can't hold all the devices's config information, array out of bounds. Fixes: 60c27fc4b ("add USB composite and mass storage class features in USB device stack") Signed-off-by: Dillon Min --- components/drivers/include/drivers/usb_common.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/drivers/include/drivers/usb_common.h b/components/drivers/include/drivers/usb_common.h index 4d85a85e35..a6c73c5601 100644 --- a/components/drivers/include/drivers/usb_common.h +++ b/components/drivers/include/drivers/usb_common.h @@ -112,7 +112,7 @@ extern "C" { #define USB_STRING_CONFIG_INDEX 0x04 #define USB_STRING_INTERFACE_INDEX 0x05 #define USB_STRING_OS_INDEX 0x06 -#define USB_STRING_MAX USB_STRING_OS_INDEX +#define USB_STRING_MAX 0xff #define USB_STRING_OS "MSFT100A" @@ -301,7 +301,7 @@ struct uconfig_descriptor rt_uint8_t iConfiguration; rt_uint8_t bmAttributes; rt_uint8_t MaxPower; - rt_uint8_t data[256]; + rt_uint8_t data[2048]; }; typedef struct uconfig_descriptor* ucfg_desc_t;