aboutsummaryrefslogtreecommitdiff
path: root/nuttx/arch
diff options
context:
space:
mode:
authorpatacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679>2012-03-18 20:39:18 +0000
committerpatacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679>2012-03-18 20:39:18 +0000
commit199e9314622731714c0331264a52e8b1d00a1d4e (patch)
tree7fcf92024b569edcf9b161076c787631b0805928 /nuttx/arch
parent9242a9e5789751f99d595ceb0dfd1b0af3a3ad2e (diff)
downloadpx4-firmware-199e9314622731714c0331264a52e8b1d00a1d4e.tar.gz
px4-firmware-199e9314622731714c0331264a52e8b1d00a1d4e.tar.bz2
px4-firmware-199e9314622731714c0331264a52e8b1d00a1d4e.zip
The PIC32 USB driver (finally) works the the Mass Storage Class
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4496 7fd9a85b-ad96-42d3-883c-3090e2eb8679
Diffstat (limited to 'nuttx/arch')
-rw-r--r--nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
index e5d5adfad..9998ca442 100644
--- a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
+++ b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
@@ -87,6 +87,14 @@
# undef CONFIG_PIC32MX_USBDEV_BDTDEBUG
#endif
+/* Disable this logic because it is buggy. It works most of the time but
+ * has some lurking issues that keep this higher performance solution from
+ * being usable.
+ */
+
+#undef CONFIG_USBDEV_NOWRITEAHEAD
+#define CONFIG_USBDEV_NOWRITEAHEAD 1
+
/* Interrupts ***************************************************************/
/* Initial interrupt sets */
@@ -353,7 +361,11 @@ union wb_u
struct pic32mx_req_s
{
struct usbdev_req_s req; /* Standard USB request */
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
+ uint16_t inflight[1]; /* The number of bytes "in-flight" */
+#else
uint16_t inflight[2]; /* The number of bytes "in-flight" */
+#endif
struct pic32mx_req_s *flink; /* Supports a singly linked list */
};
@@ -892,9 +904,14 @@ static void pic32mx_wrcomplete(struct pic32mx_usbdev_s *priv,
bdtin = privep->bdtin;
epno = USB_EPNO(privep->ep.eplog);
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
+ ullvdbg("EP%d: len=%d xfrd=%d inflight=%d\n",
+ epno, privreq->req.len, privreq->req.xfrd, privreq->inflight[0]);
+#else
ullvdbg("EP%d: len=%d xfrd=%d inflight={%d, %d}\n",
epno, privreq->req.len, privreq->req.xfrd,
privreq->inflight[0], privreq->inflight[1]);
+#endif
bdtdbg("EP%d BDT IN [%p] {%08x, %08x}\n",
epno, bdtin, bdtin->status, bdtin->addr);
@@ -922,8 +939,12 @@ static void pic32mx_wrcomplete(struct pic32mx_usbdev_s *priv,
/* Update the number of bytes transferred. */
privreq->req.xfrd += privreq->inflight[0];
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
+ privreq->inflight[0] = 0;
+#else
privreq->inflight[0] = privreq->inflight[1];
privreq->inflight[1] = 0;
+#endif
bytesleft = privreq->req.len - privreq->req.xfrd;
/* If all of the bytes were sent (bytesleft == 0) and no NULL packet is
@@ -1001,8 +1022,9 @@ static void pic32mx_rqrestart(int argc, uint32_t arg1, ...)
privreq->req.xfrd = 0;
privreq->inflight[0] = 0;
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
privreq->inflight[1] = 0;
-
+#endif
(void)pic32mx_wrrequest(priv, privep);
}
}
@@ -1078,6 +1100,13 @@ static int pic32mx_wrstart(struct pic32mx_usbdev_s *priv,
if (bdt->status || bdt->addr)
{
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
+ /* The current BDT is not available and write ahead is disabled. There
+ * is nothing we can do now. Return -EBUSY to indicate this condition.
+ */
+
+ return -EBUSY;
+#else
/* The current BDT is not available, check the other BDT */
volatile struct usbotg_bdtentry_s *otherbdt;
@@ -1102,6 +1131,7 @@ static int pic32mx_wrstart(struct pic32mx_usbdev_s *priv,
bdt = otherbdt;
index = 1;
+#endif
}
/* A BDT is available. Which request should we be operating on? The last
@@ -1124,8 +1154,9 @@ static int pic32mx_wrstart(struct pic32mx_usbdev_s *priv,
* because we know that there is a BDT availalbe.
*/
+#ifdef CONFIG_USBDEV_NOWRITEAHEAD
DEBUGASSERT(privreq->inflight[1] == 0);
-
+#endif
/* Has the transfer been initiated for all of the bytes? */
if (bytesleft > privreq->inflight[0])
@@ -1246,6 +1277,7 @@ static int pic32mx_wrrequest(struct pic32mx_usbdev_s *priv, struct pic32mx_ep_s
*/
ret = pic32mx_wrstart(priv, privep);
+#ifndef CONFIG_USBDEV_NOWRITEAHEAD
if (ret == OK)
{
/* Note: We need to return the error condition only if nothing was
@@ -1254,6 +1286,7 @@ static int pic32mx_wrrequest(struct pic32mx_usbdev_s *priv, struct pic32mx_ep_s
(void)pic32mx_wrstart(priv, privep);
}
+#endif
/* We return OK to indicate that a write request is still in progress */