summaryrefslogtreecommitdiff
path: root/nuttx/arch/mips
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-03-02 17:23:02 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-03-02 17:23:02 +0000
commite2e3677fedbc7199c8898a7d951327808973a47c (patch)
treed021ca8689d5011f3ad200f5508b7688c3c3de22 /nuttx/arch/mips
parent7f70746d22efea1cec36e172debaaf4031230e96 (diff)
downloadpx4-nuttx-e2e3677fedbc7199c8898a7d951327808973a47c.tar.gz
px4-nuttx-e2e3677fedbc7199c8898a7d951327808973a47c.tar.bz2
px4-nuttx-e2e3677fedbc7199c8898a7d951327808973a47c.zip
PIC32 USB driver updates
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4444 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/mips')
-rw-r--r--nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c337
1 files changed, 167 insertions, 170 deletions
diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
index 32f172402..1ed9c29bc 100644
--- a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
+++ b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c
@@ -209,34 +209,35 @@
#define PIC32MX_TRACEINTID_EP0OUTDONE 0x0006
#define PIC32MX_TRACEINTID_EP0SETUPDONE 0x0007
#define PIC32MX_TRACEINTID_EP0SETUPSETADDRESS 0x0008
-#define PIC32MX_TRACEINTID_EPGETSTATUS 0x0009
-#define PIC32MX_TRACEINTID_EPINDONE 0x000a
-#define PIC32MX_TRACEINTID_EPINQEMPTY 0x000b
-#define PIC32MX_TRACEINTID_EPOUTDONE 0x000c
-#define PIC32MX_TRACEINTID_EPOUTPENDING 0x000d
-#define PIC32MX_TRACEINTID_EPOUTQEMPTY 0x000e
-#define PIC32MX_TRACEINTID_SOF 0x000f
-#define PIC32MX_TRACEINTID_GETCONFIG 0x0010
-#define PIC32MX_TRACEINTID_GETSETDESC 0x0011
-#define PIC32MX_TRACEINTID_GETSETIF 0x0012
-#define PIC32MX_TRACEINTID_GETSTATUS 0x0013
-#define PIC32MX_TRACEINTID_IFGETSTATUS 0x0014
-#define PIC32MX_TRACEINTID_TRNC 0x0015
-#define PIC32MX_TRACEINTID_TRNCS 0x0016
-#define PIC32MX_TRACEINTID_INTERRUPT 0x0017
-#define PIC32MX_TRACEINTID_NOSTDREQ 0x0018
-#define PIC32MX_TRACEINTID_RESET 0x0019
-#define PIC32MX_TRACEINTID_SETCONFIG 0x001a
-#define PIC32MX_TRACEINTID_SETFEATURE 0x001b
-#define PIC32MX_TRACEINTID_IDLE 0x001c
-#define PIC32MX_TRACEINTID_SYNCHFRAME 0x001d
-#define PIC32MX_TRACEINTID_WKUP 0x001e
-#define PIC32MX_TRACEINTID_T1MSEC 0x001f
-#define PIC32MX_TRACEINTID_OTGID 0x0020
-#define PIC32MX_TRACEINTID_STALL 0x0021
-#define PIC32MX_TRACEINTID_UERR 0x0022
-#define PIC32MX_TRACEINTID_SUSPENDED 0x0023
-#define PIC32MX_TRACEINTID_WAITRESET 0x0024
+#define PIC32MX_TRACEINTID_EP0ADDRESSSET 0x0009
+#define PIC32MX_TRACEINTID_EPGETSTATUS 0x000a
+#define PIC32MX_TRACEINTID_EPINDONE 0x000b
+#define PIC32MX_TRACEINTID_EPINQEMPTY 0x000c
+#define PIC32MX_TRACEINTID_EPOUTDONE 0x000d
+#define PIC32MX_TRACEINTID_EPOUTPENDING 0x000e
+#define PIC32MX_TRACEINTID_EPOUTQEMPTY 0x000f
+#define PIC32MX_TRACEINTID_SOF 0x0010
+#define PIC32MX_TRACEINTID_GETCONFIG 0x0011
+#define PIC32MX_TRACEINTID_GETSETDESC 0x0012
+#define PIC32MX_TRACEINTID_GETSETIF 0x0013
+#define PIC32MX_TRACEINTID_GETSTATUS 0x0014
+#define PIC32MX_TRACEINTID_IFGETSTATUS 0x0015
+#define PIC32MX_TRACEINTID_TRNC 0x0016
+#define PIC32MX_TRACEINTID_TRNCS 0x0017
+#define PIC32MX_TRACEINTID_INTERRUPT 0x0018
+#define PIC32MX_TRACEINTID_NOSTDREQ 0x0019
+#define PIC32MX_TRACEINTID_RESET 0x001a
+#define PIC32MX_TRACEINTID_SETCONFIG 0x001b
+#define PIC32MX_TRACEINTID_SETFEATURE 0x001c
+#define PIC32MX_TRACEINTID_IDLE 0x001d
+#define PIC32MX_TRACEINTID_SYNCHFRAME 0x001e
+#define PIC32MX_TRACEINTID_WKUP 0x001f
+#define PIC32MX_TRACEINTID_T1MSEC 0x0020
+#define PIC32MX_TRACEINTID_OTGID 0x0021
+#define PIC32MX_TRACEINTID_STALL 0x0022
+#define PIC32MX_TRACEINTID_UERR 0x0023
+#define PIC32MX_TRACEINTID_SUSPENDED 0x0024
+#define PIC32MX_TRACEINTID_WAITRESET 0x0025
/* Misc Helper Macros *******************************************************/
@@ -449,11 +450,11 @@ static void pic32mx_ep0stall(struct pic32mx_usbdev_s *priv);
static void pic32mx_eptransfer(struct pic32mx_usbdev_s *priv, uint8_t epno,
uint16_t status);
static void pic32mx_ep0nextsetup(struct pic32mx_usbdev_s *priv);
-static void pic32mx_ep0done(struct pic32mx_usbdev_s *priv);
static void pic32mx_ep0setup(struct pic32mx_usbdev_s *priv);
-static void pic32mx_ep0out(struct pic32mx_usbdev_s *priv);
-static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv);
-static void pic32mx_ep0transfer(struct pic32mx_usbdev_s *priv, uint16_t status);
+static void pic32mx_ep0outcomplete(struct pic32mx_usbdev_s *priv);
+static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv);
+static void pic32mx_ep0transfer(struct pic32mx_usbdev_s *priv,
+ uint16_t status);
static int pic32mx_interrupt(int irq, void *context);
/* Endpoint helpers *********************************************************/
@@ -755,10 +756,14 @@ static void pic32mx_epwrite(struct pic32mx_ep_s *privep, const uint8_t *src,
usbtrace(TRACE_WRITE(USB_EPNO(privep->ep.eplog)), nbytes);
- /* Clear all bits in the status preserving only the data toggle bit */
+ /* Clear all bits in the status preserving only the data toggle bit */
status = bdt->status;
status &= USB_BDT_DATA01;
+
+ /* Toggle the data toggle */
+
+ status ^= USB_BDT_DATA01;
bdt->status = status;
/* Set the data pointer, data length, and enable the endpoint */
@@ -775,12 +780,12 @@ static void pic32mx_epwrite(struct pic32mx_ep_s *privep, const uint8_t *src,
status |= USB_BDT_UOWN;
- bdtdbg("EP%d BDT IN {%08x, %08x}\n",
- USB_EPNO(privep->ep.eplog), status, bdt->addr);
+ bdtdbg("EP%d BDT IN [%p] {%08x, %08x}\n",
+ USB_EPNO(privep->ep.eplog), bdt, status, bdt->addr);
bdt->status = status;
- /* Indicate that there is data in the TX packet memory. This will be cleared
+ /* Indicate that there is TX data inflight. This will be cleared
* when the next data out interrupt is received.
*/
@@ -1091,8 +1096,8 @@ static int pic32mx_rdsetup(struct pic32mx_usbdev_s *priv,
status |= USB_BDT_UOWN;
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n",
- USB_EPNO(privep->ep.eplog), status, bdt->addr);
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n",
+ USB_EPNO(privep->ep.eplog), bdt, status, bdt->addr);
bdt->status = status;
return OK;
@@ -1298,87 +1303,56 @@ static void pic32mx_eptransfer(struct pic32mx_usbdev_s *priv, uint8_t epno,
static void pic32mx_ep0nextsetup(struct pic32mx_usbdev_s *priv)
{
- struct pic32mx_ep_s *ep0 = &priv->eplist[EP0];
- volatile struct usbotg_bdtentry_s *bdt = ep0->bdtin;
- uint16_t status;
-
- priv->ctrlstate = CTRLSTATE_WAITSETUP;
-
- /* Don't need to do anything to EP0 OUT buffer descriptor table (BDT) here,
- * as EP0 OUT next is already configured and ready to receive a SETUP
- * transaction.
- */
-
- status = bdt->status & ~USB_BDT_UOWN;
- status &= ~USB_BDT_UOWN;
-
- bdtdbg("EP0 BDT IN [%p] {%08x, %08x}\n", bdt, status, bdt->addr);
-
- bdt->status = status;
-}
-
-/****************************************************************************
- * Name: pic32mx_ep0done
- ****************************************************************************/
-
-static void pic32mx_ep0done(struct pic32mx_usbdev_s *priv)
-{
struct pic32mx_ep_s *ep0 = &priv->eplist[EP0];
volatile struct usbotg_bdtentry_s *bdtlast;
volatile struct usbotg_bdtentry_s *bdtnext;
uint32_t status;
uint32_t bytecount;
- uint32_t data01;
- /* Which BDT did we just finish working with? Which one will be next */
+ /* This operation should be performed no more than once per OUT transaction.
+ * priv->ep0done is set to zero at the beginning of processing of each EP0
+ * transfer. It is set the first time that this function runs after the EP0
+ * transfer.
+ */
- bdtlast = ep0->bdtout;
- if (bdtlast == &g_bdt[EP0_OUT_EVEN])
+ if (!priv->ep0done)
{
- bdtnext = &g_bdt[EP0_OUT_ODD];
- }
- else
- {
- DEBUGASSERT(bdtlast == &g_bdt[EP0_OUT_ODD]);
- bdtnext = &g_bdt[EP0_OUT_EVEN];
- }
-
- /* Prepare OUT EP to respond to early termination NOTE: If
- * something went wrong during the control transfer, the last
- * status stage may not be sent by the host. When this happens,
- * two different things could happen depending on the host. a)
- * The host could send out a RESET. b) The host could send out
- * a new SETUP transaction without sending a RESET first. To
- * properly handle case (b), the OUT EP must be setup to
- * receive either a zero length OUT transaction, or a new
- * SETUP transaction. Furthermore, the Cnt byte should be set
- * to prepare for the SETUP data (8-byte or more), and the
- * buffer address should be pointed to priv->ctrl.
- */
+ /* Which BDT did we just finish working with? Which one will be next */
+
+ bdtlast = ep0->bdtout;
+ if (bdtlast == &g_bdt[EP0_OUT_EVEN])
+ {
+ bdtnext = &g_bdt[EP0_OUT_ODD];
+ }
+ else
+ {
+ DEBUGASSERT(bdtlast == &g_bdt[EP0_OUT_ODD]);
+ bdtnext = &g_bdt[EP0_OUT_EVEN];
+ }
+
+ /* Setup to receive the next SETUP packet. Data toggle synchronization
+ * is not needed for SETUP packets.
+ */
- bytecount = (USB_SIZEOF_CTRLREQ << USB_BDT_BYTECOUNT_SHIFT);
- data01 = (bdtlast->status & USB_BDT_DATA01) ^ USB_BDT_DATA01;
+ bytecount = (USB_SIZEOF_CTRLREQ << USB_BDT_BYTECOUNT_SHIFT);
- status = bdtnext->status;
- status &= ~(USB_BDT_BSTALL | USB_BDT_NINC | USB_BDT_KEEP | USB_BDT_BYTECOUNT_MASK);
- status = (USB_BDT_UOWN | USB_BDT_DTS | data01 | bytecount);
+ status = bdtnext->status;
+ status = (USB_BDT_UOWN | bytecount);
- bdtnext->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
- bdtdbg("EP0 BDT OUT Next [%p] {%08x, %08x}\n", bdtnext, status, bdtnext->addr);
- bdtnext->status = status;
- priv->eplist[EP0].bdtout = bdtnext;
+ bdtnext->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
+ bdtnext->status = status;
+ priv->eplist[EP0].bdtout = bdtnext;
- /* Force a STALL if there is any access to the other buffer. */
+ /* Force a STALL if there is any access to the other buffer. */
- status = bdtlast->status;
- status &= ~(USB_BDT_UOWN | USB_BDT_BYTECOUNT_MASK);
- status |= (USB_BDT_BSTALL | bytecount);
+ status = bdtlast->status;
+ status = (USB_BDT_BSTALL | bytecount);
- bdtlast->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
- bdtdbg("EP0 BDT OUT Last [%p] {%08x, %08x}\n", bdtlast, status, bdtlast->addr);
- bdtlast->status = status;
+ bdtlast->status = status;
+ bdtlast->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
- priv->ep0done = 1;
+ priv->ep0done = 1;
+ }
}
/****************************************************************************
@@ -1433,12 +1407,12 @@ static void pic32mx_ep0setup(struct pic32mx_usbdev_s *priv)
/* Assume NOT stalled; no TX in progress */
- ep0->stalled = 0;
- ep0->txbusy = 0;
+ ep0->stalled = false;
+ ep0->txbusy = false;
/* Initialize for the SETUP */
- priv->ctrlstate = CTRLSTATE_WAITSETUP;
+ priv->ctrlstate = CTRLSTATE_WAITSETUP;
/* And extract the little-endian 16-bit values to host order */
@@ -1449,8 +1423,6 @@ static void pic32mx_ep0setup(struct pic32mx_usbdev_s *priv)
ullvdbg("SETUP: type=%02x req=%02x value=%04x index=%04x len=%04x\n",
priv->ctrl.type, priv->ctrl.req, value.w, index.w, len.w);
- priv->ctrlstate = CTRLSTATE_WAITSETUP;
-
/* Dispatch any non-standard requests */
if ((priv->ctrl.type & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_STANDARD)
@@ -1933,7 +1905,7 @@ resume_packet_processing:
{
/* No.. Set up the BDTs to accept the next setup commend. */
- pic32mx_ep0done(priv);
+ pic32mx_ep0nextsetup(priv);
}
else
{
@@ -1944,19 +1916,51 @@ resume_packet_processing:
}
/****************************************************************************
- * Name: pic32mx_ep0in
+ * Name: pic32mx_ep0incomplete
****************************************************************************/
-static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
+static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv)
{
- volatile struct usbotg_bdtentry_s *bdt;
struct pic32mx_ep_s *ep0 = &priv->eplist[EP0];
+ volatile struct usbotg_bdtentry_s *bdtlast;
+ volatile struct usbotg_bdtentry_s *bdtnext;
+ uint32_t data01;
int ret;
- /* There is no longer anything in the EP0 TX packet memory */
+ /* An EP0 OUT transfer has just completed */
ep0->txbusy = false;
- bdt = ep0->bdtin;
+
+ /* Get the last IN BDT and its data toggle */
+
+ bdtlast = ep0->bdtin;
+ data01 = (bdtlast->status & USB_BDT_DATA01);
+
+ /* Get the next BDT */
+
+ if (bdtlast == &g_bdt[EP0_IN_EVEN])
+ {
+ bdtnext = &g_bdt[EP0_IN_ODD];
+ }
+ else
+ {
+ DEBUGASSERT(bdtlast == &g_bdt[EP0_IN_ODD]);
+ bdtnext = &g_bdt[EP0_IN_EVEN];
+ }
+
+ /* Make sure that we own the last BDT. */
+
+ bdtlast->status = (USB_BDT_DATA0 | USB_BDT_DTS | USB_BDT_BSTALL);
+ bdtlast->addr = 0;
+
+ /* Setup the next BDT with the same data toggle (We own this one too) */
+
+ bdtnext->status = (data01 | USB_BDT_DTS | USB_BDT_BSTALL);
+ bdtnext->addr = 0;
+
+ /* Save the next BDT */
+
+ ep0->bdtin = bdtnext;
/* Are we processing the completion of one packet of an outgoing request
* from the class driver?
@@ -1970,7 +1974,9 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
pic32mx_wrcomplete(priv, &priv->eplist[EP0]);
- /* Handle the next queue IN transfer */
+ /* Handle the next queue IN transfer. If there are no further IN
+ * transfers, pic32mx_wrrequest will set ctrlstate = CTRLSTATE_WAITSETUP
+ */
ret = pic32mx_wrrequest(priv, &priv->eplist[EP0]);
if (ret == OK)
@@ -1979,9 +1985,11 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
if (priv->ctrlstate == CTRLSTATE_WAITSETUP)
{
- /* No... Prepare for the next SETUP transfer */
+ /* Set DATA1 to one in the next BDT because the first thing
+ * we will do when transmitting is toggle the bit
+ */
- pic32mx_ep0nextsetup(priv);
+ bdtnext->status &= ~USB_BDT_DATA01;
}
}
}
@@ -1997,6 +2005,7 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
if (priv->devstate == DEVSTATE_ADDRPENDING)
{
uint16_t addr = GETUINT16(priv->ctrl.value);
+ usbtrace(TRACE_INTDECODE(PIC32MX_TRACEINTID_EP0ADDRESSSET), addr);
/* This should be the equivalent state */
@@ -2004,6 +2013,8 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
(priv->ctrl.type & REQRECIPIENT_MASK) ==
(USB_REQ_TYPE_STANDARD | USB_REQ_RECIPIENT_DEVICE));
+ /* Set (or clear) the address */
+
pic32mx_putreg(addr, PIC32MX_USB_ADDR);
if (addr > 0)
{
@@ -2015,9 +2026,11 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
}
}
- /* Prepare for the next SETUP transfer */
+ /* Clear DATA1 to one in the next BDT because the first thing we will
+ * do when transmitting is toggle the bit
+ */
- pic32mx_ep0nextsetup(priv);
+ bdtnext->status &= ~USB_BDT_DATA01;
}
/* No other state is expected in this context */
@@ -2030,13 +2043,12 @@ static void pic32mx_ep0in(struct pic32mx_usbdev_s *priv)
}
/****************************************************************************
- * Name: pic32mx_ep0out
+ * Name: pic32mx_ep0outcomplete
****************************************************************************/
-static void pic32mx_ep0out(struct pic32mx_usbdev_s *priv)
+static void pic32mx_ep0outcomplete(struct pic32mx_usbdev_s *priv)
{
struct pic32mx_ep_s *ep0 = &priv->eplist[EP0];
- uint16_t status;
switch (priv->ctrlstate)
{
@@ -2052,33 +2064,18 @@ static void pic32mx_ep0out(struct pic32mx_usbdev_s *priv)
{
/* Prepare EP0 OUT for the next SETUP transaction. */
- pic32mx_ep0done(priv);
+ pic32mx_ep0nextsetup(priv);
}
break;
- case CTRLSTATE_WAITSETUP: /* No transfer in progress, waiting for setup */
+ case CTRLSTATE_WAITSETUP: /* No transfer in progress, waiting for SETUP */
{
/* In this case the last OUT transaction must have been a status
- * stage of a CTRLSTATE_WRREQUEST
- */
-
- /* Prepare EP0 OUT for the next SETUP transaction. However,
- * EP0 may have already been prepared if the last control transfer
- * was of direction: device to host, see pic32mx_ep0done(). If
- * it was already prepared, we do not want to do anything to
- * the buffer descriptor table (BDT).
+ * stage of a CTRLSTATE_WRREQUEST: Prepare EP0 OUT for the next SETUP
+ * transaction.
*/
pic32mx_ep0nextsetup(priv);
-
- if (!priv->ep0done)
- {
- /* Prepare EP0 OUT for the next SETUP transaction. */
-
- pic32mx_ep0done(priv);
- }
-
- priv->ep0done = 0;
}
break;
@@ -2153,7 +2150,7 @@ static void pic32mx_ep0transfer(struct pic32mx_usbdev_s *priv, uint16_t status)
/* Handle the data OUT transfer */
usbtrace(TRACE_INTDECODE(PIC32MX_TRACEINTID_EP0OUTDONE), status);
- pic32mx_ep0out(priv);
+ pic32mx_ep0outcomplete(priv);
}
}
@@ -2165,7 +2162,7 @@ static void pic32mx_ep0transfer(struct pic32mx_usbdev_s *priv, uint16_t status)
/* Handle the IN transfer complete */
- pic32mx_ep0in(priv);
+ pic32mx_ep0incomplete(priv);
}
/* Check for a stall */
@@ -2603,28 +2600,28 @@ static void pic32mx_ep0configure(struct pic32mx_usbdev_s *priv)
pic32mx_putreg(PIC32MX_EP_CONTROL, PIC32MX_USB_EP0);
- /* Configure the OUT BDTs. We expect to receive on the EVEN BDT first.
- * If an OUT token is sent by the host before a SETUP token is sent, the
- * firmware should respond with a STALL.
+ /* Configure the OUT BDTs. We assume that the ping-poing buffer index has
+ * just been reset and we expect to receive on the EVEN BDT first. Data
+ * toggle synchronization is not needed for SETUP packets.
*/
bytecount = (USB_SIZEOF_CTRLREQ << USB_BDT_BYTECOUNT_SHIFT);
bdt = &g_bdt[EP0_OUT_EVEN];
bdt->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
- bdt->status = (USB_BDT_UOWN | USB_BDT_DATA0 | USB_BDT_DTS | bytecount);
+ bdt->status = (USB_BDT_UOWN | bytecount);
priv->eplist[EP0].bdtout = bdt;
bdt = &g_bdt[EP0_OUT_ODD];
- bdt->status = (USB_BDT_DATA1 | USB_BDT_BSTALL | USB_BDT_DTS | bytecount);
+ bdt->status = (USB_BDT_BSTALL | bytecount);
bdt->addr = (uint8_t *)PHYS_ADDR(&priv->ctrl);
- /* Configure the IN BDTs. Set DATA1 to one in the EVEN BDT because the first
- * thing we will do when transmitting is* toggle the bit
+ /* Configure the IN BDTs. Set DATA0 in the EVEN BDT because the first
+ * thing we will do when transmitting is toggle the bit
*/
bdt = &g_bdt[EP0_IN_EVEN];
- bdt->status = (USB_BDT_DATA1 | USB_BDT_DTS | USB_BDT_BSTALL);
+ bdt->status = (USB_BDT_DATA0 | USB_BDT_DTS | USB_BDT_BSTALL);
bdt->addr = 0;
priv->eplist[EP0].bdtin = bdt;
@@ -2651,7 +2648,7 @@ static void pic32mx_ep0bdtdump(const char *msg)
bdt = &g_bdt[EP0_IN_EVEN];
bdtdbg(" IN EVEN [%p] {%08x, %08x}\n", bdt, bdt->status, bdt->addr);
bdt = &g_bdt[EP0_IN_ODD];
- bdtdbg(" IN ODD [%p] {%08x, %08x}\n", bdt, bdt->status, bdt->addr);
+ bdtdbg(" IN ODD [%p] {%08x, %08x}\n", bdt, bdt->status, bdt->addr);
}
#endif
@@ -2663,8 +2660,8 @@ static void pic32mx_ep0bdtdump(const char *msg)
****************************************************************************/
static int pic32mx_epconfigure(struct usbdev_ep_s *ep,
- const struct usb_epdesc_s *desc,
- bool last)
+ const struct usb_epdesc_s *desc,
+ bool last)
{
struct pic32mx_ep_s *privep = (struct pic32mx_ep_s *)ep;
volatile struct usbotg_bdtentry_s *bdt;
@@ -2735,28 +2732,28 @@ static int pic32mx_epconfigure(struct usbdev_ep_s *ep,
/* Mark that we own the entry */
- status = bdt->status & ~USB_BDT_UOWN;
+ status = bdt->status;
+ status &= ~USB_BDT_UOWN;
/* Set DATA1 to one because the first thing we will do when transmitting is
* toggle the bit
*/
- status |= USB_BDT_DATA01;
+ status |= USB_BDT_DATA1;
bdt->status = status;
- bdtdbg("EP%d BDT IN {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT IN [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
/* Now do the same for the other buffer. The only difference is the
* we clear DATA1 (making it DATA0)
*/
bdt = &g_bdt[index+1];
- status = bdt->status & ~USB_BDT_UOWN;
-
- status &= ~USB_BDT_DATA01;
+ status = bdt->status;
+ status &= ~(USB_BDT_UOWN | USB_BDT_DATA01);
bdt->status = status;
- bdtdbg("EP%d BDT IN {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT IN [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
}
if (!epin || bidi)
@@ -2767,16 +2764,17 @@ static int pic32mx_epconfigure(struct usbdev_ep_s *ep,
/* Mark that we own the entry */
- status = bdt->status & ~USB_BDT_UOWN;
+ status = bdt->status;
+ status &= ~USB_BDT_UOWN;
/* Set DATA1 to one because the first thing we will do when transmitting is
* toggle the bit
*/
- status |= USB_BDT_DATA01;
+ status |= USB_BDT_DATA1;
bdt->status = status;
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
/* Now do the same for the other buffer. The only difference is the
* we clear DATA1 (making it DATA0)
@@ -2788,7 +2786,7 @@ static int pic32mx_epconfigure(struct usbdev_ep_s *ep,
status &= ~USB_BDT_DATA01;
bdt->status = status;
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
}
/* Get the maxpacket size of the endpoint. */
@@ -3075,8 +3073,7 @@ static int pic32mx_epbdtstall(struct usbdev_ep_s *ep,
/* Then give the BDT to the USB */
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n", epno, status, bdt->addr);
-
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
bdt->status = status;
/* Restart any queued write requests */
@@ -3097,7 +3094,7 @@ static int pic32mx_epbdtstall(struct usbdev_ep_s *ep,
/* Then give the BDT to the USB */
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
bdt->status = status;
}
@@ -3117,7 +3114,7 @@ static int pic32mx_epbdtstall(struct usbdev_ep_s *ep,
/* And give the BDT to the USB */
- bdtdbg("EP%d BDT OUT {%08x, %08x}\n", epno, status, bdt->addr);
+ bdtdbg("EP%d BDT OUT [%p] {%08x, %08x}\n", epno, bdt, status, bdt->addr);
bdt->status = status;
}