USBDevice with MAX32620HSP platform support

Fork of USBDevice by mbed official

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);
+            }
+        }
     }
 }