Działająca myszka
Fork of USBDevice by
Diff: USBDevice/USBHAL_LPC17.cpp
- Revision:
- 8:335f2506f422
- Parent:
- 3:6d85e04fb59f
- Child:
- 25:7c72828865f3
diff -r f8f057664123 -r 335f2506f422 USBDevice/USBHAL_LPC17.cpp --- 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); + } + } } } }