diff options
author | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-18 20:39:18 +0000 |
---|---|---|
committer | patacongo <patacongo@7fd9a85b-ad96-42d3-883c-3090e2eb8679> | 2012-03-18 20:39:18 +0000 |
commit | 199e9314622731714c0331264a52e8b1d00a1d4e (patch) | |
tree | 7fcf92024b569edcf9b161076c787631b0805928 /nuttx/arch | |
parent | 9242a9e5789751f99d595ceb0dfd1b0af3a3ad2e (diff) | |
download | px4-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.c | 37 |
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 */ |