From 07aa8a5c576df020c9dae24409312e7276437388 Mon Sep 17 00:00:00 2001 From: yangsong8 Date: Tue, 2 Jul 2024 14:36:49 +0800 Subject: [PATCH] usbdev: modify usb device support USB3.0 MaxPacketSize Signed-off-by: yangsong8 --- drivers/usbdev/Kconfig | 178 +++++++++++- drivers/usbdev/adb.c | 59 ++-- drivers/usbdev/cdcacm.c | 66 ++--- drivers/usbdev/cdcacm.h | 4 +- drivers/usbdev/cdcacm_desc.c | 66 +++-- drivers/usbdev/cdcecm.c | 55 ++-- drivers/usbdev/cdcncm.c | 58 ++-- drivers/usbdev/composite.c | 6 +- drivers/usbdev/dfu.c | 16 ++ drivers/usbdev/mtp.c | 28 +- drivers/usbdev/pl2303.c | 99 ++++--- drivers/usbdev/rndis.c | 507 +++++++++++++++++------------------ drivers/usbdev/usbdev_desc.c | 18 +- drivers/usbdev/usbdev_fs.c | 11 +- drivers/usbdev/usbmsc.c | 13 +- drivers/usbdev/usbmsc.h | 7 +- drivers/usbdev/usbmsc_desc.c | 48 ++-- include/nuttx/usb/cdcacm.h | 14 + include/nuttx/usb/rndis.h | 12 + include/nuttx/usb/usbdev.h | 7 +- 20 files changed, 771 insertions(+), 501 deletions(-) diff --git a/drivers/usbdev/Kconfig b/drivers/usbdev/Kconfig index 5e7573529db..005fd22e470 100644 --- a/drivers/usbdev/Kconfig +++ b/drivers/usbdev/Kconfig @@ -318,6 +318,35 @@ config PL2303_EP0MAXPACKET 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 @@ config CDCACM_EPINTIN_HSSIZE 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 @@ config CDCACM_EPBULKOUT_HSSIZE 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 @@ config CDCACM_EPBULKIN_HSSIZE 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 @@ config USBADB_EPBULKOUT_FSSIZE 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 @@ config USBADB_EPBULKOUT_HSSIZE 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 @@ config USBADB_EPBULKIN_HSSIZE 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 @@ config CDCECM_EPINTIN_HSSIZE 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 @@ config CDCECM_EPBULKOUT_FSSIZE 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 @@ config CDCECM_EPBULKOUT_HSSIZE 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 @@ config CDCECM_EPBULKIN_HSSIZE 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 @@ config CDCNCM_EPINTIN_HSSIZE 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 @@ config CDCNCM_EPBULKOUT_FSSIZE 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 @@ config CDCNCM_EPBULKOUT_HSSIZE 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 @@ config CDCNCM_EPBULKIN_HSSIZE 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 @@ config USBMTP_EPBULKOUT_HSSIZE 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 @@ config USBMTP_EPBULKIN_HSSIZE 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 0bf396b6541..e094d8d7798 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 @@ static const struct usb_devdesc_s g_adb_devdesc = 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 @@ -238,6 +238,9 @@ static const struct usbdev_epinfo_s g_adb_epbulkin = .fssize = CONFIG_USBADB_EPBULKIN_FSSIZE, #ifdef CONFIG_USBDEV_DUALSPEED .hssize = CONFIG_USBADB_EPBULKIN_HSSIZE, +#endif +#ifdef CONFIG_USBDEV_SUPERSPEED + .sssize = CONFIG_USBADB_EPBULKIN_SSSIZE, #endif .reqnum = CONFIG_USBADB_NWRREQS, }; @@ -257,6 +260,9 @@ static const struct usbdev_epinfo_s g_adb_epbulkout = .fssize = CONFIG_USBADB_EPBULKOUT_FSSIZE, #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 @@ static const FAR struct usbdev_epinfo_s *g_adb_epinfos[USBADB_NUM_EPS] = * ****************************************************************************/ -#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 @@ static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf, 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 @@ static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf, 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 7f887bd8bea..4ec53e471d1 100644 --- a/drivers/usbdev/cdcacm.c +++ b/drivers/usbdev/cdcacm.c @@ -175,7 +175,7 @@ static void cdcacm_resetconfig(FAR struct cdcacm_dev_s *priv); 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 void cdcacm_resetconfig(FAR struct cdcacm_dev_s *priv) 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 @@ static int cdcacm_setconfig(FAR struct cdcacm_dev_s *priv, uint8_t config) /* 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 @@ static int cdcacm_setconfig(FAR struct cdcacm_dev_s *priv, uint8_t config) /* 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 @@ static int cdcacm_setconfig(FAR struct cdcacm_dev_s *priv, uint8_t config) /* 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 @@ static int cdcacm_bind(FAR struct usbdevclass_driver_s *driver, 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 @@ static int cdcacm_bind(FAR struct usbdevclass_driver_s *driver, * 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 @@ static int cdcacm_setup(FAR struct usbdevclass_driver_s *driver, #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 @@ int cdcacm_classobject(int minor, FAR struct usbdev_devinfo_s *devinfo, 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 @@ void cdcacm_get_composite_devdesc(struct composite_devdesc_s *dev) /* 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 00dfe6b5811..8671c313e93 100644 --- a/drivers/usbdev/cdcacm.h +++ b/drivers/usbdev/cdcacm.h @@ -236,7 +236,7 @@ FAR const struct usb_devdesc_s *cdcacm_getdevdesc(void); 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 @@ int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid, * ****************************************************************************/ -#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 5a6480f396c..516ab859ee2 100644 --- a/drivers/usbdev/cdcacm_desc.c +++ b/drivers/usbdev/cdcacm_desc.c @@ -227,10 +227,10 @@ FAR const struct usb_devdesc_s *cdcacm_getdevdesc(void) 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 @@ int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid, 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 @@ int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid, 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 @@ int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid, 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 @@ int cdcacm_copy_epdesc(enum cdcacm_epdesc_e epid, * ****************************************************************************/ -#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 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, #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 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, /* 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 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, { cdcacm_copy_epdesc(CDCACM_EPINTIN, (struct usb_epdesc_s *)buf, devinfo, - hispeed); + speed); buf += USB_SIZEOF_EPDESC; } @@ -575,7 +603,7 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, { cdcacm_copy_epdesc(CDCACM_EPBULKOUT, (struct usb_epdesc_s *)buf, devinfo, - hispeed); + speed); buf += USB_SIZEOF_EPDESC; } @@ -587,7 +615,7 @@ int16_t cdcacm_mkcfgdesc(FAR uint8_t *buf, { 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 1ec84309edb..05b904aaf44 100644 --- a/drivers/usbdev/cdcecm.c +++ b/drivers/usbdev/cdcecm.c @@ -208,7 +208,7 @@ static void cdcecm_wrcomplete(FAR struct usbdev_ep_s *ep, 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 void cdcecm_resetconfig(FAR struct cdcecm_driver_s *self) 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 @@ static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config) 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 @@ static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config) 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 @@ static int cdcecm_setconfig(FAR struct cdcecm_driver_s *self, uint8_t config) 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 int cdcecm_mkstrdesc(uint8_t id, FAR struct usb_strdesc_s *strdesc) 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 @@ static void cdcecm_mkepdesc(int epidx, * ****************************************************************************/ -#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 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcecm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int cdcecm_getdescriptor(FAR struct cdcecm_driver_s *self, #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 @@ void cdcecm_get_composite_devdesc(struct composite_devdesc_s *dev) /* 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 3c40f881d48..b64b3942a05 100644 --- a/drivers/usbdev/cdcncm.c +++ b/drivers/usbdev/cdcncm.c @@ -427,7 +427,7 @@ static void cdcncm_wrcomplete(FAR struct usbdev_ep_s *ep, 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 const struct netdev_ops_s g_netops = 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 void cdcncm_resetconfig(FAR struct cdcncm_driver_s *self) 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 @@ static int cdcncm_setconfig(FAR struct cdcncm_driver_s *self, uint8_t config) 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 @@ static int cdcncm_setconfig(FAR struct cdcncm_driver_s *self, uint8_t config) 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 @@ static int cdcncm_setconfig(FAR struct cdcncm_driver_s *self, uint8_t config) 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 int cdcmbim_mkstrdesc(uint8_t id, FAR struct usb_strdesc_s *strdesc) 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 @@ static void cdcncm_mkepdesc(int epidx, FAR struct usb_epdesc_s *epdesc, * ****************************************************************************/ -#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 @@ static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc, { 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 @@ static int16_t cdcnm_mkcfgdesc(FAR uint8_t *desc, * ****************************************************************************/ -#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 @@ static int cdcncm_getdescriptor(FAR struct cdcncm_driver_s *self, 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 @@ static void cdcnm_get_composite_devdesc(FAR struct composite_devdesc_s *dev, /* 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 8e3f990f1c5..e793a8f51ac 100644 --- a/drivers/usbdev/composite.c +++ b/drivers/usbdev/composite.c @@ -277,7 +277,7 @@ static int composite_msftdescriptor(FAR struct composite_dev_s *priv, * ****************************************************************************/ -#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 @@ static int16_t composite_mkcfgdesc(FAR struct usbdevclass_driver_s *driver, { 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 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver, 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 9e4b0af7386..1cc4fc3c762 100644 --- a/drivers/usbdev/dfu.c +++ b/drivers/usbdev/dfu.c @@ -181,11 +181,22 @@ static void usbclass_ep0incomplete(FAR struct usbdev_ep_s *ep, { } +#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 @@ static int usbclass_setup(FAR struct usbdevclass_driver_s *driver, { 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 2c467190695..22888d1cb53 100644 --- a/drivers/usbdev/mtp.c +++ b/drivers/usbdev/mtp.c @@ -226,6 +226,9 @@ static const struct usbdev_epinfo_s g_mtp_epbulkin = .fssize = CONFIG_USBMTP_EPBULKIN_FSSIZE, #ifdef CONFIG_USBDEV_DUALSPEED .hssize = CONFIG_USBMTP_EPBULKIN_HSSIZE, +#endif +#ifdef CONFIG_USBDEV_SUPERSPEED + .sssize = CONFIG_USBMTP_EPBULKIN_SSSIZE, #endif .reqnum = CONFIG_USBMTP_NWRREQS, }; @@ -245,6 +248,9 @@ static const struct usbdev_epinfo_s g_mtp_epbulkout = .fssize = CONFIG_USBMTP_EPBULKOUT_FSSIZE, #ifdef CONFIG_USBDEV_DUALSPEED .hssize = CONFIG_USBMTP_EPBULKOUT_HSSIZE, +#endif +#ifdef CONFIG_USBDEV_SUPERSPEED + .sssize = CONFIG_USBMTP_EPBULKOUT_SSSIZE, #endif .reqnum = CONFIG_USBMTP_NRDREQS, }; @@ -264,6 +270,9 @@ static const struct usbdev_epinfo_s g_mtp_epbulkintin = .fssize = CONFIG_USBMTP_EPINTIN_SIZE, #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 @@ static const FAR struct usbdev_epinfo_s *g_mtp_epinfos[USBMTP_NUM_EPS] = * ****************************************************************************/ -#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 @@ static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf, 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 @@ static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf, 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 116ff8489cf..8927f6c8ace 100644 --- a/drivers/usbdev/pl2303.c +++ b/drivers/usbdev/pl2303.c @@ -293,9 +293,9 @@ static inline int usbclass_recvpacket(FAR struct pl2303_dev_s *priv, /* 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 @@ static int usbclass_mkstrdesc(uint8_t id, FAR struct usb_strdesc_s *strdesc) * ****************************************************************************/ -#ifdef CONFIG_USBDEV_DUALSPEED static inline void usbclass_mkepbulkdesc( FAR const struct usb_epdesc_s *indesc, uint16_t mxpacket, @@ -850,7 +849,6 @@ static inline void usbclass_mkepbulkdesc( outdesc->mxpacketsize[0] = LSBYTE(mxpacket); outdesc->mxpacketsize[1] = MSBYTE(mxpacket); } -#endif /**************************************************************************** * Name: usbclass_mkcfgdesc @@ -860,19 +858,25 @@ static inline void usbclass_mkepbulkdesc( * ****************************************************************************/ -#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 @@ static int16_t usbclass_mkcfgdesc(uint8_t *buf) 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 void usbclass_resetconfig(FAR struct pl2303_dev_s *priv) 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 @@ static int usbclass_setconfig(FAR struct pl2303_dev_s *priv, uint8_t config) /* 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; - } - else - { - bulkmxpacket = 64; + bulkmxpacket = CONFIG_PL2303_EPBULK_HSSIZE; } +#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 @@ static int usbclass_setconfig(FAR struct pl2303_dev_s *priv, uint8_t config) /* 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 @@ static int usbclass_bind(FAR struct usbdevclass_driver_s *driver, ((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 @@ static int usbclass_bind(FAR struct usbdevclass_driver_s *driver, /* 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 @@ static int usbclass_bind(FAR struct usbdevclass_driver_s *driver, * 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 @@ static int usbclass_setup(FAR struct usbdevclass_driver_s *driver, 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 50ec804ab52..e7eaf482ea3 100644 --- a/drivers/usbdev/rndis.c +++ b/drivers/usbdev/rndis.c @@ -248,12 +248,6 @@ static void usbclass_disconnect(FAR struct usbdevclass_driver_s *driver, 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 @@ static const struct usb_devdesc_s g_devdesc = }; #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 @@ static const struct rndis_oid_value_s g_rndis_oid_values[] = 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}, @@ -1870,116 +1902,6 @@ static int usbclass_mkstrdesc(uint8_t id, FAR struct usb_strdesc_s *strdesc) return strdesc->len; } -/**************************************************************************** - * 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 * @@ -1988,7 +1910,7 @@ static int usbclass_copy_epdesc(int epid, FAR struct usb_epdesc_s *epdesc, * ****************************************************************************/ -#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 @@ static int16_t usbclass_mkcfgdesc(FAR uint8_t *buf, 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 @@ static int usbclass_setup(FAR struct usbdevclass_driver_s *driver, # 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 void usbclass_resetconfig(FAR struct rndis_dev_s *priv) 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 @@ static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config) } #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 @@ static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config) /* 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 @@ static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config) /* 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 @@ static int usbclass_setconfig(FAR struct rndis_dev_s *priv, uint8_t config) /* 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 @@ void usbdev_rndis_get_composite_devdesc(struct composite_devdesc_s *dev) /* 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 f9c12e82746..7d2594e1179 100644 --- a/drivers/usbdev/usbdev_desc.c +++ b/drivers/usbdev/usbdev_desc.c @@ -76,18 +76,28 @@ int usbdev_copy_devdesc(FAR void *dest, ****************************************************************************/ 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 cacc62db5cc..02b53885f6f 100644 --- a/drivers/usbdev/usbdev_fs.c +++ b/drivers/usbdev/usbdev_fs.c @@ -933,7 +933,9 @@ static int usbdev_fs_ep_bind(FAR struct usbdev_s *dev, uint8_t epno, 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 @@ static int usbdev_fs_classsetconfig(FAR struct usbdev_fs_dev_s *fs, { 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 @@ static int usbdev_fs_classsetconfig(FAR struct usbdev_fs_dev_s *fs, 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 8298a0af0c5..b679335badc 100644 --- a/drivers/usbdev/usbmsc.c +++ b/drivers/usbdev/usbmsc.c @@ -207,7 +207,9 @@ static int usbmsc_bind(FAR struct usbdevclass_driver_s *driver, * 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 @@ static int usbmsc_setup(FAR struct usbdevclass_driver_s *driver, #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 @@ int usbmsc_setconfig(FAR struct usbmsc_dev_s *priv, uint8_t config) 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 @@ int usbmsc_setconfig(FAR struct usbmsc_dev_s *priv, uint8_t config) 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 @@ int usbmsc_setconfig(FAR struct usbmsc_dev_s *priv, uint8_t config) /* 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 @@ int usbmsc_setconfig(FAR struct usbmsc_dev_s *priv, uint8_t config) /* 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 ee96007b861..7fa463d6fbe 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 @@ FAR const struct usb_devdesc_s *usbmsc_getdevdesc(void); 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 @@ int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid, * ****************************************************************************/ -#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 f10f37d7bd6..8d0efb95e75 100644 --- a/drivers/usbdev/usbmsc_desc.c +++ b/drivers/usbdev/usbmsc_desc.c @@ -225,10 +225,10 @@ FAR const struct usb_devdesc_s *usbmsc_getdevdesc(void) 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 @@ int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid, 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 @@ int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid, 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 @@ int usbmsc_copy_epdesc(enum usbmsc_epdesc_e epid, * ****************************************************************************/ -#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 @@ int16_t usbmsc_mkcfgdesc(uint8_t *buf, 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 @@ int16_t usbmsc_mkcfgdesc(uint8_t *buf, { int len = usbmsc_copy_epdesc(USBMSC_EPBULKIN, (FAR struct usb_epdesc_s *)buf, - devinfo, hispeed); + devinfo, speed); buf += len; } @@ -399,7 +417,7 @@ int16_t usbmsc_mkcfgdesc(uint8_t *buf, { 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 98d7d3f8f45..0b2a0104e2a 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 c8cc469a348..aaa17460279 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 557e1e37249..b0ecc812913 100644 --- a/include/nuttx/usb/usbdev.h +++ b/include/nuttx/usb/usbdev.h @@ -196,6 +196,9 @@ struct usbdev_epinfo_s uint16_t fssize; #ifdef CONFIG_USBDEV_DUALSPEED uint16_t hssize; +#endif +#ifdef CONFIG_USBDEV_SUPERSPEED + uint16_t sssize; #endif uint16_t reqnum; }; @@ -219,7 +222,7 @@ struct usbdev_devinfo_s 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 @@ int usbdev_copy_devdesc(FAR void *dest, ****************************************************************************/ 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); /****************************************************************************