Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FastIO FastPWM SimpleDMA mbed
Fork of Pinscape_Controller by
Revision 60:f6e32a36f6ee, committed 2016-02-11
- Comitter:
- mjr
- Date:
- Thu Feb 11 23:03:01 2016 +0000
- Parent:
- 59:2ef8b269f2a8
- Child:
- 61:a23a7b57bb95
- Commit message:
- Additional USBHAL_KL25Z ISR cleanup
Changed in this revision
| USBDevice/USBDevice/USBHAL_KL25Z.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/USBDevice/USBDevice/USBHAL_KL25Z.cpp Thu Feb 11 22:47:51 2016 +0000
+++ b/USBDevice/USBDevice/USBHAL_KL25Z.cpp Thu Feb 11 23:03:01 2016 +0000
@@ -621,50 +621,68 @@
// token interrupt
if (istat & USB_ISTAT_TOKDNE_MASK)
{
+ // get the endpoint information from the status register
uint32_t num = (USB0->STAT >> 4) & 0x0F;
uint32_t dir = (USB0->STAT >> 3) & 0x01;
+ int ep = (num << 1) | dir;
uint32_t ev_odd = (USB0->STAT >> 2) & 0x01;
-
- // setup packet
- if ((num == 0) && (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == SETUP_TOKEN)) {
- Data1 &= ~0x02;
- bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK;
- bdt[EP_BDT_IDX(0, TX, ODD)].info &= ~BD_OWN_MASK;
-
- // EP0 SETUP event (SETUP data received)
- EP0setupCallback();
+ uint32_t idx = EP_BDT_IDX(num, dir, ev_odd);
- } else {
- // OUT packet
- if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) {
- if (num == 0)
- EP0out();
- else {
- epComplete |= (1 << EP(num));
- if ((instance->*(epCallback[EP(num) - 2]))()) {
- epComplete &= ~(1 << EP(num));
- }
- }
- }
+ // check which endpoint we're working with
+ if (num == 0)
+ {
+ // Endpoint 0 requires special handling
+ int pid = TOK_PID(idx);
+ if (pid == SETUP_TOKEN)
+ {
+ // SETUP packet - next IN (TX) packet must be DATA1 (confusingly,
+ // this means we must clear the Data1 bit, since we flip the bit
+ // before each send)
+ Data1 &= ~0x02;
+
+ // forcibly take ownership of the EP0IN endpoints in case we have
+ // unfinished previous transmissions (the protocol state machine here
+ // assumes that we don't, so it's probably an error if this code
+ // actually does anything, but we make no provision for handling this)
+ bdt[EP_BDT_IDX(0, TX, EVEN)].info &= ~BD_OWN_MASK;
+ bdt[EP_BDT_IDX(0, TX, ODD)].info &= ~BD_OWN_MASK;
- // IN packet
- if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == IN_TOKEN) {
- if (num == 0) {
- EP0in();
- if (set_addr == 1) {
- USB0->ADDR = addr & 0x7F;
- set_addr = 0;
- }
- }
- else {
- epComplete |= (1 << (EP(num) + 1));
- if ((instance->*(epCallback[EP(num) + 1 - 2]))()) {
- epComplete &= ~(1 << (EP(num) + 1));
- }
+ // handle the EP0 SETUP event in the generic protocol layer
+ EP0setupCallback();
+ }
+ else if (pid == OUT_TOKEN)
+ {
+ // OUT packet on EP0
+ EP0out();
+ }
+ else if (pid == IN_TOKEN)
+ {
+ // IN packet on EP0
+ EP0in();
+
+ // Special case: if the 'set address' flag is set, it means that the
+ // host just sent us our bus address. We must put this into effect
+ // in the hardware SIE *after* sending the reply, which we just did
+ // above. So it's now time!
+ if (set_addr == 1) {
+ USB0->ADDR = addr & 0x7F;
+ set_addr = 0;
}
}
}
+ else
+ {
+ // For all other endpoints, note the read/write completion in the flags
+ epComplete |= EP(ep);
+
+ // call the endpoint token callback; if that handles the token, it consumes
+ // the 'completed' status, so clear that flag again
+ if ((instance->*(epCallback[ep - 2]))()) {
+ epComplete &= ~EP(ep);
+ }
+ }
+ // clear the TOKDNE interrupt status bit
USB0->ISTAT = USB_ISTAT_TOKDNE_MASK;
}
