usbdev: modify usb device support USB3.0 MaxPacketSize
Signed-off-by: yangsong8 <yangsong8@xiaomi.com>
diff --git a/drivers/usbdev/Kconfig b/drivers/usbdev/Kconfig
index 5e757352..005fd22 100644
--- a/drivers/usbdev/Kconfig
+++ b/drivers/usbdev/Kconfig
@@ -318,6 +318,35 @@
int "Packet and request buffer sizes"
default 64
+config PL2303_EPBULK_FSSIZE
+ int "BULK endpoints full speed MAXPACKET size"
+ default 64
+ ---help---
+ Max package size for the bulk endpoint if full speed mode.
+ Default 64.
+
+if USBDEV_DUALSPEED
+
+config PL2303_EPBULK_HSSIZE
+ int "BULK endpoints high speed MAXPACKET size"
+ default 512
+ ---help---
+ Max package size for the bulk endpoint if high speed mode.
+ Default 512.
+
+endif # USBDEV_DUALSPEED
+
+if USBDEV_SUPERSPEED
+
+config PL2303_EPBULK_SSSIZE
+ int "BULK endpoints super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
config PL2303_NWRREQS
int "Number of read requests that can be in flight"
default 4
@@ -462,6 +491,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPINTIN_SSSIZE
+ int "Interrupt IN super speed MAXPACKET size"
+ default 64
+ ---help---
+ Max package size for the interrupt IN endpoint if super speed mode.
+ Default 64.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCACM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -494,6 +534,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPBULKOUT_SSSIZE
+ int "Bulk OUT out super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk OUT endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCACM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -526,6 +577,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCACM_EPBULKIN_SSSIZE
+ int "Bulk IN super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk IN endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
config CDCACM_NRDREQS
int "Number of read requests that can be in flight"
default 4
@@ -670,7 +732,7 @@
if USBDEV_DUALSPEED
config USBADB_EPBULKOUT_HSSIZE
- int "Bulk OUT out high speed MAXPACKET size"
+ int "Bulk OUT high speed MAXPACKET size"
default 512
---help---
Max package size for the bulk OUT endpoint if high speed mode.
@@ -678,6 +740,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config USBADB_EPBULKOUT_SSSIZE
+ int "Bulk OUT super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk OUT endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
config USBADB_EPBULKIN_FSSIZE
int "Bulk IN full speed MAXPACKET size"
default 64
@@ -696,6 +769,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config USBADB_EPBULKIN_SSSIZE
+ int "Bulk IN super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk IN endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
config USBADB_NRDREQS
int "Number of read requests that can be in flight"
default 4
@@ -1135,6 +1219,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPINTIN_SSSIZE
+ int "Interrupt IN super speed MAXPACKET size"
+ default 64
+ ---help---
+ Max package size for the interrupt IN endpoint if super speed mode.
+ Default 64.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCECM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -1159,7 +1254,7 @@
if USBDEV_DUALSPEED
config CDCECM_EPBULKOUT_HSSIZE
- int "Bulk OUT out high speed MAXPACKET size"
+ int "Bulk OUT high speed MAXPACKET size"
default 512
---help---
Max package size for the bulk OUT endpoint if high speed mode.
@@ -1167,6 +1262,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPBULKOUT_SSSIZE
+ int "Bulk OUT super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk OUT endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCECM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -1199,6 +1305,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCECM_EPBULKIN_SSSIZE
+ int "Bulk IN super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk IN endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCECM_COMPOSITE
# In a composite device the Vendor- and Product-ID is given by the composite
@@ -1310,6 +1427,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPINTIN_SSSIZE
+ int "Interrupt IN super speed MAXPACKET size"
+ default 64
+ ---help---
+ Max package size for the interrupt IN endpoint if super speed mode.
+ Default 64.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCNCM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -1334,7 +1462,7 @@
if USBDEV_DUALSPEED
config CDCNCM_EPBULKOUT_HSSIZE
- int "Bulk OUT out high speed MAXPACKET size"
+ int "Bulk OUT high speed MAXPACKET size"
default 512
---help---
Max package size for the bulk OUT endpoint if high speed mode.
@@ -1342,6 +1470,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPBULKOUT_SSSIZE
+ int "Bulk OUT super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk OUT endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCNCM_COMPOSITE
# In a composite device the EP-Number is configured dynamically via
@@ -1374,6 +1513,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config CDCNCM_EPBULKIN_SSSIZE
+ int "Bulk IN super speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk IN endpoint if super speed mode.
+ Default 1024.
+
+endif # USBDEV_SUPERSPEED
+
if !CDCNCM_COMPOSITE
# In a composite device the Vendor- and Product-ID is given by the composite
@@ -1519,6 +1669,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config USBMTP_EPBULKOUT_SSSIZE
+ int "Bulk OUT Super Speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk OUT endpoint if Super Speed mode.
+ Default 1024.
+
+endif # USBDEV_DUALSPEED
+
config USBMTP_EPBULKIN_FSSIZE
int "Bulk IN Full Speed MAXPACKET size"
default 64
@@ -1537,6 +1698,17 @@
endif # USBDEV_DUALSPEED
+if USBDEV_SUPERSPEED
+
+config USBMTP_EPBULKIN_SSSIZE
+ int "Bulk IN Super Speed MAXPACKET size"
+ default 1024
+ ---help---
+ Max package size for the bulk IN endpoint if Super Speed mode.
+ Default 1024.
+
+endif # USBDEV_DUALSPEED
+
config USBMTP_EPINTIN_SIZE
int "Interrupt IN MAXPACKET size"
default 28
diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c
index 0bf396b..e094d8d 100644
--- a/drivers/usbdev/adb.c
+++ b/drivers/usbdev/adb.c
@@ -117,9 +117,9 @@
#ifndef CONFIG_USBADB_COMPOSITE
static const struct usb_devdesc_s g_adb_devdesc =
{
- .len = USB_SIZEOF_DEVDESC, /* Descriptor length */
- .type = USB_DESC_TYPE_DEVICE, /* Descriptor type */
- .usb = /* USB version */
+ .len = USB_SIZEOF_DEVDESC, /* Descriptor length */
+ .type = USB_DESC_TYPE_DEVICE, /* Descriptor type */
+ .usb = /* USB version */
{
LSBYTE(0x0200),
MSBYTE(0x0200)
@@ -133,37 +133,37 @@
LSBYTE(CONFIG_USBADB_VENDORID),
MSBYTE(CONFIG_USBADB_VENDORID)
},
- .product = /* Product ID */
+ .product = /* Product ID */
{
LSBYTE(CONFIG_USBADB_PRODUCTID),
MSBYTE(CONFIG_USBADB_PRODUCTID)
},
- .device = /* Device ID */
+ .device = /* Device ID */
{
LSBYTE(USBADB_VERSIONNO),
MSBYTE(USBADB_VERSIONNO)
},
- .imfgr = USBADB_MANUFACTURERSTRID, /* Manufacturer */
- .iproduct = USBADB_PRODUCTSTRID, /* Product */
- .serno = USBADB_SERIALSTRID, /* Serial number */
- .nconfigs = USBADB_NCONFIGS, /* Number of configurations */
+ .imfgr = USBADB_MANUFACTURERSTRID, /* Manufacturer */
+ .iproduct = USBADB_PRODUCTSTRID, /* Product */
+ .serno = USBADB_SERIALSTRID, /* Serial number */
+ .nconfigs = USBADB_NCONFIGS, /* Number of configurations */
};
# ifdef CONFIG_USBDEV_DUALSPEED
static const struct usb_qualdesc_s g_adb_qualdesc =
{
- USB_SIZEOF_QUALDESC, /* len */
- USB_DESC_TYPE_DEVICEQUALIFIER, /* type */
- { /* usb */
+ USB_SIZEOF_QUALDESC, /* len */
+ USB_DESC_TYPE_DEVICEQUALIFIER, /* type */
+ { /* usb */
LSBYTE(0x0200),
MSBYTE(0x0200)
},
- 0, /* classid */
- 0, /* subclass */
- 0, /* protocol */
- CONFIG_USBADB_EP0MAXPACKET, /* mxpacketsize */
- USBADB_NCONFIGS, /* nconfigs */
- 0, /* reserved */
+ 0, /* classid */
+ 0, /* subclass */
+ 0, /* protocol */
+ CONFIG_USBADB_EP0MAXPACKET, /* mxpacketsize */
+ USBADB_NCONFIGS, /* nconfigs */
+ 0, /* reserved */
};
# endif
@@ -239,6 +239,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
.hssize = CONFIG_USBADB_EPBULKIN_HSSIZE,
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_USBADB_EPBULKIN_SSSIZE,
+#endif
.reqnum = CONFIG_USBADB_NWRREQS,
};
@@ -258,6 +261,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
.hssize = CONFIG_USBADB_EPBULKOUT_HSSIZE,
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_USBADB_EPBULKOUT_SSSIZE,
+#endif
.reqnum = CONFIG_USBADB_NRDREQS,
};
@@ -279,7 +285,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -288,19 +294,18 @@
FAR struct usbdev_devinfo_s *devinfo)
#endif
{
- bool hispeed = false;
FAR struct usb_epdesc_s *epdesc;
FAR struct usb_ifdesc_s *dest;
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (speed == USB_SPEED_HIGH);
-
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- hispeed = !hispeed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
dest = (FAR struct usb_ifdesc_s *)buf;
@@ -309,9 +314,9 @@
memcpy(dest, &g_adb_ifdesc, sizeof(g_adb_ifdesc));
usbdev_copy_epdesc(&epdesc[0], devinfo->epno[USBADB_EP_BULKIN_IDX],
- hispeed, &g_adb_epbulkin);
+ speed, &g_adb_epbulkin);
usbdev_copy_epdesc(&epdesc[1], devinfo->epno[USBADB_EP_BULKOUT_IDX],
- hispeed, &g_adb_epbulkout);
+ speed, &g_adb_epbulkout);
#ifdef CONFIG_USBADB_COMPOSITE
/* For composite device, apply possible offset to the interface numbers */
diff --git a/drivers/usbdev/cdcacm.c b/drivers/usbdev/cdcacm.c
index 7f887bd..4ec53e4 100644
--- a/drivers/usbdev/cdcacm.c
+++ b/drivers/usbdev/cdcacm.c
@@ -175,7 +175,7 @@
static int cdcacm_epconfigure(FAR struct usbdev_ep_s *ep,
enum cdcacm_epdesc_e epid, bool last,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed);
+ uint8_t speed);
static int cdcacm_setconfig(FAR struct cdcacm_dev_s *priv,
uint8_t config);
@@ -915,10 +915,10 @@
static int cdcacm_epconfigure(FAR struct usbdev_ep_s *ep,
enum cdcacm_epdesc_e epid, bool last,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
+ uint8_t speed)
{
struct usb_epdesc_s epdesc;
- cdcacm_copy_epdesc(epid, &epdesc, devinfo, hispeed);
+ cdcacm_copy_epdesc(epid, &epdesc, devinfo, speed);
return EP_CONFIGURE(ep, &epdesc, last);
}
@@ -975,18 +975,8 @@
/* Configure the IN interrupt endpoint */
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (priv->usbdev->speed == USB_SPEED_HIGH)
- {
- ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
- &priv->devinfo, true);
- }
- else
-#endif
- {
- ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
- &priv->devinfo, false);
- }
+ ret = cdcacm_epconfigure(priv->epintin, CDCACM_EPINTIN, false,
+ &priv->devinfo, priv->usbdev->speed);
if (ret < 0)
{
@@ -998,18 +988,8 @@
/* Configure the IN bulk endpoint */
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (priv->usbdev->speed == USB_SPEED_HIGH)
- {
- ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
- &priv->devinfo, true);
- }
- else
-#endif
- {
- ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
- &priv->devinfo, false);
- }
+ ret = cdcacm_epconfigure(priv->epbulkin, CDCACM_EPBULKIN, false,
+ &priv->devinfo, priv->usbdev->speed);
if (ret < 0)
{
@@ -1021,18 +1001,8 @@
/* Configure the OUT bulk endpoint */
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (priv->usbdev->speed == USB_SPEED_HIGH)
- {
- ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
- &priv->devinfo, true);
- }
- else
-#endif
- {
- ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
- &priv->devinfo, false);
- }
+ ret = cdcacm_epconfigure(priv->epbulkout, CDCACM_EPBULKOUT, true,
+ &priv->devinfo, priv->usbdev->speed);
if (ret < 0)
{
@@ -1336,8 +1306,9 @@
priv->epbulkout->priv = priv;
/* Pre-allocate read requests. The buffer size is one full packet. */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+ reqlen = CONFIG_CDCACM_EPBULKOUT_SSSIZE;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
reqlen = CONFIG_CDCACM_EPBULKOUT_HSSIZE;
#else
reqlen = CONFIG_CDCACM_EPBULKOUT_FSSIZE;
@@ -1369,7 +1340,9 @@
* shared with interrupt IN endpoint which does not need a large buffer.
*/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+ reqlen = CONFIG_CDCACM_EPBULKIN_SSSIZE;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
reqlen = CONFIG_CDCACM_EPBULKIN_HSSIZE;
#else
reqlen = CONFIG_CDCACM_EPBULKIN_FSSIZE;
@@ -1658,7 +1631,7 @@
#ifndef CONFIG_CDCACM_COMPOSITE
case USB_DESC_TYPE_CONFIG:
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
ret = cdcacm_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
dev->speed, ctrl->value[1]);
#else
@@ -2931,8 +2904,9 @@
priv->serdev.priv = priv;
/* Initialize the USB class driver structure */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+ drvr->drvr.speed = USB_SPEED_SUPER;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
drvr->drvr.speed = USB_SPEED_HIGH;
#else
drvr->drvr.speed = USB_SPEED_FULL;
@@ -3133,7 +3107,7 @@
/* Let the construction function calculate the size of config descriptor */
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
dev->cfgdescsize = cdcacm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
#else
dev->cfgdescsize = cdcacm_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/cdcacm.h b/drivers/usbdev/cdcacm.h
index 00dfe6b..8671c31 100644
--- a/drivers/usbdev/cdcacm.h
+++ b/drivers/usbdev/cdcacm.h
@@ -236,7 +236,7 @@
int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid,
FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed);
+ uint8_t speed);
/****************************************************************************
* Name: cdcacm_mkcfgdesc
@@ -246,7 +246,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type);
diff --git a/drivers/usbdev/cdcacm_desc.c b/drivers/usbdev/cdcacm_desc.c
index 5a6480f..516ab85 100644
--- a/drivers/usbdev/cdcacm_desc.c
+++ b/drivers/usbdev/cdcacm_desc.c
@@ -227,10 +227,10 @@
int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid,
FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
+ uint8_t speed)
{
-#ifndef CONFIG_USBDEV_DUALSPEED
- UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+ UNUSED(speed);
#endif
switch (epid)
@@ -242,8 +242,18 @@
epdesc->addr = CDCACM_MKEPINTIN(devinfo); /* Endpoint address */
epdesc->attr = CDCACM_EPINTIN_ATTR; /* Endpoint attributes */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPINTIN_SSSIZE);
+ epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPINTIN_SSSIZE);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
@@ -269,8 +279,19 @@
epdesc->type = USB_DESC_TYPE_ENDPOINT; /* Descriptor type */
epdesc->addr = CDCACM_MKEPBULKOUT(devinfo); /* Endpoint address */
epdesc->attr = CDCACM_EPOUTBULK_ATTR; /* Endpoint attributes */
+
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPBULKOUT_SSSIZE);
+ epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPBULKOUT_SSSIZE);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
@@ -297,8 +318,18 @@
epdesc->addr = CDCACM_MKEPBULKIN(devinfo); /* Endpoint address */
epdesc->attr = CDCACM_EPINBULK_ATTR; /* Endpoint attributes */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(CONFIG_CDCACM_EPBULKIN_SSSIZE);
+ epdesc->mxpacketsize[1] = MSBYTE(CONFIG_CDCACM_EPBULKIN_SSSIZE);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
@@ -333,7 +364,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -343,17 +374,14 @@
#endif
{
int length = 0;
- bool hispeed = false;
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (speed == USB_SPEED_HIGH);
-
- /* Check for switches between high and full speed */
-
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- hispeed = !hispeed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
/* Fill in all descriptors directly to the buf */
@@ -376,7 +404,7 @@
/* Let's calculate the size... */
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
int16_t size = cdcacm_mkcfgdesc(NULL, NULL, speed, type);
#else
int16_t size = cdcacm_mkcfgdesc(NULL, NULL);
@@ -537,7 +565,7 @@
{
cdcacm_copy_epdesc(CDCACM_EPINTIN, (struct usb_epdesc_s *)buf,
devinfo,
- hispeed);
+ speed);
buf += USB_SIZEOF_EPDESC;
}
@@ -575,7 +603,7 @@
{
cdcacm_copy_epdesc(CDCACM_EPBULKOUT, (struct usb_epdesc_s *)buf,
devinfo,
- hispeed);
+ speed);
buf += USB_SIZEOF_EPDESC;
}
@@ -587,7 +615,7 @@
{
cdcacm_copy_epdesc(CDCACM_EPBULKIN, (struct usb_epdesc_s *)buf,
devinfo,
- hispeed);
+ speed);
buf += USB_SIZEOF_EPDESC;
}
diff --git a/drivers/usbdev/cdcecm.c b/drivers/usbdev/cdcecm.c
index 1ec8430..05b904a 100644
--- a/drivers/usbdev/cdcecm.c
+++ b/drivers/usbdev/cdcecm.c
@@ -208,7 +208,7 @@
static void cdcecm_mkepdesc(int epidx,
FAR struct usb_epdesc_s *epdesc,
- FAR struct usbdev_devinfo_s *devinfo, bool hispeed);
+ FAR struct usbdev_devinfo_s *devinfo, uint8_t speed);
/****************************************************************************
* Private Data
@@ -949,7 +949,6 @@
static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config)
{
struct usb_epdesc_s epdesc;
- bool is_high_speed;
int ret = OK;
if (config == self->config)
@@ -969,7 +968,8 @@
return -EINVAL;
}
- cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, &epdesc, &self->devinfo, false);
+ cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX,
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epint, &epdesc, false);
if (ret < 0)
@@ -979,9 +979,8 @@
self->epint->priv = self;
- is_high_speed = (self->usbdev.speed == USB_SPEED_HIGH);
cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX,
- &epdesc, &self->devinfo, is_high_speed);
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epbulkin, &epdesc, false);
if (ret < 0)
@@ -992,7 +991,7 @@
self->epbulkin->priv = self;
cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX,
- &epdesc, &self->devinfo, is_high_speed);
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epbulkout, &epdesc, true);
if (ret < 0)
@@ -1141,21 +1140,34 @@
static void cdcecm_mkepdesc(int epidx,
FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
+ uint8_t speed)
{
uint16_t intin_mxpktsz = CONFIG_CDCECM_EPINTIN_FSSIZE;
uint16_t bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_FSSIZE;
uint16_t bulkin_mxpktsz = CONFIG_CDCECM_EPBULKIN_FSSIZE;
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
{
+ /* Maximum packet size (super speed) */
+
+ intin_mxpktsz = CONFIG_CDCECM_EPINTIN_SSSIZE;
+ bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_SSSIZE;
+ bulkin_mxpktsz = CONFIG_CDCECM_EPBULKIN_SSSIZE;
+ }
+ else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+ if (speed == USB_SPEED_HIGH)
+ {
+ /* Maximum packet size (high speed) */
+
intin_mxpktsz = CONFIG_CDCECM_EPINTIN_HSSIZE;
bulkout_mxpktsz = CONFIG_CDCECM_EPBULKOUT_HSSIZE;
bulkin_mxpktsz = CONFIG_CDCECM_EPBULKIN_HSSIZE;
}
#else
- UNUSED(hispeed);
+ UNUSED(speed);
#endif
epdesc->len = USB_SIZEOF_EPDESC; /* Descriptor length */
@@ -1209,7 +1221,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -1220,17 +1232,16 @@
{
FAR struct usb_cfgdesc_s *cfgdesc = NULL;
int16_t len = 0;
- bool is_high_speed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- is_high_speed = (speed == USB_SPEED_HIGH);
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- is_high_speed = !is_high_speed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
#ifndef CONFIG_CDCECM_COMPOSITE
@@ -1355,7 +1366,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, epdesc, devinfo, false);
+ cdcecm_mkepdesc(CDCECM_EP_INTIN_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -1407,7 +1418,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, is_high_speed);
+ cdcecm_mkepdesc(CDCECM_EP_BULKIN_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -1417,7 +1428,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, is_high_speed);
+ cdcecm_mkepdesc(CDCECM_EP_BULKOUT_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -1473,7 +1484,7 @@
#endif /* CONFIG_USBDEV_DUALSPEED */
case USB_DESC_TYPE_CONFIG:
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
return cdcecm_mkcfgdesc((FAR uint8_t *)desc, &self->devinfo,
self->usbdev.speed, type);
#else
@@ -2007,7 +2018,7 @@
/* Let the construction function calculate the size of config descriptor */
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
dev->cfgdescsize = cdcecm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
#else
dev->cfgdescsize = cdcecm_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/cdcncm.c b/drivers/usbdev/cdcncm.c
index 3c40f88..b64b394 100644
--- a/drivers/usbdev/cdcncm.c
+++ b/drivers/usbdev/cdcncm.c
@@ -427,7 +427,7 @@
static void cdcncm_mkepdesc(int epidx, FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed);
+ uint8_t speed);
/****************************************************************************
* Private Data
@@ -580,7 +580,7 @@
static inline uint32_t cdcncm_get(FAR uint8_t **address, size_t size)
{
- uint32_t value;
+ uint32_t value = 0;
switch (size)
{
@@ -1582,7 +1582,6 @@
static int cdcncm_setconfig(FAR struct cdcncm_driver_s *self, uint8_t config)
{
struct usb_epdesc_s epdesc;
- bool is_high_speed = self->usbdev.speed == USB_SPEED_HIGH;
int ret;
if (config == self->config)
@@ -1602,7 +1601,8 @@
return -EINVAL;
}
- cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, &epdesc, &self->devinfo, false);
+ cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX,
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epint, &epdesc, false);
if (ret < 0)
@@ -1612,7 +1612,7 @@
self->epint->priv = self;
cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX,
- &epdesc, &self->devinfo, is_high_speed);
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epbulkin, &epdesc, false);
if (ret < 0)
@@ -1623,7 +1623,7 @@
self->epbulkin->priv = self;
cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX,
- &epdesc, &self->devinfo, is_high_speed);
+ &epdesc, &self->devinfo, self->usbdev.speed);
ret = EP_CONFIGURE(self->epbulkout, &epdesc, true);
if (ret < 0)
@@ -1911,21 +1911,34 @@
static void cdcncm_mkepdesc(int epidx, FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
+ uint8_t speed)
{
uint16_t intin_mxpktsz = CONFIG_CDCNCM_EPINTIN_FSSIZE;
uint16_t bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_FSSIZE;
uint16_t bulkin_mxpktsz = CONFIG_CDCNCM_EPBULKIN_FSSIZE;
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
{
+ /* Maximum packet size (super speed) */
+
+ intin_mxpktsz = CONFIG_CDCNCM_EPINTIN_SSSIZE;
+ bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_SSSIZE;
+ bulkin_mxpktsz = CONFIG_CDCNCM_EPBULKIN_SSSIZE;
+ }
+ else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+ if (speed == USB_SPEED_HIGH)
+ {
+ /* Maximum packet size (high speed) */
+
intin_mxpktsz = CONFIG_CDCNCM_EPINTIN_HSSIZE;
bulkout_mxpktsz = CONFIG_CDCNCM_EPBULKOUT_HSSIZE;
bulkin_mxpktsz = CONFIG_CDCNCM_EPBULKIN_HSSIZE;
}
#else
- UNUSED(hispeed);
+ UNUSED(speed);
#endif
epdesc->len = USB_SIZEOF_EPDESC; /* Descriptor length */
@@ -1979,7 +1992,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type, bool isncm)
@@ -1991,17 +2004,16 @@
{
FAR struct usb_cfgdesc_s *cfgdesc = NULL;
int16_t len = 0;
- bool is_high_speed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- is_high_speed = (speed == USB_SPEED_HIGH);
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- is_high_speed = !is_high_speed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
#ifndef CONFIG_CDCNCM_COMPOSITE
@@ -2172,7 +2184,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, epdesc, devinfo, false);
+ cdcncm_mkepdesc(CDCNCM_EP_INTIN_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -2226,7 +2238,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX, epdesc, devinfo, is_high_speed);
+ cdcncm_mkepdesc(CDCNCM_EP_BULKIN_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -2236,7 +2248,7 @@
{
FAR struct usb_epdesc_s *epdesc = (FAR struct usb_epdesc_s *)desc;
- cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX, epdesc, devinfo, is_high_speed);
+ cdcncm_mkepdesc(CDCNCM_EP_BULKOUT_IDX, epdesc, devinfo, speed);
desc += USB_SIZEOF_EPDESC;
}
@@ -2260,7 +2272,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t cdcncm_mkcfgdesc(FAR uint8_t *desc,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -2339,7 +2351,7 @@
case USB_DESC_TYPE_OTHERSPEEDCONFIG:
#endif /* CONFIG_USBDEV_DUALSPEED */
case USB_DESC_TYPE_CONFIG:
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
return cdcncm_mkcfgdesc((FAR uint8_t *)desc, &self->devinfo,
self->usbdev.speed, type);
#else
@@ -3070,7 +3082,7 @@
/* Let the construction function calculate the size of config descriptor */
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
dev->cfgdescsize = isncm ?
cdcncm_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0) :
cdcmbim_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
diff --git a/drivers/usbdev/composite.c b/drivers/usbdev/composite.c
index 8e3f990..e793a8f 100644
--- a/drivers/usbdev/composite.c
+++ b/drivers/usbdev/composite.c
@@ -277,7 +277,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t composite_mkcfgdesc(FAR struct usbdevclass_driver_s *driver,
FAR uint8_t *buf,
uint8_t speed, uint8_t type)
@@ -313,7 +313,7 @@
{
FAR struct composite_devobj_s *devobj = &priv->device[i];
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
len = devobj->compdesc.mkconfdesc(buf,
&devobj->compdesc.devinfo,
speed, type);
@@ -677,7 +677,7 @@
case USB_DESC_TYPE_CONFIG:
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
ret = composite_mkcfgdesc(driver, ctrlreq->buf,
dev->speed, ctrl->value[1]);
#else
diff --git a/drivers/usbdev/dfu.c b/drivers/usbdev/dfu.c
index 9e4b0af..1cc4fc3 100644
--- a/drivers/usbdev/dfu.c
+++ b/drivers/usbdev/dfu.c
@@ -181,11 +181,22 @@
{
}
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
+ FAR struct usbdev_devinfo_s *devinfo,
+ uint8_t speed, uint8_t type)
+#else
static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo)
+#endif
{
FAR struct dfu_cfgdesc_s *dest = (FAR struct dfu_cfgdesc_s *)buf;
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ UNUSED(speed);
+ UNUSED(type);
+#endif
+
*dest = g_dfu_cfgdesc;
dest->ifdesc.ifno += devinfo->ifnobase;
dest->ifdesc.iif = devinfo->strbase;
@@ -308,7 +319,12 @@
{
if (ctrl->value[1] == USB_DESC_TYPE_CONFIG)
{
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
+ dev->speed, ctrl->value[1]);
+#else
ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo);
+#endif
}
else if (ctrl->value[1] == USB_DESC_TYPE_STRING)
{
diff --git a/drivers/usbdev/mtp.c b/drivers/usbdev/mtp.c
index 2c46719..22888d1 100644
--- a/drivers/usbdev/mtp.c
+++ b/drivers/usbdev/mtp.c
@@ -227,6 +227,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
.hssize = CONFIG_USBMTP_EPBULKIN_HSSIZE,
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_USBMTP_EPBULKIN_SSSIZE,
+#endif
.reqnum = CONFIG_USBMTP_NWRREQS,
};
@@ -246,6 +249,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
.hssize = CONFIG_USBMTP_EPBULKOUT_HSSIZE,
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_USBMTP_EPBULKOUT_SSSIZE,
+#endif
.reqnum = CONFIG_USBMTP_NRDREQS,
};
@@ -265,6 +271,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
.hssize = CONFIG_USBMTP_EPINTIN_SIZE,
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_USBMTP_EPINTIN_SIZE,
+#endif
.reqnum = CONFIG_USBMTP_NWRREQS,
};
@@ -287,7 +296,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -296,19 +305,18 @@
FAR struct usbdev_devinfo_s *devinfo)
#endif
{
- bool hispeed = false;
FAR struct usb_epdesc_s *epdesc;
FAR struct usb_ifdesc_s *dest;
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (speed == USB_SPEED_HIGH);
-
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- hispeed = !hispeed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
dest = (FAR struct usb_ifdesc_s *)buf;
@@ -317,11 +325,11 @@
memcpy(dest, &g_mtp_ifdesc, sizeof(g_mtp_ifdesc));
usbdev_copy_epdesc(&epdesc[0], devinfo->epno[USBMTP_EP_BULKIN_IDX],
- hispeed, &g_mtp_epbulkin);
+ speed, &g_mtp_epbulkin);
usbdev_copy_epdesc(&epdesc[1], devinfo->epno[USBMTP_EP_BULKOUT_IDX],
- hispeed, &g_mtp_epbulkout);
+ speed, &g_mtp_epbulkout);
usbdev_copy_epdesc(&epdesc[2], devinfo->epno[USBMTP_EP_INTIN_IDX],
- hispeed, &g_mtp_epbulkintin);
+ speed, &g_mtp_epbulkintin);
#ifdef CONFIG_USBMTP_COMPOSITE
/* For composite device, apply possible offset to the interface numbers */
diff --git a/drivers/usbdev/pl2303.c b/drivers/usbdev/pl2303.c
index 116ff84..8927f6c 100644
--- a/drivers/usbdev/pl2303.c
+++ b/drivers/usbdev/pl2303.c
@@ -293,9 +293,9 @@
/* Configuration ************************************************************/
static int usbclass_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc);
-#ifdef CONFIG_USBDEV_DUALSPEED
static void usbclass_mkepbulkdesc(const struct usb_epdesc_s *indesc,
uint16_t mxpacket, struct usb_epdesc_s *outdesc);
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t usbclass_mkcfgdesc(uint8_t *buf, uint8_t speed, uint8_t type);
#else
static int16_t usbclass_mkcfgdesc(uint8_t *buf);
@@ -835,7 +835,6 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
static inline void usbclass_mkepbulkdesc(
FAR const struct usb_epdesc_s *indesc,
uint16_t mxpacket,
@@ -850,7 +849,6 @@
outdesc->mxpacketsize[0] = LSBYTE(mxpacket);
outdesc->mxpacketsize[1] = MSBYTE(mxpacket);
}
-#endif
/****************************************************************************
* Name: usbclass_mkcfgdesc
@@ -860,19 +858,25 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t usbclass_mkcfgdesc(uint8_t *buf, uint8_t speed, uint8_t type)
#else
static int16_t usbclass_mkcfgdesc(uint8_t *buf)
#endif
{
FAR struct usb_cfgdesc_s *cfgdesc = (FAR struct usb_cfgdesc_s *)buf;
-#ifdef CONFIG_USBDEV_DUALSPEED
- bool hispeed = (speed == USB_SPEED_HIGH);
- uint16_t bulkmxpacket;
-#endif
+ uint16_t bulkmxpacket = CONFIG_PL2303_EPBULK_FSSIZE;
uint16_t totallen;
+ /* Check for switches between high and full speed */
+
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
+ {
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
+ }
+#endif
+
/* This is the total length of the configuration (not necessarily the
* size that we will be sending now.
*/
@@ -892,40 +896,28 @@
memcpy(buf, &g_ifdesc, USB_SIZEOF_IFDESC);
buf += USB_SIZEOF_IFDESC;
- /* Make the three endpoint configurations. First, check for switches
- * between high and full speed
- */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
- {
- hispeed = !hispeed;
- }
-#endif
-
memcpy(buf, &g_epintindesc, USB_SIZEOF_EPDESC);
buf += USB_SIZEOF_EPDESC;
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
{
- bulkmxpacket = 512;
+ bulkmxpacket = CONFIG_PL2303_EPBULK_SSSIZE;
}
else
+#endif
+#ifdef CONFIG_USBDEV_DUALSPEED
+ if (speed == USB_SPEED_HIGH)
{
- bulkmxpacket = 64;
+ bulkmxpacket = CONFIG_PL2303_EPBULK_HSSIZE;
}
+#endif
usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket,
(FAR struct usb_epdesc_s *)buf);
buf += USB_SIZEOF_EPDESC;
usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket,
(FAR struct usb_epdesc_s *)buf);
-#else
- memcpy(buf, &g_epbulkoutdesc, USB_SIZEOF_EPDESC);
- buf += USB_SIZEOF_EPDESC;
- memcpy(buf, &g_epbulkindesc, USB_SIZEOF_EPDESC);
-#endif
/* Finally, fill in the total size of the configuration descriptor */
@@ -982,10 +974,8 @@
static int usbclass_setconfig(FAR struct pl2303_dev_s *priv, uint8_t config)
{
FAR struct usbdev_req_s *req;
-#ifdef CONFIG_USBDEV_DUALSPEED
struct usb_epdesc_s epdesc;
- uint16_t bulkmxpacket;
-#endif
+ uint16_t bulkmxpacket = CONFIG_PL2303_EPBULK_FSSIZE;
int i;
int ret = 0;
@@ -1038,21 +1028,23 @@
/* Configure the IN bulk endpoint */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (priv->usbdev->speed == USB_SPEED_SUPER ||
+ priv->usbdev->speed == USB_SPEED_SUPER_PLUS)
+ {
+ bulkmxpacket = CONFIG_PL2303_EPBULK_SSSIZE;
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
if (priv->usbdev->speed == USB_SPEED_HIGH)
{
- bulkmxpacket = 512;
+ bulkmxpacket = CONFIG_PL2303_EPBULK_HSSIZE;
}
- else
- {
- bulkmxpacket = 64;
- }
+#endif
usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket, &epdesc);
ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
-#else
- ret = EP_CONFIGURE(priv->epbulkin, &g_epbulkindesc, false);
-#endif
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKINCONFIGFAIL), 0);
@@ -1063,12 +1055,8 @@
/* Configure the OUT bulk endpoint */
-#ifdef CONFIG_USBDEV_DUALSPEED
usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket, &epdesc);
ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
-#else
- ret = EP_CONFIGURE(priv->epbulkout, &g_epbulkoutdesc, true);
-#endif
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPBULKOUTCONFIGFAIL), 0);
@@ -1273,7 +1261,7 @@
((FAR struct pl2303_driver_s *)driver)->dev;
FAR struct pl2303_req_s *reqcontainer;
irqstate_t flags;
- uint16_t reqlen;
+ uint16_t reqlen = CONFIG_PL2303_EPBULK_FSSIZE;
int ret;
int i;
@@ -1351,10 +1339,19 @@
/* Pre-allocate read requests. The buffer size is one full packet. */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (dev->speed == USB_SPEED_SUPER ||
+ dev->speed == USB_SPEED_SUPER_PLUS)
+ {
+ reqlen = CONFIG_PL2303_EPBULK_SSSIZE;
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- reqlen = 512;
-#else
- reqlen = 64;
+ if (dev->speed == USB_SPEED_HIGH)
+ {
+ reqlen = CONFIG_PL2303_EPBULK_HSSIZE;
+ }
#endif
for (i = 0; i < CONFIG_PL2303_NRDREQS; i++)
@@ -1380,12 +1377,6 @@
* size.
*/
-#ifdef CONFIG_USBDEV_DUALSPEED
- reqlen = 512;
-#else
- reqlen = 64;
-#endif
-
if (CONFIG_PL2303_BULKIN_REQLEN > reqlen)
{
reqlen = CONFIG_CDCACM_BULKIN_REQLEN;
@@ -1643,7 +1634,7 @@
case USB_DESC_TYPE_CONFIG:
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
ret = usbclass_mkcfgdesc(ctrlreq->buf,
dev->speed, ctrl->req);
#else
diff --git a/drivers/usbdev/rndis.c b/drivers/usbdev/rndis.c
index 50ec804..e7eaf48 100644
--- a/drivers/usbdev/rndis.c
+++ b/drivers/usbdev/rndis.c
@@ -248,12 +248,6 @@
static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config);
static void usbclass_resetconfig(FAR struct rndis_dev_s *priv);
-/* usbclass helpers */
-
-static int usbclass_copy_epdesc(int epid, FAR struct usb_epdesc_s *epdesc,
- FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed);
-
/****************************************************************************
* Private Data
****************************************************************************/
@@ -293,111 +287,149 @@
};
#endif
-const static struct rndis_cfgdesc_s g_rndis_cfgdesc =
+#ifndef CONFIG_RNDIS_COMPOSITE
+
+ /* Configuration descriptor */
+
+static const struct usb_cfgdesc_s g_rndis_cfgdesc =
{
-#ifndef CONFIG_RNDIS_COMPOSITE
+ .len = USB_SIZEOF_CFGDESC,
+ .type = USB_DESC_TYPE_CONFIG,
+ .totallen =
{
- .len = USB_SIZEOF_CFGDESC,
- .type = USB_DESC_TYPE_CONFIG,
- .totallen =
- {
- 0, 0
- },
- .ninterfaces = RNDIS_NINTERFACES,
- .cfgvalue = RNDIS_CONFIGID,
- .icfg = 0,
- .attr = USB_CONFIG_ATTR_ONE | USB_CONFIG_ATTR_SELFPOWER,
- .mxpower = (CONFIG_USBDEV_MAXPOWER + 1) / 2
+ 0, 0
},
+ .ninterfaces = RNDIS_NINTERFACES,
+ .cfgvalue = RNDIS_CONFIGID,
+ .icfg = 0,
+ .attr = USB_CONFIG_ATTR_ONE | USB_CONFIG_ATTR_SELFPOWER,
+ .mxpower = (CONFIG_USBDEV_MAXPOWER + 1) / 2
+};
#elif defined(CONFIG_COMPOSITE_IAD)
- {
- .len = USB_SIZEOF_IADDESC,
- .type = USB_DESC_TYPE_INTERFACEASSOCIATION,
- .firstif = 0,
- .nifs = RNDIS_NINTERFACES,
- .classid = 0xef,
- .subclass = 0x04,
- .protocol = 0x01,
- .ifunction = 0
- },
+
+ /* Interface association descriptor */
+
+static const struct usb_iaddesc_s g_rndis_assoc_desc =
+{
+ .len = USB_SIZEOF_IADDESC,
+ .type = USB_DESC_TYPE_INTERFACEASSOCIATION,
+ .firstif = 0,
+ .nifs = RNDIS_NINTERFACES,
+ .classid = 0xef,
+ .subclass = 0x04,
+ .protocol = 0x01,
+ .ifunction = 0
+};
#endif
- {
- .len = USB_SIZEOF_IFDESC,
- .type = USB_DESC_TYPE_INTERFACE,
- .ifno = 0,
- .alt = 0,
- .neps = 1,
- .classid = USB_CLASS_CDC,
- .subclass = CDC_SUBCLASS_ACM,
- .protocol = CDC_PROTO_VENDOR,
- .iif = 0
- },
- {
- .len = USB_SIZEOF_EPDESC,
- .type = USB_DESC_TYPE_ENDPOINT,
-#ifndef CONFIG_RNDIS_COMPOSITE
- .addr = RNDIS_EPINTIN_ADDR,
-#endif
- .attr = USB_EP_ATTR_XFER_INT,
- .mxpacketsize =
+
+ /* Communication interface descriptor */
+
+static const struct usb_ifdesc_s g_rndis_comm_ifdesc =
+{
+ .len = USB_SIZEOF_IFDESC,
+ .type = USB_DESC_TYPE_INTERFACE,
+ .ifno = 0,
+ .alt = 0,
+ .neps = 1,
+ .classid = USB_CLASS_CDC,
+ .subclass = CDC_SUBCLASS_ACM,
+ .protocol = CDC_PROTO_VENDOR,
+ .iif = 0
+};
+
+ /* Interrupt endpoint descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epintindesc =
+{
+ .desc =
{
- LSBYTE(16), MSBYTE(16)
- },
- .interval = 1
- },
- {
- .len = USB_SIZEOF_IFDESC,
- .type = USB_DESC_TYPE_INTERFACE,
- .ifno = 1,
- .alt = 0,
- .neps = 2,
- .classid = USB_CLASS_CDC_DATA,
- .subclass = 0,
- .protocol = 0,
- .iif = 0
- },
- {
- .len = USB_SIZEOF_EPDESC,
- .type = USB_DESC_TYPE_ENDPOINT,
+ .len = USB_SIZEOF_EPDESC,
+ .type = USB_DESC_TYPE_ENDPOINT,
#ifndef CONFIG_RNDIS_COMPOSITE
- .addr = RNDIS_EPBULKIN_ADDR,
+ .addr = RNDIS_EPINTIN_ADDR,
#endif
- .attr = USB_EP_ATTR_XFER_BULK,
+ .attr = USB_EP_ATTR_XFER_INT,
+ .interval = 1
+ },
+ .fssize = CONFIG_RNDIS_EPINTIN_FSSIZE,
#ifdef CONFIG_USBDEV_DUALSPEED
- .mxpacketsize =
- {
- LSBYTE(512), MSBYTE(512)
- },
- .interval = 0
-#else
- .mxpacketsize =
- {
- LSBYTE(64), MSBYTE(64)
- },
- .interval = 1
+ .hssize = CONFIG_RNDIS_EPINTIN_HSSIZE,
#endif
- },
- {
- .len = USB_SIZEOF_EPDESC,
- .type = USB_DESC_TYPE_ENDPOINT,
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_RNDIS_EPINTIN_HSSIZE,
+#endif
+ .reqnum = 1,
+};
+
+ /* Data interface descriptor */
+
+static const struct usb_ifdesc_s g_rndis_data_ifdesc =
+{
+ .len = USB_SIZEOF_IFDESC,
+ .type = USB_DESC_TYPE_INTERFACE,
+ .ifno = 1,
+ .alt = 0,
+ .neps = 2,
+ .classid = USB_CLASS_CDC_DATA,
+ .subclass = 0,
+ .protocol = 0,
+ .iif = 0
+};
+
+ /* Bulk in interface descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epbulkindesc =
+{
+ .desc =
+ {
+ .len = USB_SIZEOF_EPDESC,
+ .type = USB_DESC_TYPE_ENDPOINT,
#ifndef CONFIG_RNDIS_COMPOSITE
- .addr = RNDIS_EPBULKOUT_ADDR,
+ .addr = RNDIS_EPBULKIN_ADDR,
#endif
- .attr = USB_EP_ATTR_XFER_BULK,
+ .attr = USB_EP_ATTR_XFER_BULK,
#ifdef CONFIG_USBDEV_DUALSPEED
- .mxpacketsize =
- {
- LSBYTE(512), MSBYTE(512)
- },
- .interval = 0
+ .interval = 0
#else
- .mxpacketsize =
- {
- LSBYTE(64), MSBYTE(64)
- },
- .interval = 1
+ .interval = 1
#endif
- }
+ },
+ .fssize = CONFIG_RNDIS_EPBULKIN_FSSIZE,
+#ifdef CONFIG_USBDEV_DUALSPEED
+ .hssize = CONFIG_RNDIS_EPBULKIN_HSSIZE,
+#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_RNDIS_EPBULKIN_SSSIZE,
+#endif
+ .reqnum = 1,
+};
+
+ /* Bulk out interface descriptor */
+
+static const struct usbdev_epinfo_s g_rndis_epbulkoutdesc =
+{
+ .desc =
+ {
+ .len = USB_SIZEOF_EPDESC,
+ .type = USB_DESC_TYPE_ENDPOINT,
+#ifndef CONFIG_RNDIS_COMPOSITE
+ .addr = RNDIS_EPBULKOUT_ADDR,
+#endif
+ .attr = USB_EP_ATTR_XFER_BULK,
+#ifdef CONFIG_USBDEV_DUALSPEED
+ .interval = 0
+#else
+ .interval = 1
+#endif
+ },
+ .fssize = CONFIG_RNDIS_EPBULKOUT_FSSIZE,
+#ifdef CONFIG_USBDEV_DUALSPEED
+ .hssize = CONFIG_RNDIS_EPBULKOUT_HSSIZE,
+#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ .sssize = CONFIG_RNDIS_EPBULKOUT_SSSIZE,
+#endif
+ .reqnum = 1,
};
/* Default MAC address given to the host side of the interface. */
@@ -452,7 +484,7 @@
g_rndis_supported_oids
},
{RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE, 4, CONFIG_NET_ETH_PKTSIZE, NULL},
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
{RNDIS_OID_GEN_LINK_SPEED, 4, 100000, NULL},
#else
{RNDIS_OID_GEN_LINK_SPEED, 4, 2000000, NULL},
@@ -1871,116 +1903,6 @@
}
/****************************************************************************
- * Name: usbclass_copy_epdesc
- *
- * Description:
- * Copies the requested Endpoint Description into the buffer given.
- * Returns the number of Bytes filled in ( sizeof(struct usb_epdesc_s) ).
- *
- ****************************************************************************/
-
-static int usbclass_copy_epdesc(int epid, FAR struct usb_epdesc_s *epdesc,
- FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
-{
-#ifndef CONFIG_USBDEV_DUALSPEED
- UNUSED(hispeed);
-#endif
-
- switch (epid)
- {
- case RNDIS_EP_INTIN_IDX: /* Interrupt IN endpoint */
- {
- epdesc->len = USB_SIZEOF_EPDESC; /* Descriptor length */
- epdesc->type = USB_DESC_TYPE_ENDPOINT; /* Descriptor type */
- epdesc->addr = RNDIS_MKEPINTIN(devinfo); /* Endpoint address */
- epdesc->attr = RNDIS_EPINTIN_ATTR; /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
- {
- /* Maximum packet size (high speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPINTIN_HSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPINTIN_HSSIZE);
- }
- else
-#endif
- {
- /* Maximum packet size (full speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPINTIN_FSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPINTIN_FSSIZE);
- }
-
- epdesc->interval = 10; /* Interval */
- }
- break;
-
- case RNDIS_EP_BULKOUT_IDX: /* Bulk OUT endpoint */
- {
- epdesc->len = USB_SIZEOF_EPDESC; /* Descriptor length */
- epdesc->type = USB_DESC_TYPE_ENDPOINT; /* Descriptor type */
- epdesc->addr = RNDIS_MKEPBULKOUT(devinfo); /* Endpoint address */
- epdesc->attr = RNDIS_EPOUTBULK_ATTR; /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
- {
- /* Maximum packet size (high speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKOUT_HSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKOUT_HSSIZE);
- }
- else
-#endif
- {
- /* Maximum packet size (full speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKOUT_FSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKOUT_FSSIZE);
- }
-
- epdesc->interval = 0; /* Interval */
- }
- break;
-
- case RNDIS_EP_BULKIN_IDX: /* Bulk IN endpoint */
- {
- epdesc->len = USB_SIZEOF_EPDESC; /* Descriptor length */
- epdesc->type = USB_DESC_TYPE_ENDPOINT; /* Descriptor type */
- epdesc->addr = RNDIS_MKEPBULKIN(devinfo); /* Endpoint address */
- epdesc->attr = RNDIS_EPINBULK_ATTR; /* Endpoint attributes */
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
- {
- /* Maximum packet size (high speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKIN_HSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKIN_HSSIZE);
- }
- else
-#endif
- {
- /* Maximum packet size (full speed) */
-
- epdesc->mxpacketsize[0] = LSBYTE(CONFIG_RNDIS_EPBULKIN_FSSIZE);
- epdesc->mxpacketsize[1] = MSBYTE(CONFIG_RNDIS_EPBULKIN_FSSIZE);
- }
-
- epdesc->interval = 0; /* Interval */
- }
- break;
-
- default:
- return 0;
- }
-
- return sizeof(struct usb_epdesc_s);
-}
-
-/****************************************************************************
* Name: usbclass_mkcfgdesc
*
* Description:
@@ -1988,7 +1910,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -1997,56 +1919,131 @@
FAR struct usbdev_devinfo_s *devinfo)
#endif
{
- FAR struct rndis_cfgdesc_s *dest = (FAR struct rndis_cfgdesc_s *)buf;
- bool hispeed = false;
- uint16_t totallen;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (speed == USB_SPEED_HIGH);
+ uint16_t totallen = 0;
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed < USB_SPEED_SUPER)
{
- hispeed = !hispeed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
/* This is the total length of the configuration (not necessarily the
* size that we will be sending now).
*/
-
- totallen = sizeof(g_rndis_cfgdesc);
-
- if (dest != NULL)
- {
- memcpy(dest, &g_rndis_cfgdesc, totallen);
-
- usbclass_copy_epdesc(RNDIS_EP_INTIN_IDX, &dest->epintindesc,
- devinfo, hispeed);
- usbclass_copy_epdesc(RNDIS_EP_BULKIN_IDX, &dest->epbulkindesc,
- devinfo, hispeed);
- usbclass_copy_epdesc(RNDIS_EP_BULKOUT_IDX, &dest->epbulkoutdesc,
- devinfo, hispeed);
-
#ifndef CONFIG_RNDIS_COMPOSITE
- /* For a stand-alone device, just fill in the total length */
-
- dest->cfgdesc.totallen[0] = LSBYTE(totallen);
- dest->cfgdesc.totallen[1] = MSBYTE(totallen);
-#else
- /* For composite device, apply possible offset to the interface
- * numbers
+ if (buf != NULL)
+ {
+ /* Configuration descriptor.
+ * If the USB serial device is configured as part of composite device,
+ * then the configuration descriptor will be provided by the
+ * composite device logic.
*/
-# ifdef CONFIG_COMPOSITE_IAD
- dest->assoc_desc.firstif += devinfo->ifnobase;
-# endif
- dest->comm_ifdesc.ifno += devinfo->ifnobase;
- dest->data_ifdesc.ifno += devinfo->ifnobase;
+ FAR struct usb_cfgdesc_s *dest = (FAR struct usb_cfgdesc_s *)buf;
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ int16_t size = usbclass_mkcfgdesc(NULL, NULL, speed, type);
+#else
+ int16_t size = usbclass_mkcfgdesc(NULL, NULL);
#endif
+
+ memcpy(buf, &g_rndis_cfgdesc, sizeof(struct usb_cfgdesc_s));
+#ifdef CONFIG_USBDEV_DUALSPEED
+ dest->type = type; /* Descriptor type */
+#endif
+ dest->totallen[0] = LSBYTE(size); /* LS Total length */
+ dest->totallen[1] = MSBYTE(size); /* MS Total length */
+
+ buf += sizeof(struct usb_cfgdesc_s);
}
+ totallen += sizeof(struct usb_cfgdesc_s);
+
+#elif defined(CONFIG_COMPOSITE_IAD)
+ /* Interface association descriptor */
+
+ if (buf != NULL)
+ {
+ FAR struct usb_iaddesc_s *dest = (FAR struct usb_iaddesc_s *)buf;
+
+ memcpy(dest, &g_rndis_assoc_desc, sizeof(struct usb_iaddesc_s));
+ dest->firstif += devinfo->ifnobase;
+
+ buf += sizeof(struct usb_iaddesc_s);
+ }
+
+ totallen += sizeof(struct usb_iaddesc_s);
+#endif
+
+ if (buf != NULL)
+ {
+ FAR struct usb_ifdesc_s *dest = (FAR struct usb_ifdesc_s *)buf;
+
+ memcpy(dest, &g_rndis_comm_ifdesc, sizeof(struct usb_ifdesc_s));
+#ifdef CONFIG_RNDIS_COMPOSITE
+ dest->ifno += devinfo->ifnobase;
+#endif
+ buf += sizeof(struct usb_ifdesc_s);
+ }
+
+ totallen += sizeof(struct usb_ifdesc_s);
+
+ if (buf != NULL)
+ {
+ usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+ devinfo->epno[RNDIS_EP_INTIN_IDX],
+ speed,
+ &g_rndis_epintindesc
+ );
+
+ buf += USB_SIZEOF_EPDESC;
+ }
+
+ totallen += USB_SIZEOF_EPDESC;
+
+ if (buf != NULL)
+ {
+ FAR struct usb_ifdesc_s *dest = (FAR struct usb_ifdesc_s *)buf;
+
+ memcpy(dest, &g_rndis_data_ifdesc, sizeof(struct usb_ifdesc_s));
+#ifdef CONFIG_RNDIS_COMPOSITE
+ dest->ifno += devinfo->ifnobase;
+#endif
+ buf += sizeof(struct usb_ifdesc_s);
+ }
+
+ totallen += sizeof(struct usb_ifdesc_s);
+
+ if (buf != NULL)
+ {
+ usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+ devinfo->epno[RNDIS_EP_BULKIN_IDX],
+ speed,
+ &g_rndis_epbulkindesc
+ );
+
+ buf += USB_SIZEOF_EPDESC;
+ }
+
+ totallen += USB_SIZEOF_EPDESC;
+
+ if (buf != NULL)
+ {
+ usbdev_copy_epdesc((struct usb_epdesc_s *)buf,
+ devinfo->epno[RNDIS_EP_BULKOUT_IDX],
+ speed,
+ &g_rndis_epbulkoutdesc
+ );
+
+ buf += USB_SIZEOF_EPDESC;
+ }
+
+ totallen += USB_SIZEOF_EPDESC;
+
return totallen;
}
@@ -2444,7 +2441,7 @@
# endif /* CONFIG_USBDEV_DUALSPEED */
case USB_DESC_TYPE_CONFIG:
{
-# ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
ret = usbclass_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
dev->speed, ctrl->req);
# else
@@ -2688,7 +2685,6 @@
static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config)
{
struct usb_epdesc_s epdesc;
- bool hispeed = false;
int ret = 0;
#ifdef CONFIG_DEBUG_FEATURES
@@ -2699,10 +2695,6 @@
}
#endif
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (priv->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
if (config == priv->config)
{
/* Already configured -- Do nothing */
@@ -2733,7 +2725,10 @@
/* Configure the IN interrupt endpoint */
- usbclass_copy_epdesc(RNDIS_EP_INTIN_IDX, &epdesc, &priv->devinfo, hispeed);
+ usbdev_copy_epdesc(&epdesc,
+ priv->devinfo.epno[RNDIS_EP_INTIN_IDX],
+ priv->usbdev->speed,
+ &g_rndis_epintindesc);
ret = EP_CONFIGURE(priv->epintin, &epdesc, false);
if (ret < 0)
{
@@ -2745,8 +2740,10 @@
/* Configure the IN bulk endpoint */
- usbclass_copy_epdesc(RNDIS_EP_BULKIN_IDX,
- &epdesc, &priv->devinfo, hispeed);
+ usbdev_copy_epdesc(&epdesc,
+ priv->devinfo.epno[RNDIS_EP_BULKIN_IDX],
+ priv->usbdev->speed,
+ &g_rndis_epbulkindesc);
ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
if (ret < 0)
@@ -2759,8 +2756,10 @@
/* Configure the OUT bulk endpoint */
- usbclass_copy_epdesc(RNDIS_EP_BULKOUT_IDX,
- &epdesc, &priv->devinfo, hispeed);
+ usbdev_copy_epdesc(&epdesc,
+ priv->devinfo.epno[RNDIS_EP_BULKOUT_IDX],
+ priv->usbdev->speed,
+ &g_rndis_epbulkoutdesc);
ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
if (ret < 0)
@@ -3017,7 +3016,7 @@
/* Let the construction function calculate the size of config descriptor */
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
dev->cfgdescsize = usbclass_mkcfgdesc(NULL, NULL, USB_SPEED_UNKNOWN, 0);
#else
dev->cfgdescsize = usbclass_mkcfgdesc(NULL, NULL);
diff --git a/drivers/usbdev/usbdev_desc.c b/drivers/usbdev/usbdev_desc.c
index f9c12e8..7d2594e 100644
--- a/drivers/usbdev/usbdev_desc.c
+++ b/drivers/usbdev/usbdev_desc.c
@@ -76,18 +76,28 @@
****************************************************************************/
void usbdev_copy_epdesc(FAR struct usb_epdesc_s *epdesc,
- uint8_t epno, bool hispeed,
+ uint8_t epno, uint8_t speed,
FAR const struct usbdev_epinfo_s *epinfo)
{
-#ifndef CONFIG_USBDEV_DUALSPEED
- UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+ UNUSED(speed);
#endif
memcpy(epdesc, &epinfo->desc, sizeof(struct usb_epdesc_s));
epdesc->addr |= epno;
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(epinfo->sssize);
+ epdesc->mxpacketsize[1] = MSBYTE(epinfo->sssize);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
diff --git a/drivers/usbdev/usbdev_fs.c b/drivers/usbdev/usbdev_fs.c
index cacc62d..02b5388 100644
--- a/drivers/usbdev/usbdev_fs.c
+++ b/drivers/usbdev/usbdev_fs.c
@@ -933,7 +933,9 @@
FAR const struct usbdev_epinfo_s *epinfo,
FAR struct usbdev_fs_ep_s *fs_ep)
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_SUPERSPEED)
+ uint16_t reqsize = epinfo->sssize;
+#elif defined(CONFIG_USBDEV_DUALSPEED)
uint16_t reqsize = epinfo->hssize;
#else
uint16_t reqsize = epinfo->fssize;
@@ -1143,7 +1145,6 @@
{
FAR struct usbdev_devinfo_s *devinfo = &fs->devinfo;
struct usb_epdesc_s epdesc;
- bool hispeed = false;
uint16_t i;
uint16_t j;
int ret;
@@ -1160,16 +1161,12 @@
return 0;
}
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (fs->cdev->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
for (i = 0; i < devinfo->nendpoints; i++)
{
FAR struct usbdev_fs_ep_s *fs_ep = &fs->eps[i];
usbdev_copy_epdesc(&epdesc, devinfo->epno[i],
- hispeed, devinfo->epinfos[i]);
+ fs->cdev->usbdev->speed, devinfo->epinfos[i]);
ret = EP_CONFIGURE(fs_ep->ep, &epdesc,
(i == (devinfo->nendpoints - 1)));
if (ret < 0)
diff --git a/drivers/usbdev/usbmsc.c b/drivers/usbdev/usbmsc.c
index 8298a0a..b679335 100644
--- a/drivers/usbdev/usbmsc.c
+++ b/drivers/usbdev/usbmsc.c
@@ -207,7 +207,9 @@
* const, canned descriptors.
*/
+#if !defined(CONFIG_USBDEV_SUPERSPEED) && !defined(CONFIG_USBMSC_COMPOSITE)
DEBUGASSERT(CONFIG_USBMSC_EP0MAXPACKET == dev->ep0->maxpacket);
+#endif
/* Preallocate control request */
@@ -544,7 +546,7 @@
#ifndef CONFIG_USBMSC_COMPOSITE
case USB_DESC_TYPE_CONFIG:
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
ret = usbmsc_mkcfgdesc(ctrlreq->buf, &priv->devinfo,
dev->speed, ctrl->value[1]);
#else
@@ -872,7 +874,6 @@
FAR struct usbmsc_req_s *privreq;
FAR struct usbdev_req_s *req;
struct usb_epdesc_s epdesc;
- bool hispeed = false;
int i;
int ret = 0;
@@ -892,10 +893,6 @@
return OK;
}
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (priv->usbdev->speed == USB_SPEED_HIGH);
-#endif
-
/* Discard the previous configuration data */
usbmsc_resetconfig(priv);
@@ -919,7 +916,7 @@
/* Configure the IN bulk endpoint */
usbmsc_copy_epdesc(USBMSC_EPBULKIN, &epdesc, &priv->devinfo,
- hispeed);
+ priv->usbdev->speed);
ret = EP_CONFIGURE(priv->epbulkin, &epdesc, false);
if (ret < 0)
{
@@ -932,7 +929,7 @@
/* Configure the OUT bulk endpoint */
usbmsc_copy_epdesc(USBMSC_EPBULKOUT, &epdesc, &priv->devinfo,
- hispeed);
+ priv->usbdev->speed);
ret = EP_CONFIGURE(priv->epbulkout, &epdesc, true);
if (ret < 0)
{
diff --git a/drivers/usbdev/usbmsc.h b/drivers/usbdev/usbmsc.h
index ee96007..7fa463d 100644
--- a/drivers/usbdev/usbmsc.h
+++ b/drivers/usbdev/usbmsc.h
@@ -301,6 +301,9 @@
#define USBMSC_MKEPBULKIN(devDesc) (USB_DIR_IN | (devDesc)->epno[USBMSC_EP_BULKIN_IDX])
#define USBMSC_EPINBULK_ATTR (USB_EP_ATTR_XFER_BULK)
+#define USBMSC_SSBULKMAXPACKET (1024)
+#define USBMSC_SSBULKMXPKTSHIFT (10)
+#define USBMSC_SSBULKMXPKTMASK (0x000003ff)
#define USBMSC_HSBULKMAXPACKET (512)
#define USBMSC_HSBULKMXPKTSHIFT (9)
#define USBMSC_HSBULKMXPKTMASK (0x000001ff)
@@ -545,7 +548,7 @@
int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid,
FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed);
+ uint8_t speed);
/****************************************************************************
* Name: usbmsc_mkcfgdesc
@@ -555,7 +558,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
int16_t usbmsc_mkcfgdesc(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type);
diff --git a/drivers/usbdev/usbmsc_desc.c b/drivers/usbdev/usbmsc_desc.c
index f10f37d..8d0efb9 100644
--- a/drivers/usbdev/usbmsc_desc.c
+++ b/drivers/usbdev/usbmsc_desc.c
@@ -225,10 +225,10 @@
int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid,
FAR struct usb_epdesc_s *epdesc,
FAR struct usbdev_devinfo_s *devinfo,
- bool hispeed)
+ uint8_t speed)
{
-#ifndef CONFIG_USBDEV_DUALSPEED
- UNUSED(hispeed);
+#if !defined(CONFIG_USBDEV_DUALSPEED) && !defined(CONFIG_USBDEV_SUPERSPEED)
+ UNUSED(speed);
#endif
switch (epid)
@@ -240,8 +240,18 @@
epdesc->addr = USBMSC_MKEPBULKOUT(devinfo); /* Endpoint address */
epdesc->attr = USBMSC_EPOUTBULK_ATTR; /* Endpoint attributes */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(USBMSC_SSBULKMAXPACKET);
+ epdesc->mxpacketsize[1] = MSBYTE(USBMSC_SSBULKMAXPACKET);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
@@ -268,8 +278,18 @@
epdesc->addr = USBMSC_MKEPBULKIN(devinfo); /* Endpoint address */
epdesc->attr = USBMSC_EPINBULK_ATTR; /* Endpoint attributes */
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ if (speed == USB_SPEED_SUPER || speed == USB_SPEED_SUPER_PLUS)
+ {
+ /* Maximum packet size (super speed) */
+
+ epdesc->mxpacketsize[0] = LSBYTE(USBMSC_SSBULKMAXPACKET);
+ epdesc->mxpacketsize[1] = MSBYTE(USBMSC_SSBULKMAXPACKET);
+ }
+ else
+#endif
#ifdef CONFIG_USBDEV_DUALSPEED
- if (hispeed)
+ if (speed == USB_SPEED_HIGH)
{
/* Maximum packet size (high speed) */
@@ -304,7 +324,7 @@
*
****************************************************************************/
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
int16_t usbmsc_mkcfgdesc(uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type)
@@ -313,17 +333,15 @@
FAR struct usbdev_devinfo_s *devinfo)
#endif
{
- bool hispeed = false;
-
-#ifdef CONFIG_USBDEV_DUALSPEED
- hispeed = (speed == USB_SPEED_HIGH);
-
/* Check for switches between high and full speed */
- if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG)
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
+ if (type == USB_DESC_TYPE_OTHERSPEEDCONFIG && speed != USB_SPEED_HIGH)
{
- hispeed = !hispeed;
+ speed = speed == USB_SPEED_HIGH ? USB_SPEED_FULL : USB_SPEED_HIGH;
}
+#else
+ uint8_t speed = USB_SPEED_FULL;
#endif
/* Fill in all descriptors directly to the buf */
@@ -389,7 +407,7 @@
{
int len = usbmsc_copy_epdesc(USBMSC_EPBULKIN,
(FAR struct usb_epdesc_s *)buf,
- devinfo, hispeed);
+ devinfo, speed);
buf += len;
}
@@ -399,7 +417,7 @@
{
int len = usbmsc_copy_epdesc(USBMSC_EPBULKOUT,
(FAR struct usb_epdesc_s *)buf, devinfo,
- hispeed);
+ speed);
buf += len;
}
diff --git a/include/nuttx/usb/cdcacm.h b/include/nuttx/usb/cdcacm.h
index 98d7d3f..0b2a010 100644
--- a/include/nuttx/usb/cdcacm.h
+++ b/include/nuttx/usb/cdcacm.h
@@ -57,6 +57,9 @@
* CONFIG_CDCACM_EPBULKOUT_HSSIZE
* Max package size for the bulk OUT endpoint if high speed mode.
* Default 512.
+ * CONFIG_CDCACM_EPBULKOUT_SSSIZE
+ * Max package size for the bulk OUT endpoint if super speed mode.
+ * Default 1024.
* CONFIG_CDCACM_EPBULKIN
* The logical 7-bit address of a hardware endpoint that supports
* bulk IN operation. Default: 2
@@ -66,6 +69,9 @@
* CONFIG_CDCACM_EPBULKIN_HSSIZE
* Max package size for the bulk IN endpoint if high speed mode.
* Default 512.
+ * CONFIG_CDCACM_EPBULKIN_SSSIZE
+ * Max package size for the bulk IN endpoint if super speed mode.
+ * Default 1024.
* CONFIG_CDCACM_NWRREQS and CONFIG_CDCACM_NRDREQS
* The number of write/read requests that can be in flight.
* CONFIG_CDCACM_NWRREQS includes write requests used for both the
@@ -146,6 +152,10 @@
# define CONFIG_CDCACM_EPBULKIN_HSSIZE 512
#endif
+#ifndef CONFIG_CDCACM_EPBULKIN_SSSIZE
+# define CONFIG_CDCACM_EPBULKIN_SSSIZE 1024
+#endif
+
#ifndef CONFIG_CDCACM_BULKIN_REQLEN
# ifdef CONFIG_USBDEV_DUALSPEED
# define CONFIG_CDCACM_BULKIN_REQLEN (3 * CONFIG_CDCACM_EPBULKIN_FSSIZE / 2)
@@ -176,6 +186,10 @@
# define CONFIG_CDCACM_EPBULKOUT_HSSIZE 512
#endif
+#ifndef CONFIG_CDCACM_EPBULKOUT_SSSIZE
+# define CONFIG_CDCACM_EPBULKOUT_SSSIZE 1024
+#endif
+
/* Number of requests in the write queue. This includes write requests used
* for both the interrupt and bulk IN endpoints.
*/
diff --git a/include/nuttx/usb/rndis.h b/include/nuttx/usb/rndis.h
index c8cc469..aaa1746 100644
--- a/include/nuttx/usb/rndis.h
+++ b/include/nuttx/usb/rndis.h
@@ -50,6 +50,10 @@
# define CONFIG_RNDIS_EPINTIN_HSSIZE 16
#endif
+#ifndef CONFIG_RNDIS_EPINTIN_SSSIZE
+# define CONFIG_RNDIS_EPINTIN_SSSIZE 16
+#endif
+
#ifndef CONFIG_RNDIS_EPBULKIN_FSSIZE
# define CONFIG_RNDIS_EPBULKIN_FSSIZE 64
#endif
@@ -58,6 +62,10 @@
# define CONFIG_RNDIS_EPBULKIN_HSSIZE 512
#endif
+#ifndef CONFIG_RNDIS_EPBULKIN_SSSIZE
+# define CONFIG_RNDIS_EPBULKIN_SSSIZE 1024
+#endif
+
#ifndef CONFIG_RNDIS_EPBULKOUT_FSSIZE
# define CONFIG_RNDIS_EPBULKOUT_FSSIZE 64
#endif
@@ -66,6 +74,10 @@
# define CONFIG_RNDIS_EPBULKOUT_HSSIZE 512
#endif
+#ifndef CONFIG_RNDIS_EPBULKOUT_SSSIZE
+# define CONFIG_RNDIS_EPBULKOUT_SSSIZE 1024
+#endif
+
/****************************************************************************
* Public Data
****************************************************************************/
diff --git a/include/nuttx/usb/usbdev.h b/include/nuttx/usb/usbdev.h
index 557e1e3..b0ecc81 100644
--- a/include/nuttx/usb/usbdev.h
+++ b/include/nuttx/usb/usbdev.h
@@ -197,6 +197,9 @@
#ifdef CONFIG_USBDEV_DUALSPEED
uint16_t hssize;
#endif
+#ifdef CONFIG_USBDEV_SUPERSPEED
+ uint16_t sssize;
+#endif
uint16_t reqnum;
};
@@ -219,7 +222,7 @@
struct usbdevclass_driver_s;
struct composite_devdesc_s
{
-#ifdef CONFIG_USBDEV_DUALSPEED
+#if defined(CONFIG_USBDEV_DUALSPEED) || defined(CONFIG_USBDEV_SUPERSPEED)
CODE int16_t (*mkconfdesc)(FAR uint8_t *buf,
FAR struct usbdev_devinfo_s *devinfo,
uint8_t speed, uint8_t type);
@@ -438,7 +441,7 @@
****************************************************************************/
void usbdev_copy_epdesc(FAR struct usb_epdesc_s *epdesc,
- uint8_t epno, bool hispeed,
+ uint8_t epno, uint8_t speed,
FAR const struct usbdev_epinfo_s *epinfo);
/****************************************************************************