diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-03-02 17:23:02 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-03-02 17:23:02 +0000 |
commit | e2e3677fedbc7199c8898a7d951327808973a47c (patch) | |
tree | d021ca8689d5011f3ad200f5508b7688c3c3de22 /nuttx/arch/mips/src/pic32mx | |
parent | 7f70746d22efea1cec36e172debaaf4031230e96 (diff) | |
download | px4-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/src/pic32mx')
-rw-r--r-- | nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c | 337 |
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; } |