Most USB Composite device debug

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4344 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-01-27 21:03:20 +00:00
parent a79c599632
commit 52cd964966
8 changed files with 105 additions and 20 deletions

View File

@ -4940,6 +4940,15 @@ build
unique and contiguous. When used with the Mass Storage driver, the
correct value for this offset is zero.
</li>
<li>
<code>CONFIG_CDCACM_STRBASE</code>:
If the CDC driver is part of a composite device, then this may need to
be defined to offset the CDC/ACM string numbers so that they are
unique and contiguous. When used with the Mass Storage driver, the
correct value for this offset is four (this value actuallly only needs
to be defined if names are provided for the Notification interface,
<code>CONFIG_CDCACM_NOTIFSTR</code>, or the data interface, <code>CONFIG_CDCACM_DATAIFSTR</code>).
</li>
<li>
<code>CONFIG_CDCACM_EP0MAXPACKET</code>: Endpoint 0 max packet size. Default 64.
</li>
@ -5010,6 +5019,14 @@ build
correct value for this offset is two (because of the two CDC/ACM
interfaces that will precede it).
</li>
<li>
<code>CONFIG_USBMSC_STRBASE</code>:
If the CDC driver is part of a composite device, then this may need to
be defined to offset the mass storage string numbers so that they are
unique and contiguous. When used with the CDC/ACM driver, the
correct value for this offset is four (or perhaps 5 or 6, depending
on if <code>CONFIG_CDCACM_NOTIFSTR</code> or <code>CONFIG_CDCACM_DATAIFSTR</code> are defined).
</li>
<li>
<code>CONFIG_USBMSC_EP0MAXPACKET</code>:
Max packet size for endpoint 0

View File

@ -1010,6 +1010,13 @@ defconfig -- This is a configuration file similar to the Linux
be defined to offset the CDC/ACM interface numbers so that they are
unique and contiguous. When used with the Mass Storage driver, the
correct value for this offset is zero.
CONFIG_CDCACM_STRBASE
If the CDC driver is part of a composite device, then this may need to
be defined to offset the CDC/ACM string numbers so that they are
unique and contiguous. When used with the Mass Storage driver, the
correct value for this offset is four (this value actuallly only needs
to be defined if names are provided for the Notification interface,
CONFIG_CDCACM_NOTIFSTR, or the data interface, CONFIG_CDCACM_DATAIFSTR).
CONFIG_CDCACM_EP0MAXPACKET
Endpoint 0 max packet size. Default 64.
CONFIG_CDCACM_EPINTIN
@ -1067,7 +1074,13 @@ defconfig -- This is a configuration file similar to the Linux
be defined to offset the mass storage interface number so that it is
unique and contiguous. When used with the CDC/ACM driver, the
correct value for this offset is two (because of the two CDC/ACM
interfaces that will precede it).
interfaces that will precede it).
CONFIG_USBMSC_STRBASE
If the CDC driver is part of a composite device, then this may need to
be defined to offset the mass storage string numbers so that they are
unique and contiguous. When used with the CDC/ACM driver, the
correct value for this offset is four (or perhaps 5 or 6, depending
on if CONFIG_CDCACM_NOTIFSTR or CONFIG_CDCACM_DATAIFSTR are defined).
CONFIG_USBMSC_EP0MAXPACKET
Max packet size for endpoint 0
CONFIG_USBMSCEPBULKOUT and CONFIG_USBMSC_EPBULKIN

View File

@ -719,6 +719,12 @@ CONFIG_PL2303_TXBUFSIZE=512
# unique and contiguous. When used with the CDC/ACM driver, the
# correct value for this offset is two (because of the two CDC/ACM
# interfaces that will precede it).
# CONFIG_USBMSC_STRBASE
# If the CDC driver is part of a composite device, then this may need to
# be defined to offset the mass storage string numbers so that they are
# unique and contiguous. When used with the CDC/ACM driver, the
# correct value for this offset is four (or perhaps 5 or 6, depending
# on if CONFIG_CDCACM_NOTIFSTR or CONFIG_CDCACM_DATAIFSTR are defined).
# CONFIG_USBMSC_EP0MAXPACKET
# Max packet size for endpoint 0
# CONFIG_USBMSC_EPBULKOUT and CONFIG_USBMSC_EPBULKIN
@ -740,6 +746,7 @@ CONFIG_PL2303_TXBUFSIZE=512
CONFIG_USBMSC=y
CONFIG_USBMSC_COMPOSITE=y
CONFIG_USBMSC_IFNOBASE=2
CONFIG_USBMSC_STRBASE=4
CONFIG_USBMSC_EP0MAXPACKET=64
CONFIG_USBMSC_EPBULKOUT=4
CONFIG_USBMSC_EPBULKIN=5
@ -767,6 +774,13 @@ CONFIG_USBMSC_REMOVABLE=y
# be defined to offset the CDC/ACM interface numbers so that they are
# unique and contiguous. When used with the Mass Storage driver, the
# correct value for this offset is zero.
# CONFIG_CDCACM_STRBASE
# If the CDC driver is part of a composite device, then this may need to
# be defined to offset the CDC/ACM string numbers so that they are
# unique and contiguous. When used with the Mass Storage driver, the
# correct value for this offset is four (this value actuallly only needs
# to be defined if names are provided for the Notification interface,
# CONFIG_CDCACM_NOTIFSTR, or the data interface, CONFIG_CDCACM_DATAIFSTR).
# CONFIG_CDCACM_EP0MAXPACKET
# Endpoint 0 max packet size. Default 64
# CONFIG_CDCACM_EPINTIN
@ -814,6 +828,7 @@ CONFIG_USBMSC_REMOVABLE=y
CONFIG_CDCACM=y
CONFIG_CDCACM_COMPOSITE=y
CONFIG_CDCACM_IFNOBASE=0
CONFIG_CDCACM_STRBASE=4
#CONFIG_CDCACM_EP0MAXPACKET
CONFIG_CDCACM_EPINTIN=1
#CONFIG_CDCACM_EPINTIN_FSSIZE

View File

@ -140,16 +140,19 @@
# define CDCACM_SERIALSTRID (3)
# define CDCACM_CONFIGSTRID (4)
# define CDCACM_LASTBASESTRID (4)
# undef CONFIG_CDCACM_STRBASE
# define CONFIG_CDCACM_STRBASE (4)
# define CONFIG_CDCACM_STRBASE (0)
#else
# define CDCACM_LASTBASESTRID CONFIG_CDCACM_STRBASE
#endif
/* These string IDs only exist if a user-defined string is provided */
#ifdef CONFIG_CDCACM_NOTIFSTR
# define CDCACM_NOTIFSTRID (CONFIG_CDCACM_STRBASE+1)
# define CDCACM_NOTIFSTRID (CDCACM_LASTBASESTRID+1)
#else
# define CDCACM_NOTIFSTRID CONFIG_CDCACM_STRBASE
# define CDCACM_NOTIFSTRID CDCACM_LASTBASESTRID
#endif
#ifdef CONFIG_CDCACM_DATAIFSTR
@ -159,6 +162,7 @@
#endif
#define CDCACM_LASTSTRID CDCACM_DATAIFSTRID
#define CDCACM_NSTRIDS (CDCACM_LASTSTRID - CONFIG_CDCACM_STRBASE)
/* Configuration descriptor size */

View File

@ -470,7 +470,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
case USB_DESC_TYPE_CONFIG:
{
#ifdef CONFIG_USBDEV_DUALSPEED
ret = composite_mkcfgdesc(ctrlreq->buf, dev->speed, ctrl->value[1]);
ret = composite_mkcfgdesc(ctrlreq->buf, dev->speed,
ctrl->value[1]);
#else
ret = composite_mkcfgdesc(ctrlreq->buf);
#endif
@ -479,9 +480,23 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
case USB_DESC_TYPE_STRING:
{
/* index == language code. */
/* value == string index. Zero is the language ID. */
ret = composite_mkstrdesc(ctrl->value[0], (struct usb_strdesc_s *)ctrlreq->buf);
uint8_t strid = ctrl->value[0];
FAR struct usb_strdesc_s *buf = (FAR struct usb_strdesc_s *)ctrlreq->buf;
if (strid <= COMPOSITE_NSTRIDS)
{
ret = composite_mkstrdesc(strid, buf);
}
else if (strid < DEV1_STRIDBASE + DEV1_NSTRIDS)
{
ret = DEV1_MKSTRDESC(strid, buf);
}
else if (strid < DEV2_STRIDBASE + DEV2_NSTRIDS)
{
ret = DEV2_MKSTRDESC(strid, buf);
}
}
break;
@ -530,7 +545,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
if (ctrl->type == USB_REQ_RECIPIENT_INTERFACE &&
priv->config == COMPOSITE_CONFIGID)
{
dispatched = (composite_classsetup(priv, dev, ctrl) >= 0);
ret = composite_classsetup(priv, dev, ctrl);
dispatched = true;
}
}
break;
@ -540,7 +556,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
if (ctrl->type == (USB_DIR_IN|USB_REQ_RECIPIENT_INTERFACE) &&
priv->config == COMPOSITE_CONFIGIDNONE)
{
dispatched = (composite_classsetup(priv, dev, ctrl) >= 0);
ret = composite_classsetup(priv, dev, ctrl);
dispatched = true;
}
}
break;
@ -565,7 +582,8 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
recipient = ctrl->type & USB_REQ_RECIPIENT_MASK;
if (recipient == USB_REQ_RECIPIENT_INTERFACE || recipient == USB_REQ_RECIPIENT_ENDPOINT)
{
dispatched = (composite_classsetup(priv, dev, ctrl) >= 0);
ret = composite_classsetup(priv, dev, ctrl);
dispatched = true;
}
}
@ -592,6 +610,7 @@ static int composite_setup(FAR struct usbdevclass_driver_s *driver,
composite_ep0incomplete(dev->ep0, ctrlreq);
}
}
return ret;
}

View File

@ -118,26 +118,28 @@
#if defined(CONFIG_CDCACM_COMPOSITE)
# define DEV1_IS_CDCACM 1
# define DEV1_MKCFGDESC cdcacm_mkcfgdesc
# define DEV1_MKSTRDESC cdcacm_mkstrdesc
# define DEV1_CLASSOBJECT board_cdcclassobject
# define DEV1_UNINITIALIZE board_cdcuninitialize
# define DEV1_NCONFIGS CDCACM_NCONFIGS
# define DEV1_CONFIGID CDCACM_CONFIGID
# define DEV1_FIRSTINTERFACE CONFIG_CDCACM_IFNOBASE
# define DEV1_NINTERFACES CDCACM_NINTERFACES
# define DEV1_FIRSTSTRID CONFIG_CDCACM_STRBASE
# define DEV1_NSTRIDS (CDCACM_LASTSTRID-CONFIG_CDCACM_STRBASE)
# define DEV1_STRIDBASE CONFIG_CDCACM_STRBASE
# define DEV1_NSTRIDS CDCACM_NSTRIDS
# define DEV1_CFGDESCSIZE SIZEOF_CDCACM_CFGDESC
#elif defined(CONFIG_CDCACM_COMPOSITE)
# define DEV1_IS_USBMSC 1
# define DEV1_MKCFGDESC usbmsc_mkcfgdesc
# define DEV1_MKSTRDESC usbmsc_mkstrdesc
# define DEV1_CLASSOBJECT board_mscclassobject
# define DEV1_UNINITIALIZE board_mscuninitialize
# define DEV1_NCONFIGS USBMSC_NCONFIGS
# define DEV1_CONFIGID USBMSC_CONFIGID
# define DEV1_FIRSTINTERFACE CONFIG_USBMSC_IFNOBASE
# define DEV1_NINTERFACES USBMSC_NINTERFACES
# define DEV1_FIRSTSTRID CONFIG_USBMSC_IFNOBASE
# define DEV1_NSTRIDS (USBMSC_LASTSTRID-CONFIG_USBMSC_STRBASE)
# define DEV1_STRIDBASE CONFIG_USBMSC_IFNOBASE
# define DEV1_NSTRIDS USBMSC_NSTRIDS
# define DEV1_CFGDESCSIZE SIZEOF_USBMSC_CFGDESC
#else
# error "No members of the composite defined"
@ -150,26 +152,28 @@
#if defined(CONFIG_CDCACM_COMPOSITE) && !defined(DEV1_IS_CDCACM)
# define DEV2_IS_CDCACM 1
# define DEV2_MKCFGDESC cdcacm_mkcfgdesc
# define DEV2_MKSTRDESC cdcacm_mkstrdesc
# define DEV2_CLASSOBJECT board_cdcclassobject
# define DEV2_UNINITIALIZE board_cdcuninitialize
# define DEV2_NCONFIGS CDCACM_NCONFIGS
# define DEV2_CONFIGID CDCACM_CONFIGID
# define DEV2_FIRSTINTERFACE CONFIG_CDCACM_IFNOBASE
# define DEV2_NINTERFACES CDCACM_NINTERFACES
# define DEV2_FIRSTSTRID CONFIG_CDCACM_STRBASE
# define DEV2_NSTRIDS (CDCACM_LASTSTRID-CONFIG_CDCACM_STRBASE)
# define DEV2_STRIDBASE CONFIG_CDCACM_STRBASE
# define DEV2_NSTRIDS CDCACM_NSTRIDS
# define DEV2_CFGDESCSIZE SIZEOF_CDCACM_CFGDESC
#elif defined(CONFIG_CDCACM_COMPOSITE) && !defined(DEV1_IS_USBMSC)
# define DEV2_IS_USBMSC 1
# define DEV2_MKCFGDESC usbmsc_mkcfgdesc
# define DEV2_MKSTRDESC usbmsc_mkstrdesc
# define DEV2_UNINITIALIZE board_mscuninitialize
# define DEV2_CLASSOBJECT board_mscclassobject
# define DEV2_NCONFIGS USBMSC_NCONFIGS
# define DEV2_CONFIGID USBMSC_CONFIGID
# define DEV2_FIRSTINTERFACE CONFIG_USBMSC_IFNOBASE
# define DEV2_NINTERFACES USBMSC_NINTERFACES
# define DEV2_FIRSTSTRID CONFIG_CDCACM_STRBASE
# define DEV2_NSTRIDS (USBMSC_LASTSTRID-CONFIG_USBMSC_STRBASE)
# define DEV2_STRIDBASE CONFIG_USBMSC_STRBASE
# define DEV2_NSTRIDS USBMSC_NSTRIDS
# define DEV2_CFGDESCSIZE SIZEOF_USBMSC_CFGDESC
#else
# error "Insufficient members of the composite defined"
@ -232,6 +236,17 @@
#define COMPOSITE_PRODUCTSTRID (2)
#define COMPOSITE_SERIALSTRID (3)
#define COMPOSITE_CONFIGSTRID (4)
#define COMPOSITE_NSTRIDS (4)
/* Verify string configuration */
#if COMPOSITE_NSTRIDS != DEV1_STRIDBASE
# warning "The DEV1 string base should be COMPOSITE_NSTRIDS"
#endif
#if (DEV1_STRIDBASE + DEV1_NSTRIDS) != DEV2_STRIDBASE
# warning "String IDs are not contiguous"
#endif
/* Everpresent MIN/MAX macros ***********************************************/

View File

@ -183,7 +183,7 @@ int composite_mkstrdesc(uint8_t id, struct usb_strdesc_s *strdesc)
return 4;
}
case COMPOSITE_MANUFACTURERSTRID:
case COMPOSITE_MANUFACTURERSTRID:
str = g_compvendorstr;
break;

View File

@ -298,11 +298,13 @@
# define USBMSC_INTERFACESTRID USBMSC_CONFIGSTRID
# undef CONFIG_USBMSC_STRBASE
# define CONFIG_USBMSC_STRBASE (4)
# define CONFIG_USBMSC_STRBASE (0)
#else
# define USBMSC_INTERFACESTRID (CONFIG_USBMSC_STRBASE+1)
#endif
#define USBMSC_LASTSTRID USBMSC_INTERFACESTRID
#define USBMSC_NSTRIDS (USBMSC_LASTSTRID - CONFIG_USBMSC_STRBASE)
#define USBMSC_NCONFIGS (1) /* Number of configurations supported */