summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorLi Jun <jun.li@nxp.com>2021-01-25 16:43:50 +0300
committerMarek Vasut <marex@denx.de>2021-01-31 16:08:56 +0300
commit37e4fc3354dab8b4cbf835f83ed439753234ce12 (patch)
treef0ab4cbdfcd86098f3c67fb710f44ed36980dd34 /drivers/usb/gadget
parenta764c941289c404ae3a2605a204fc0375b566bb2 (diff)
downloadu-boot-37e4fc3354dab8b4cbf835f83ed439753234ce12.tar.xz
usb: gadget: add WCID support for mfgtool
Enable WCID(Microsoft Compatible ID Feature Descriptor) for mfgtool. Signed-off-by: Li Jun <jun.li@nxp.com> Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/composite.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index a0c28dbe59..cd61bfec38 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -20,6 +20,10 @@
typedef struct { __le16 val; } __packed __le16_packed;
static struct usb_composite_driver *composite;
+static struct usb_configuration *os_desc_config;
+
+/* Microsoft OS String Descriptor */
+static char qw_sign_buf[OS_STRING_QW_SIGN_LEN / 2] = {'M', 'S', 'F', 'T', '1', '0', '0'};
static inline void le16_add_cpu_packed(__le16_packed *var, u16 val)
{
@@ -395,6 +399,10 @@ static int set_config(struct usb_composite_dev *cdev,
goto done;
cdev->config = c;
+ if (cdev->use_os_string) {
+ cdev->os_desc_config = c;
+ os_desc_config = c;
+ }
/* Initialize all interfaces by setting them to altsetting zero. */
for (tmp = 0; tmp < MAX_CONFIG_INTERFACES; tmp++) {
@@ -1358,6 +1366,18 @@ static int composite_bind(struct usb_gadget *gadget)
sizeof(struct usb_device_descriptor));
cdev->desc.bMaxPacketSize0 = gadget->ep0->maxpacket;
+ if (cdev->use_os_string) {
+ /* TODO: Do we want to pass this via platform? */
+ cdev->b_vendor_code = 0x40;
+
+ /* Microsoft OS String Descriptor */
+ utf8_to_utf16le(qw_sign_buf, (__le16 *)cdev->qw_sign,
+ OS_STRING_QW_SIGN_LEN / 2);
+
+ if (os_desc_config)
+ cdev->os_desc_config = os_desc_config;
+ }
+
debug("%s: ready\n", composite->name);
return 0;