Skip to content

Commit 0788e68

Browse files
yangsong8-a1Alan Carvalho de Assis
authored andcommitted
usbdev: usb device descriptor support USB3.0
Signed-off-by: yangsong8 <[email protected]>
1 parent af017a5 commit 0788e68

File tree

11 files changed

+103
-26
lines changed

11 files changed

+103
-26
lines changed

drivers/usbdev/Kconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ config USBDEV_DUALSPEED
2525
---help---
2626
Hardware handles high and full speed operation (USB 2.0)
2727

28+
config USBDEV_SUPERSPEED
29+
bool "Enable super speed"
30+
default n
31+
---help---
32+
Hardware handles super speed operation (USB 3.2)
33+
2834
config USBDEV_EPBUFFER_ALIGNMENT
2935
int "The usbdev ep req bffer aligned bytes"
3036
default 0

drivers/usbdev/cdcacm.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1627,8 +1627,9 @@ static int cdcacm_setup(FAR struct usbdevclass_driver_s *driver,
16271627
#ifndef CONFIG_CDCACM_COMPOSITE
16281628
case USB_DESC_TYPE_DEVICE:
16291629
{
1630-
ret = USB_SIZEOF_DEVDESC;
1631-
memcpy(ctrlreq->buf, cdcacm_getdevdesc(), ret);
1630+
ret = usbdev_copy_devdesc(ctrlreq->buf,
1631+
cdcacm_getdevdesc(),
1632+
dev->speed);
16321633
}
16331634
break;
16341635
#endif

drivers/usbdev/cdcecm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,8 +1463,7 @@ static int cdcecm_getdescriptor(FAR struct cdcecm_driver_s *self,
14631463
#ifndef CONFIG_CDCECM_COMPOSITE
14641464
case USB_DESC_TYPE_DEVICE:
14651465
{
1466-
memcpy(desc, &g_devdesc, sizeof(g_devdesc));
1467-
return (int)sizeof(g_devdesc);
1466+
return usbdev_copy_devdesc(desc, &g_devdesc, self->usbdev.speed);
14681467
}
14691468
break;
14701469
#endif
@@ -1718,6 +1717,7 @@ static int cdcecm_setup(FAR struct usbdevclass_driver_s *driver,
17181717
uint8_t descindex = ctrl->value[0];
17191718
uint8_t desctype = ctrl->value[1];
17201719

1720+
self->usbdev.speed = dev->speed;
17211721
ret = cdcecm_getdescriptor(self, desctype, descindex,
17221722
self->ctrlreq->buf);
17231723
}
@@ -1835,7 +1835,9 @@ static int cdcecm_classobject(int minor,
18351835

18361836
/* USB device initialization */
18371837

1838-
#ifdef CONFIG_USBDEV_DUALSPEED
1838+
#if defined(CONFIG_USBDEV_SUPERSPEED)
1839+
self->usbdev.speed = USB_SPEED_SUPER;
1840+
#elif defined(CONFIG_USBDEV_DUALSPEED)
18391841
self->usbdev.speed = USB_SPEED_HIGH;
18401842
#else
18411843
self->usbdev.speed = USB_SPEED_FULL;

drivers/usbdev/cdcncm.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <sys/poll.h>
3838

3939
#include <nuttx/net/netdev_lowerhalf.h>
40+
#include <nuttx/usb/usbdev.h>
4041
#include <nuttx/usb/cdc.h>
4142
#include <nuttx/usb/cdcncm.h>
4243
#include <nuttx/usb/usbdev_trace.h>
@@ -2320,8 +2321,9 @@ static int cdcncm_getdescriptor(FAR struct cdcncm_driver_s *self,
23202321
case USB_DESC_TYPE_DEVICE:
23212322
if (self->isncm)
23222323
{
2323-
memcpy(desc, &g_ncmdevdesc, sizeof(g_ncmdevdesc));
2324-
return sizeof(g_ncmdevdesc);
2324+
return usbdev_copy_devdesc(desc,
2325+
&g_ncmdevdesc,
2326+
self->usbdev.speed);
23252327
}
23262328
# ifdef CONFIG_NET_CDCMBIM
23272329
else
@@ -2582,6 +2584,7 @@ static int cdcncm_setup(FAR struct usbdevclass_driver_s *driver,
25822584
uint8_t descindex = ctrl->value[0];
25832585
uint8_t desctype = ctrl->value[1];
25842586

2587+
self->usbdev.speed = dev->speed;
25852588
ret = cdcncm_getdescriptor(self, desctype, descindex,
25862589
self->ctrlreq->buf);
25872590
}
@@ -2791,7 +2794,9 @@ static int cdcncm_classobject(int minor,
27912794

27922795
/* USB device initialization */
27932796

2794-
#ifdef CONFIG_USBDEV_DUALSPEED
2797+
#if defined(CONFIG_USBDEV_SUPERSPEED)
2798+
self->usbdev.speed = USB_SPEED_SUPER;
2799+
#elif defined(CONFIG_USBDEV_DUALSPEED)
27952800
self->usbdev.speed = USB_SPEED_HIGH;
27962801
#else
27972802
self->usbdev.speed = USB_SPEED_FULL;
@@ -2866,7 +2871,9 @@ static int cdcmbim_classobject(int minor,
28662871

28672872
/* USB device initialization */
28682873

2869-
#ifdef CONFIG_USBDEV_DUALSPEED
2874+
#if defined(CONFIG_USBDEV_SUPERSPEED)
2875+
ncm->usbdev.speed = USB_SPEED_SUPER;
2876+
#elif defined(CONFIG_USBDEV_DUALSPEED)
28702877
ncm->usbdev.speed = USB_SPEED_HIGH;
28712878
#else
28722879
ncm->usbdev.speed = USB_SPEED_FULL;

drivers/usbdev/composite.c

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -643,8 +643,10 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
643643
{
644644
case USB_DESC_TYPE_DEVICE:
645645
{
646-
ret = USB_SIZEOF_DEVDESC;
647-
memcpy(ctrlreq->buf, priv->descs->devdesc, ret);
646+
ret = usbdev_copy_devdesc(ctrlreq->buf,
647+
priv->descs->devdesc,
648+
dev->speed);
649+
648650
#ifdef CONFIG_BOARD_USBDEV_PIDVID
649651
{
650652
uint16_t pid = board_usbdev_pid();
@@ -1098,14 +1100,15 @@ FAR void *composite_initialize(FAR const struct usbdev_devdescs_s *devdescs,
10981100
priv->ndevices = ndevices;
10991101

11001102
/* Initialize the USB class driver structure */
1101-
1102-
#ifdef CONFIG_USBDEV_DUALSPEED
1103-
drvr->drvr.speed = USB_SPEED_HIGH;
1103+
#if defined(CONFIG_USBDEV_SUPERSPEED)
1104+
drvr->drvr.speed = USB_SPEED_SUPER;
1105+
#elif defined(CONFIG_USBDEV_DUALSPEED)
1106+
drvr->drvr.speed = USB_SPEED_HIGH;
11041107
#else
1105-
drvr->drvr.speed = USB_SPEED_FULL;
1108+
drvr->drvr.speed = USB_SPEED_FULL;
11061109
#endif
1107-
drvr->drvr.ops = &g_driverops;
1108-
drvr->dev = priv;
1110+
drvr->drvr.ops = &g_driverops;
1111+
drvr->dev = priv;
11091112

11101113
/* Register the USB composite class driver */
11111114

drivers/usbdev/pl2303.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,8 +1624,9 @@ static int usbclass_setup(FAR struct usbdevclass_driver_s *driver,
16241624
{
16251625
case USB_DESC_TYPE_DEVICE:
16261626
{
1627-
ret = USB_SIZEOF_DEVDESC;
1628-
memcpy(ctrlreq->buf, &g_devdesc, ret);
1627+
ret = usbdev_copy_devdesc(ctrlreq->buf,
1628+
&g_devdesc,
1629+
dev->speed);
16291630
}
16301631
break;
16311632

@@ -2319,7 +2320,9 @@ int usbdev_serialinitialize(int minor)
23192320

23202321
/* Initialize the USB class driver structure */
23212322

2322-
#ifdef CONFIG_USBDEV_DUALSPEED
2323+
#if defined(CONFIG_USBDEV_SUPERSPEED)
2324+
drvr->drvr.speed = USB_SPEED_SUPER;
2325+
#elif defined(CONFIG_USBDEV_DUALSPEED)
23232326
drvr->drvr.speed = USB_SPEED_HIGH;
23242327
#else
23252328
drvr->drvr.speed = USB_SPEED_FULL;

drivers/usbdev/rndis.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,8 +2426,9 @@ static int usbclass_setup(FAR struct usbdevclass_driver_s *driver,
24262426
#ifndef CONFIG_RNDIS_COMPOSITE
24272427
case USB_DESC_TYPE_DEVICE:
24282428
{
2429-
ret = USB_SIZEOF_DEVDESC;
2430-
memcpy(ctrlreq->buf, &g_devdesc, ret);
2429+
ret = usbdev_copy_devdesc(ctrlreq->buf,
2430+
&g_devdesc,
2431+
dev->speed);
24312432
}
24322433
break;
24332434
#endif
@@ -2851,7 +2852,9 @@ static int usbclass_classobject(int minor,
28512852

28522853
/* Initialize the USB class driver structure */
28532854

2854-
#ifdef CONFIG_USBDEV_DUALSPEED
2855+
#if defined(CONFIG_USBDEV_SUPERSPEED)
2856+
drvr->drvr.speed = USB_SPEED_SUPER;
2857+
#elif defined(CONFIG_USBDEV_DUALSPEED)
28552858
drvr->drvr.speed = USB_SPEED_HIGH;
28562859
#else
28572860
drvr->drvr.speed = USB_SPEED_FULL;

drivers/usbdev/usbdev_desc.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,39 @@
3232
* Public Functions
3333
****************************************************************************/
3434

35+
/****************************************************************************
36+
* Name: usbdev_copy_devdesc
37+
*
38+
* Description:
39+
* Copies the requested device Description into the dest buffer given.
40+
* Returns the number of Bytes filled in (USB_SIZEOF_DEVDESC).
41+
* This function is provided by various classes.
42+
*
43+
****************************************************************************/
44+
45+
int usbdev_copy_devdesc(FAR void *dest,
46+
FAR const struct usb_devdesc_s *src,
47+
uint8_t speed)
48+
{
49+
#ifdef CONFIG_USBDEV_SUPERSPEED
50+
FAR struct usb_devdesc_s *p_desc =
51+
(struct usb_devdesc_s *)dest;
52+
#endif
53+
54+
memcpy(dest, src, USB_SIZEOF_DEVDESC);
55+
56+
#ifdef CONFIG_USBDEV_SUPERSPEED
57+
if (speed >= USB_SPEED_SUPER)
58+
{
59+
p_desc->usb[0] = LSBYTE(0x0320),
60+
p_desc->usb[1] = MSBYTE(0x0320);
61+
p_desc->mxpacketsize = 9;
62+
}
63+
#endif
64+
65+
return USB_SIZEOF_DEVDESC;
66+
}
67+
3568
/****************************************************************************
3669
* Name: usbdev_copy_epdesc
3770
*

drivers/usbdev/usbmsc.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,8 +513,9 @@ static int usbmsc_setup(FAR struct usbdevclass_driver_s *driver,
513513
#ifndef CONFIG_USBMSC_COMPOSITE
514514
case USB_DESC_TYPE_DEVICE:
515515
{
516-
ret = USB_SIZEOF_DEVDESC;
517-
memcpy(ctrlreq->buf, usbmsc_getdevdesc(), ret);
516+
ret = usbdev_copy_devdesc(ctrlreq->buf,
517+
usbmsc_getdevdesc(),
518+
dev->speed);
518519
}
519520
break;
520521
#endif
@@ -1296,7 +1297,9 @@ int usbmsc_configure(unsigned int nluns, FAR void **handle)
12961297
/* Initialize the USB class driver structure */
12971298

12981299
drvr = &alloc->drvr;
1299-
#ifdef CONFIG_USBDEV_DUALSPEED
1300+
#if defined(CONFIG_USBDEV_SUPERSPEED)
1301+
drvr->drvr.speed = USB_SPEED_SUPER;
1302+
#elif defined(CONFIG_USBDEV_DUALSPEED)
13001303
drvr->drvr.speed = USB_SPEED_HIGH;
13011304
#else
13021305
drvr->drvr.speed = USB_SPEED_FULL;

include/nuttx/usb/usb.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@
267267
#define USB_SPEED_FULL 2 /* USB 1.1 */
268268
#define USB_SPEED_HIGH 3 /* USB 2.0 */
269269
#define USB_SPEED_VARIABLE 4 /* Wireless USB 2.5 */
270+
#define USB_SPEED_SUPER 5 /* usb 3.0 */
271+
#define USB_SPEED_SUPER_PLUS 6 /* usb 3.1 */
270272

271273
/* Maximum number of devices per controller */
272274

0 commit comments

Comments
 (0)