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.
Fork of USBDevice by
Diff: USBDevice/USBHAL_LPC17.cpp
- Revision:
- 8:335f2506f422
- Parent:
- 3:6d85e04fb59f
- Child:
- 25:7c72828865f3
--- a/USBDevice/USBHAL_LPC17.cpp Mon Jan 21 10:41:28 2013 +0000
+++ b/USBDevice/USBHAL_LPC17.cpp Fri Mar 01 13:10:29 2013 +0000
@@ -16,7 +16,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#ifdef TARGET_LPC1768
+#if defined(TARGET_LPC1768) || defined(TARGET_LPC2368)
#include "USBHAL.h"
@@ -116,8 +116,8 @@
USBHAL * USBHAL::instance;
-volatile int epComplete;
-uint32_t endpointStallState;
+static volatile int epComplete;
+static uint32_t endpointStallState;
static void SIECommand(uint32_t command) {
// The command phase of a SIE transaction
@@ -209,18 +209,14 @@
static void SIEconnect(void) {
// Connect USB device
- uint8_t status;
-
- status = SIEgetDeviceStatus();
+ uint8_t status = SIEgetDeviceStatus();
SIEsetDeviceStatus(status | SIE_DS_CON);
}
static void SIEdisconnect(void) {
// Disconnect USB device
- uint8_t status;
-
- status = SIEgetDeviceStatus();
+ uint8_t status = SIEgetDeviceStatus();
SIEsetDeviceStatus(status & ~SIE_DS_CON);
}
@@ -233,9 +229,6 @@
}
-
-
-
static void enableEndpointEvent(uint8_t endpoint) {
// Enable an endpoint interrupt
LPC_USB->USBEpIntEn |= EP(endpoint);
@@ -248,8 +241,6 @@
}
static volatile uint32_t __attribute__((used)) dummyRead;
-
-
uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) {
// Read from an OUT endpoint
uint32_t size;
@@ -333,15 +324,41 @@
SIEvalidateBuffer();
}
-
-
-
-
-
-
USBHAL::USBHAL(void) {
// Disable IRQ
NVIC_DisableIRQ(USB_IRQn);
+
+ // fill in callback array
+ epCallback[0] = &USBHAL::EP1_OUT_callback;
+ epCallback[1] = &USBHAL::EP1_IN_callback;
+ epCallback[2] = &USBHAL::EP2_OUT_callback;
+ epCallback[3] = &USBHAL::EP2_IN_callback;
+ epCallback[4] = &USBHAL::EP3_OUT_callback;
+ epCallback[5] = &USBHAL::EP3_IN_callback;
+ epCallback[6] = &USBHAL::EP4_OUT_callback;
+ epCallback[7] = &USBHAL::EP4_IN_callback;
+ epCallback[8] = &USBHAL::EP5_OUT_callback;
+ epCallback[9] = &USBHAL::EP5_IN_callback;
+ epCallback[10] = &USBHAL::EP6_OUT_callback;
+ epCallback[11] = &USBHAL::EP6_IN_callback;
+ epCallback[12] = &USBHAL::EP7_OUT_callback;
+ epCallback[13] = &USBHAL::EP7_IN_callback;
+ epCallback[14] = &USBHAL::EP8_OUT_callback;
+ epCallback[15] = &USBHAL::EP8_IN_callback;
+ epCallback[16] = &USBHAL::EP9_OUT_callback;
+ epCallback[17] = &USBHAL::EP9_IN_callback;
+ epCallback[18] = &USBHAL::EP10_OUT_callback;
+ epCallback[19] = &USBHAL::EP10_IN_callback;
+ epCallback[20] = &USBHAL::EP11_OUT_callback;
+ epCallback[21] = &USBHAL::EP11_IN_callback;
+ epCallback[22] = &USBHAL::EP12_OUT_callback;
+ epCallback[23] = &USBHAL::EP12_IN_callback;
+ epCallback[24] = &USBHAL::EP13_OUT_callback;
+ epCallback[25] = &USBHAL::EP13_IN_callback;
+ epCallback[26] = &USBHAL::EP14_OUT_callback;
+ epCallback[27] = &USBHAL::EP14_IN_callback;
+ epCallback[28] = &USBHAL::EP15_OUT_callback;
+ epCallback[29] = &USBHAL::EP15_IN_callback;
// Enable power to USB device controller
LPC_SC->PCONP |= PCUSB;
@@ -381,7 +398,6 @@
USBHAL::~USBHAL(void) {
// Ensure device disconnected
SIEdisconnect();
-
// Disable USB interrupts
NVIC_DisableIRQ(USB_IRQn);
}
@@ -418,6 +434,10 @@
// Not required
}
+void USBHAL::EP0readStage(void) {
+ // Not required
+}
+
uint32_t USBHAL::EP0getReadResult(uint8_t *buffer) {
return endpointReadcore(EP0OUT, buffer);
}
@@ -527,10 +547,6 @@
SIEsetDeviceStatus(status & ~SIE_DS_SUS);
}
-
-
-
-
void USBHAL::_usbisr(void) {
instance->usbisr();
}
@@ -590,54 +606,16 @@
LPC_USB->USBDevIntClr = EP_SLOW;
EP0in();
}
-
- // TODO: This should cover all endpoints, not just EP1,2,3:
- if (LPC_USB->USBEpIntSt & EP(EP1IN)) {
- selectEndpointClearInterrupt(EP1IN);
- epComplete |= EP(EP1IN);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP1_IN_callback())
- epComplete &= ~EP(EP1IN);
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP1OUT)) {
- selectEndpointClearInterrupt(EP1OUT);
- epComplete |= EP(EP1OUT);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP1_OUT_callback())
- epComplete &= ~EP(EP1OUT);
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP2IN)) {
- selectEndpointClearInterrupt(EP2IN);
- epComplete |= EP(EP2IN);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP2_IN_callback())
- epComplete &= ~EP(EP2IN);
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP2OUT)) {
- selectEndpointClearInterrupt(EP2OUT);
- epComplete |= EP(EP2OUT);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP2_OUT_callback())
- epComplete &= ~EP(EP2OUT);
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP3IN)) {
- selectEndpointClearInterrupt(EP3IN);
- epComplete |= EP(EP3IN);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP3_IN_callback())
- epComplete &= ~EP(EP3IN);
- }
-
- if (LPC_USB->USBEpIntSt & EP(EP3OUT)) {
- selectEndpointClearInterrupt(EP3OUT);
- epComplete |= EP(EP3OUT);
- LPC_USB->USBDevIntClr = EP_SLOW;
- if (EP3_OUT_callback())
- epComplete &= ~EP(EP3OUT);
+
+ for (uint8_t num = 2; num < 16*2; num++) {
+ if (LPC_USB->USBEpIntSt & EP(num)) {
+ selectEndpointClearInterrupt(num);
+ epComplete |= EP(num);
+ LPC_USB->USBDevIntClr = EP_SLOW;
+ if ((instance->*(epCallback[num - 2]))()) {
+ epComplete &= ~EP(num);
+ }
+ }
}
}
}
