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.
Dependents: STM32F103C8T6_WebUSBDFU STM32F103C8T6_USBDFU STM32F103C8T6_USBDFU dfu_usb_stm32f103
Fork of USBDevice_STM32F103 by
Diff: USBDevice/USBHAL_LPC11U.cpp
- Revision:
- 8:335f2506f422
- Parent:
- 3:6d85e04fb59f
- Child:
- 11:eeb3cbbaa996
--- a/USBDevice/USBHAL_LPC11U.cpp Mon Jan 21 10:41:28 2013 +0000
+++ b/USBDevice/USBHAL_LPC11U.cpp Fri Mar 01 13:10:29 2013 +0000
@@ -22,7 +22,6 @@
USBHAL * USBHAL::instance;
-
// Valid physical endpoint numbers are 0 to (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
#define LAST_PHYSICAL_ENDPOINT (NUMBER_OF_PHYSICAL_ENDPOINTS-1)
@@ -129,6 +128,16 @@
USBHAL::USBHAL(void) {
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;
// nUSB_CONNECT output
LPC_IOCON->PIO0_6 = 0x00000001;
@@ -181,7 +190,6 @@
USBHAL::~USBHAL(void) {
// Ensure device disconnected (DCON not set)
LPC_USB->DEVCMDSTAT = 0;
-
// Disable USB interrupts
NVIC_DisableIRQ(USB_IRQn);
}
@@ -199,9 +207,11 @@
}
void USBHAL::configureDevice(void) {
+ // Not required
}
void USBHAL::unconfigureDevice(void) {
+ // Not required
}
void USBHAL::EP0setup(uint8_t *buffer) {
@@ -232,6 +242,11 @@
return bytesRead;
}
+
+void USBHAL::EP0readStage(void) {
+ // Not required
+}
+
void USBHAL::EP0write(uint8_t *buffer, uint32_t size) {
// Start and endpoint 0 write
@@ -303,10 +318,7 @@
}
void USBHAL::EP0getWriteResult(void) {
- // Complete an endpoint 0 write
-
- // Nothing required for this target
- return;
+ // Not required
}
void USBHAL::EP0stall(void) {
@@ -385,8 +397,8 @@
EP_STATUS USBHAL::endpointWriteResult(uint8_t endpoint) {
uint32_t bf;
+
// Validate parameters
-
if (endpoint > LAST_PHYSICAL_ENDPOINT) {
return EP_INVALID;
}
@@ -422,8 +434,7 @@
void USBHAL::stallEndpoint(uint8_t endpoint) {
- // TODO: should this clear active bit?
-
+ // FIX: should this clear active bit?
if (IN_EP(endpoint)) {
ep[PHY_TO_LOG(endpoint)].in[0] |= CMDSTS_S;
ep[PHY_TO_LOG(endpoint)].in[1] |= CMDSTS_S;
@@ -441,26 +452,26 @@
ep[PHY_TO_LOG(endpoint)].in[1] = 0; // S = 0
if (LPC_USB->EPINUSE & EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S =0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].in[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
} else {
- ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S =0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
}
} else {
ep[PHY_TO_LOG(endpoint)].out[0] = 0; // S = 0
ep[PHY_TO_LOG(endpoint)].out[1] = 0; // S = 0
if (LPC_USB->EPINUSE & EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S =0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].out[1] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
} else {
- ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S =0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
}
}
} else {
// Single buffered
if (IN_EP(endpoint)) {
- ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S=0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].in[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
} else {
- ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S=0, TR=1, TV = 0
+ ep[PHY_TO_LOG(endpoint)].out[0] = CMDSTS_TR; // S = 0, TR = 1, TV = 0
}
}
}
@@ -658,55 +669,15 @@
// EP0IN ACK event (IN data sent)
EP0in();
}
-
- if (LPC_USB->INTSTAT & EP(EP1IN)) {
- // Clear EP1IN interrupt
- LPC_USB->INTSTAT = EP(EP1IN);
- epComplete |= EP(EP1IN);
- if (EP1_IN_callback())
- epComplete &= ~EP(EP1IN);
- }
-
- if (LPC_USB->INTSTAT & EP(EP1OUT)) {
- // Clear EP1OUT interrupt
- LPC_USB->INTSTAT = EP(EP1OUT);
- epComplete |= EP(EP1OUT);
- if (EP1_OUT_callback())
- epComplete &= ~EP(EP1OUT);
- }
-
- if (LPC_USB->INTSTAT & EP(EP2IN)) {
- // Clear EPBULK_IN interrupt
- LPC_USB->INTSTAT = EP(EP2IN);
- epComplete |= EP(EP2IN);
- if (EP2_IN_callback())
- epComplete &= ~EP(EP2IN);
- }
-
- if (LPC_USB->INTSTAT & EP(EP2OUT)) {
- // Clear EPBULK_OUT interrupt
- LPC_USB->INTSTAT = EP(EP2OUT);
- epComplete |= EP(EP2OUT);
- //Call callback function. If true, clear epComplete
- if (EP2_OUT_callback())
- epComplete &= ~EP(EP2OUT);
- }
-
- if (LPC_USB->INTSTAT & EP(EP3IN)) {
- // Clear EP3_IN interrupt
- LPC_USB->INTSTAT = EP(EP3IN);
- epComplete |= EP(EP3IN);
- if (EP3_IN_callback())
- epComplete &= ~EP(EP3IN);
- }
-
- if (LPC_USB->INTSTAT & EP(EP3OUT)) {
- // Clear EP3_OUT interrupt
- LPC_USB->INTSTAT = EP(EP3OUT);
- epComplete |= EP(EP3OUT);
- //Call callback function. If true, clear epComplete
- if (EP3_OUT_callback())
- epComplete &= ~EP(EP3OUT);
+
+ for (uint8_t num = 2; num < 5*2; num++) {
+ if (LPC_USB->INTSTAT & EP(num)) {
+ LPC_USB->INTSTAT = EP(num);
+ epComplete |= EP(num);
+ if ((instance->*(epCallback[num - 2]))()) {
+ epComplete &= ~EP(num);
+ }
+ }
}
}
