diff --git a/ChangeLog b/ChangeLog index fc7312045f..c49f6bea8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5495,3 +5495,11 @@ de Assis. This is still very much a work in progress (2013-9-3). * configs/*/usbmsc: Renamed from config/*/usbstorage to match the change in naming in apps/examples submitted by CCTSAO (2013-9-5). + * drivers/usbdev.c and pl2303.c: Don't use max packetsize assigned to + the endpoint when allocating request buffers; The default value of + the endpoint max packetsize may be incorrect because the endpoint + has not yet been configured. Verified on CDC/ACM. Corresponding + changes made to pl2303, but untested (2013-9-5). + * arch/arm/src/sama5/sam_udphs.c: The high-speed device side driver + is now functional (although more testing is always needed) (2013-9-5). + diff --git a/arch/arm/src/sama5/sam_udphs.c b/arch/arm/src/sama5/sam_udphs.c index 641bda596a..f02fcea8d3 100644 --- a/arch/arm/src/sama5/sam_udphs.c +++ b/arch/arm/src/sama5/sam_udphs.c @@ -3505,7 +3505,7 @@ static void sam_ep_freereq(struct usbdev_ep_s *ep, struct usbdev_req_s *req) } /**************************************************************************** - * Name: sam_ep_submit + * Name: sam_ep_allocbuffer * * Description: * This is the allocbuffer() method of the USB device endpoint structure. @@ -3522,7 +3522,7 @@ static void *sam_ep_allocbuffer(struct usbdev_ep_s *ep, uint16_t nbytes) #endif /**************************************************************************** - * Name: sam_ep_submit + * Name: sam_ep_freebuffer * * Description: * This is the freebuffer() method of the USB device endpoint structure. diff --git a/configs/sama5d3x-ek/README.txt b/configs/sama5d3x-ek/README.txt index ce7993e0d5..803a78774c 100644 --- a/configs/sama5d3x-ek/README.txt +++ b/configs/sama5d3x-ek/README.txt @@ -1240,6 +1240,7 @@ Configurations Device Drivers -> USB Device Driver Support CONFIG_CDCACM=y : Enable the CDC/ACM device + CONFIG_CDCACM_BULKIN_REQLEN=768 : Default too small for high-speed The following setting enables an example that can can be used to control the CDC/ACM device. It will add two new NSH commands: diff --git a/drivers/usbdev/Kconfig b/drivers/usbdev/Kconfig index ca1d175b20..56e45ccf8c 100644 --- a/drivers/usbdev/Kconfig +++ b/drivers/usbdev/Kconfig @@ -210,7 +210,8 @@ config PL2303_NRDREQS config PL2303_BULKIN_REQLEN int "Size of one write request buffer" - default 96 + default 768 if USBDEV_DUALSPEED + default 96 if !USBDEV_DUALSPEED ---help--- Ideally, the BULKOUT request size should *not* be the same size as the maxpacket size. That is because IN transfers of exactly the @@ -376,7 +377,8 @@ config CDCACM_NRDREQS config CDCACM_BULKIN_REQLEN int "Size of one write request buffer" - default 96 + default 768 if USBDEV_DUALSPEED + default 96 if !USBDEV_DUALSPEED ---help--- Ideally, the BULKOUT request size should *not* be the same size as the maxpacket size. That is because IN transfers of exactly the diff --git a/drivers/usbdev/cdcacm.c b/drivers/usbdev/cdcacm.c index 81319e30c9..5920a6bebc 100644 --- a/drivers/usbdev/cdcacm.c +++ b/drivers/usbdev/cdcacm.c @@ -1006,9 +1006,13 @@ static int cdcacm_bind(FAR struct usbdevclass_driver_s *driver, priv->epbulkout->priv = priv; - /* Pre-allocate read requests */ + /* Pre-allocate read requests. The buffer size is one full packet. */ - reqlen = priv->epbulkout->maxpacket; +#ifdef CONFIG_USBDEV_DUALSPEED + reqlen = CONFIG_CDCACM_EPBULKOUT_HSSIZE; +#else + reqlen = CONFIG_CDCACM_EPBULKOUT_FSSIZE; +#endif for (i = 0; i < CONFIG_CDCACM_NRDREQS; i++) { @@ -1025,9 +1029,24 @@ static int cdcacm_bind(FAR struct usbdevclass_driver_s *driver, reqcontainer->req->callback = cdcacm_rdcomplete; } - /* Pre-allocate write request containers and put in a free list */ + /* Pre-allocate write request containers and put in a free list. + * The buffer size should be larger than a full packet. Otherwise, + * we will send a bogus null packet at the end of each packet. + * + * Pick the larger of the max packet size and the configured request + * size. + */ - reqlen = MAX(CONFIG_CDCACM_BULKIN_REQLEN, priv->epbulkin->maxpacket); +#ifdef CONFIG_USBDEV_DUALSPEED + reqlen = CONFIG_CDCACM_EPBULKIN_HSSIZE; +#else + reqlen = CONFIG_CDCACM_EPBULKIN_FSSIZE; +#endif + + if (CONFIG_CDCACM_BULKIN_REQLEN > reqlen) + { + reqlen = CONFIG_CDCACM_BULKIN_REQLEN; + } for (i = 0; i < CONFIG_CDCACM_NWRREQS; i++) { diff --git a/drivers/usbdev/pl2303.c b/drivers/usbdev/pl2303.c index 71918ca418..4f75275e20 100644 --- a/drivers/usbdev/pl2303.c +++ b/drivers/usbdev/pl2303.c @@ -472,7 +472,7 @@ static const struct usb_epdesc_s g_epbulkoutdesc = USB_DESC_TYPE_ENDPOINT, /* type */ PL2303_EPOUTBULK_ADDR, /* addr */ PL2303_EPOUTBULK_ATTR, /* attr */ - { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512*/ + { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512 */ 0 /* interval */ }; @@ -482,7 +482,7 @@ static const struct usb_epdesc_s g_epbulkindesc = USB_DESC_TYPE_ENDPOINT, /* type */ PL2303_EPINBULK_ADDR, /* addr */ PL2303_EPINBULK_ATTR, /* attr */ - { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512*/ + { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512 */ 0 /* interval */ }; @@ -1381,9 +1381,13 @@ static int usbclass_bind(FAR struct usbdevclass_driver_s *driver, } priv->epbulkout->priv = priv; - /* Pre-allocate read requests */ + /* Pre-allocate read requests. The buffer size is one full packet. */ - reqlen = priv->epbulkout->maxpacket; +#ifdef CONFIG_USBDEV_DUALSPEED + reqlen = 512; +#else + reqlen = 64; +#endif for (i = 0; i < CONFIG_PL2303_NRDREQS; i++) { @@ -1400,9 +1404,24 @@ static int usbclass_bind(FAR struct usbdevclass_driver_s *driver, reqcontainer->req->callback = usbclass_rdcomplete; } - /* Pre-allocate write request containers and put in a free list */ + /* Pre-allocate write request containers and put in a free list. + * The buffer size should be larger than a full packet. Otherwise, + * we will send a bogus null packet at the end of each packet. + * + * Pick the larger of the max packet size and the configured request + * size. + */ - reqlen = max(CONFIG_PL2303_BULKIN_REQLEN, priv->epbulkin->maxpacket); +#ifdef CONFIG_USBDEV_DUALSPEED + reqlen = 512; +#else + reqlen = 64; +#endif + + if (CONFIG_PL2303_BULKIN_REQLEN > reqlen) + { + reqlen = CONFIG_CDCACM_BULKIN_REQLEN; + } for (i = 0; i < CONFIG_PL2303_NWRREQS; i++) { diff --git a/include/nuttx/usb/cdcacm.h b/include/nuttx/usb/cdcacm.h index 4e331b5692..165d38fb3e 100644 --- a/include/nuttx/usb/cdcacm.h +++ b/include/nuttx/usb/cdcacm.h @@ -140,7 +140,11 @@ #endif #ifndef CONFIG_CDCACM_BULKIN_REQLEN -# define CONFIG_CDCACM_BULKIN_REQLEN 96 +# ifdef CONFIG_USBDEV_DUALSPEED +# define CONFIG_CDCACM_BULKIN_REQLEN (3 * CONFIG_CDCACM_EPBULKIN_FSSIZE / 2) +# else +# define CONFIG_CDCACM_BULKIN_REQLEN (3 * CONFIG_CDCACM_EPBULKIN_FSSIZE / 2) +# endif #endif /* Endpoint number and size (in bytes) of the CDC host-to-device (OUT) data