summaryrefslogtreecommitdiff
path: root/nuttx/drivers/usbdev/usbdev_serial.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-10-07 19:05:35 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-10-07 19:05:35 +0000
commitea3ca4f5f19adae625e3dd62463187c56c36fc2e (patch)
treecff8c4bd31a7e64d32f81d5e54e95caead066cb7 /nuttx/drivers/usbdev/usbdev_serial.c
parent9fbe5337af2add5e1153dcf540194d9bac5c149a (diff)
downloadpx4-nuttx-ea3ca4f5f19adae625e3dd62463187c56c36fc2e.tar.gz
px4-nuttx-ea3ca4f5f19adae625e3dd62463187c56c36fc2e.tar.bz2
px4-nuttx-ea3ca4f5f19adae625e3dd62463187c56c36fc2e.zip
Fix interrupt EP interval
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@991 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/drivers/usbdev/usbdev_serial.c')
-rw-r--r--nuttx/drivers/usbdev/usbdev_serial.c118
1 files changed, 77 insertions, 41 deletions
diff --git a/nuttx/drivers/usbdev/usbdev_serial.c b/nuttx/drivers/usbdev/usbdev_serial.c
index 1ee3d307e..402c42c2a 100644
--- a/nuttx/drivers/usbdev/usbdev_serial.c
+++ b/nuttx/drivers/usbdev/usbdev_serial.c
@@ -4,7 +4,7 @@
* Copyright (C) 2008 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
- * This a work-alike clone Prolific PL2303
+ * This logic emulates the Prolific PL2303 serial/USB converter
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -274,9 +274,9 @@ static void usbclass_freereq(FAR struct usbdev_ep_s *ep,
/* Configuration ***********************************************************/
static int usbclass_mkstrdesc(ubyte id, struct usb_strdesc_s *strdesc);
-static void usbclass_mkepdesc(ubyte addr, ubyte attr, uint16 mxpacket,
- struct usb_epdesc_s *desc);
#ifdef CONFIG_USBDEV_DUALSPEED
+static void usbclass_mkepbulkdesc(const struct up_epdesc *indesc,
+ uint16 mxpacket, struct usb_epdesc_s *outdesc)
static sint16 usbclass_mkcfgdesc(ubyte *buf, ubyte speed);
#else
static sint16 usbclass_mkcfgdesc(ubyte *buf);
@@ -358,12 +358,12 @@ static const struct usb_devdesc_s g_devdesc =
0, /* subclass */
0, /* protocol */
CONFIG_USBSER_EP0MAXPACKET, /* maxpacketsize */
- {LSBYTE(CONFIG_USBSER_VENDORID), /* vendor */
- MSBYTE(CONFIG_USBSER_VENDORID)},
- {LSBYTE(CONFIG_USBSER_PRODUCTID), /* product */
- MSBYTE(CONFIG_USBSER_PRODUCTID)},
- {LSBYTE(USBSER_VERSIONNO), /* device */
- MSBYTE(USBSER_VERSIONNO)},
+ { LSBYTE(CONFIG_USBSER_VENDORID), /* vendor */
+ MSBYTE(CONFIG_USBSER_VENDORID) },
+ { LSBYTE(CONFIG_USBSER_PRODUCTID), /* product */
+ MSBYTE(CONFIG_USBSER_PRODUCTID) },
+ { LSBYTE(USBSER_VERSIONNO), /* device */
+ MSBYTE(USBSER_VERSIONNO) },
USBSER_MANUFACTURERSTRID, /* imfgr */
USBSER_PRODUCTSTRID, /* iproduct */
USBSER_SERIALSTRID, /* serno */
@@ -395,6 +395,37 @@ static const struct usb_ifdesc_s g_ifdesc =
USBSER_CONFIGSTRID /* iif */
};
+static const struct usb_epdesc_s g_epintindesc =
+{
+ USB_SIZEOF_EPDESC, /* len */
+ USB_DESC_TYPE_ENDPOINT, /* type */
+ USBSER_EPINTIN_ADDR, /* addr */
+ USBSER_EPINTIN_ATTR, /* attr */
+ { LSBYTE(USBSER_EPINTIN_MXPACKET), /* maxpacket */
+ MSBYTE(USBSER_EPINTIN_MXPACKET) },
+ 1 /* interval */
+};
+
+static const struct usb_epdesc_s g_epbulkoutdesc =
+{
+ USB_SIZEOF_EPDESC, /* len */
+ USB_DESC_TYPE_ENDPOINT, /* type */
+ USBSER_EPOUTBULK_ADDR, /* addr */
+ USBSER_EPOUTBULK_ATTR, /* attr */
+ { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512*/
+ 0 /* interval */
+};
+
+static const struct usb_epdesc_s g_epbulkindesc =
+{
+ USB_SIZEOF_EPDESC, /* len */
+ USB_DESC_TYPE_ENDPOINT, /* type */
+ USBSER_EPINBULK_ADDR, /* addr */
+ USBSER_EPINBULK_ATTR, /* attr */
+ { LSBYTE(64), MSBYTE(64) }, /* maxpacket -- might change to 512*/
+ 0 /* interval */
+};
+
#ifdef CONFIG_USBDEV_DUALSPEED
static const struct usb_qualdesc_s g_qualdesc =
{
@@ -719,26 +750,28 @@ static int usbclass_mkstrdesc(ubyte id, struct usb_strdesc_s *strdesc)
}
/****************************************************************************
- * Name: usbclass_mkepdesc
+ * Name: usbclass_mkepbulkdesc
*
* Description:
* Construct the endpoint descriptor
*
****************************************************************************/
-static void usbclass_mkepdesc(ubyte addr, ubyte attr, uint16 mxpacket,
- struct usb_epdesc_s *desc)
+#ifdef CONFIG_USBDEV_DUALSPEED
+static inline void usbclass_mkepbulkdesc(const struct up_epdesc *indesc,
+ uint16 mxpacket,
+ struct usb_epdesc_s *outdesc)
{
- /* Format the endpoint descriptor */
-
- desc->len = USB_SIZEOF_EPDESC;
- desc->type = USB_DESC_TYPE_ENDPOINT;
- desc->addr = addr;
- desc->attr = attr;
- desc->mxpacketsize[0] = LSBYTE(mxpacket);
- desc->mxpacketsize[1] = MSBYTE(mxpacket);
- desc->interval = 0;
+ /* Copy the canned descriptor */
+
+ memcpy(outdesc, indesc, USB_SIZEOF_EPDESC);
+
+ /* Then add the correct max packet size */
+
+ outdesc->mxpacketsize[0] = LSBYTE(mxpacket);
+ outdesc->mxpacketsize[1] = MSBYTE(mxpacket);
}
+#endif
/****************************************************************************
* Name: usbclass_mkcfgdesc
@@ -757,8 +790,8 @@ static sint16 usbclass_mkcfgdesc(ubyte *buf)
struct usb_cfgdesc_s *cfgdesc = (struct usb_cfgdesc_s*)buf;
#ifdef CONFIG_USBDEV_DUALSPEED
boolean highspeed = (speed == USB_SPEED_HIGH);
-#endif
uint16 bulkmxpacket;
+#endif
uint16 totallen;
/* This is the total length of the configuration (not necessarily the
@@ -790,25 +823,27 @@ static sint16 usbclass_mkcfgdesc(ubyte *buf)
}
#endif
+ memcpy(buf, &g_epintindesc, USB_SIZEOF_EPDESC);
+ buf += USB_SIZEOF_EPDESC;
+
#ifdef CONFIG_USBDEV_DUALSPEED
if (hispeed)
{
bulkmxpacket = 512;
}
else
-#endif
{
bulkmxpacket = 64;
}
- usbclass_mkepdesc(USBSER_EPINTIN_ADDR, USBSER_EPINTIN_ATTR,
- USBSER_EPINTIN_MXPACKET, (struct usb_epdesc_s*)buf);
+ usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket, (struct usb_epdesc_s*)buf);
buf += USB_SIZEOF_EPDESC;
- usbclass_mkepdesc(USBSER_EPOUTBULK_ADDR, USBSER_EPOUTBULK_ATTR,
- bulkmxpacket, (struct usb_epdesc_s*)buf);
+ usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket, (struct usb_epdesc_s*)buf);
+#else
+ memcpy(buf, &g_epbulkoutdesc, USB_SIZEOF_EPDESC);
buf += USB_SIZEOF_EPDESC;
- usbclass_mkepdesc(USBSER_EPINBULK_ADDR, USBSER_EPINBULK_ATTR,
- bulkmxpacket, (struct usb_epdesc_s*)buf);
+ memcpy(buf, &g_epbulkindesc, USB_SIZEOF_EPDESC);
+#endif
/* Finally, fill in the total size of the configuration descriptor */
@@ -894,9 +929,11 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
struct usbdev_s *dev = priv->usbdev;
struct usbdev_req_s *req;
struct usbser_req_s *reqcontainer;
+#ifdef CONFIG_USBDEV_DUALSPEED
struct usb_epdesc_s epdesc;
- irqstate_t flags;
uint16 bulkmxpacket;
+#endif
+ irqstate_t flags;
int i;
int ret = 0;
@@ -942,10 +979,7 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
goto errout;
}
- usbclass_mkepdesc(USBSER_EPINTIN_ADDR, USBSER_EPINTIN_ATTR,
- USBSER_EPINTIN_MXPACKET, &epdesc);
-
- ret = EP_CONFIGURE(priv->epintin, &epdesc);
+ ret = EP_CONFIGURE(priv->epintin, &g_epintindesc);
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INCONFIGEPFAIL), 0);
@@ -970,15 +1004,15 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
bulkmxpacket = 512;
}
else
-#endif
{
bulkmxpacket = 64;
}
- usbclass_mkepdesc(USBSER_EPINBULK_ADDR, USBSER_EPINBULK_ATTR,
- bulkmxpacket, &epdesc);
-
+ usbclass_mkepbulkdesc(&g_epbulkindesc, bulkmxpacket, &epdesc);
ret = EP_CONFIGURE(priv->epbulkin, &epdesc);
+#else
+ ret = EP_CONFIGURE(priv->epbulkin, &g_epbulkindesc);
+#endif
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_INCONFIGEPFAIL), 0);
@@ -997,10 +1031,12 @@ static int usbclass_setconfig(FAR struct usbser_dev_s *priv, ubyte config)
goto errout;
}
- usbclass_mkepdesc(USBSER_EPOUTBULK_ADDR, USBSER_EPOUTBULK_ATTR,
- bulkmxpacket, &epdesc);
-
+#ifdef CONFIG_USBDEV_DUALSPEED
+ usbclass_mkepbulkdesc(&g_epbulkoutdesc, bulkmxpacket, &epdesc);
ret = EP_CONFIGURE(priv->epbulkout, &epdesc);
+#else
+ ret = EP_CONFIGURE(priv->epbulkout, &g_epbulkoutdesc);
+#endif
if (ret < 0)
{
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_OUTCONFIGEPFAIL), 0);