Adaptation of the official mbed USBHost repository to work with the LPC4088 Display Module

Dependents:   DMSupport DMSupport DMSupport DMSupport

Fork of DM_USBHost by EmbeddedArtists AB

Revision:
27:aa2fd412f1d3
Parent:
24:868cbfe611a7
Child:
30:ffec1f271b7c
--- a/USBHost/USBHost.cpp	Mon Aug 18 13:45:26 2014 +0100
+++ b/USBHost/USBHost.cpp	Tue Dec 02 15:16:39 2014 +0000
@@ -53,7 +53,8 @@
     bool interruptListState;
     USBEndpoint * ep;
     uint8_t i, j, res, timeout_set_addr = 10;
-    uint8_t buf[8];
+#define SAFE_USB_PROCESS_BUFF_SIZE (8)
+    uint8_t* buf = getSafeMem(SAFE_USB_PROCESS_BUFF_SIZE);
     bool too_many_hub;
     int idx;
 
@@ -121,7 +122,7 @@
                           // get first 8 bit of device descriptor
                           // and check if we deal with a hub
                           USB_DBG("usb_thread read device descriptor on dev: %p\r\n", &devices[i]);
-                          res = getDeviceDescriptor(&devices[i], buf, 8);
+                          res = getDeviceDescriptor(&devices[i], buf, SAFE_USB_PROCESS_BUFF_SIZE);
 
                           if (res != USB_TYPE_OK) {
                               USB_ERR("usb_thread could not read dev descr");
@@ -143,7 +144,7 @@
 
                           // try to read again the device descriptor to check if the device
                           // answers to its new address
-                          res = getDeviceDescriptor(&devices[i], buf, 8);
+                          res = getDeviceDescriptor(&devices[i], buf, SAFE_USB_PROCESS_BUFF_SIZE);
 
                           if (res == USB_TYPE_OK) {
                               break;
@@ -223,10 +224,10 @@
 #if DEBUG_TRANSFER
                         if (ep->getDir() == IN) {
                             buf_transfer = ep->getBufStart();
-                            printf("READ SUCCESS [%d bytes transferred - td: 0x%08X] on ep: [%p - addr: %02X]: ",  ep->getLengthTransferred(), usb_msg->td_addr, ep, ep->getAddress());
+                            USB_DBG_X("READ SUCCESS [%d bytes transferred - td: 0x%08X] on ep: [%p - addr: %02X]: ",  ep->getLengthTransferred(), usb_msg->td_addr, ep, ep->getAddress());
                             for (int i = 0; i < ep->getLengthTransferred(); i++)
-                                printf("%02X ", buf_transfer[i]);
-                            printf("\r\n\r\n");
+                                USB_DBG_X("%02X ", buf_transfer[i]);
+                            USB_DBG_X("\r\n\r\n");
                         }
 #endif
                         ep->call();
@@ -261,6 +262,9 @@
     tailInterruptEndpoint = NULL;
 
     lenReportDescr = 0;
+    
+    setupPacket = getSafeMem(SAFE_USB_HOST_SETUP_PACKET_BUFF_SIZE);
+    data = getSafeMem(SAFE_USB_HOST_DATA_BUFF_SIZE);
 
     controlEndpointAllocated = false;
 
@@ -678,22 +682,22 @@
     const char * type_str = (type == BULK_ENDPOINT) ? "BULK" :
                             ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" :
                             ((type == CONTROL_ENDPOINT) ? "CONTROL" : "ISOCHRONOUS"));
-    printf("State of %s:\r\n", type_str);
+    USB_DBG_X("State of %s:\r\n", type_str);
     while (hced != NULL) {
         uint8_t dir = ((hced->control & (3 << 11)) >> 11);
-        printf("hced: %p [ADDR: %d, DIR: %s, EP_NB: 0x%X]\r\n", hced,
+        USB_DBG_X("hced: %p [ADDR: %d, DIR: %s, EP_NB: 0x%X]\r\n", hced,
                                                    hced->control & 0x7f,
                                                    (dir == 1) ? "OUT" : ((dir == 0) ? "FROM_TD":"IN"),
                                                     (hced->control & (0xf << 7)) >> 7);
         hctd = (HCTD *)((uint32_t)(hced->headTD) & ~(0xf));
         while (hctd != hced->tailTD) {
-            printf("\thctd: %p [DIR: %s]\r\n", hctd, ((hctd->control & (3 << 19)) >> 19) == 1 ? "OUT" : "IN");
+            USB_DBG_X("\thctd: %p [DIR: %s]\r\n", hctd, ((hctd->control & (3 << 19)) >> 19) == 1 ? "OUT" : "IN");
             hctd = hctd->nextTD;
         }
-        printf("\thctd: %p\r\n", hctd);
+        USB_DBG_X("\thctd: %p\r\n", hctd);
         hced = hced->nextED;
     }
-    printf("\r\n\r\n");
+    USB_DBG_X("\r\n\r\n");
 #endif
 }
 
@@ -701,6 +705,9 @@
 // add a transfer on the TD linked list
 USB_TYPE USBHost::addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len)
 {
+    ASSERT_MEM_REGION(buf);
+    
+
     td_mutex.lock();
 
     // allocate a TD which will be freed in TDcompletion
@@ -860,7 +867,7 @@
 
       pEnumerator->setVidPid( data[8] | (data[9] << 8), data[10] | (data[11] << 8) );
 
-      res = getConfigurationDescriptor(dev, data, sizeof(data), &total_conf_descr_length);
+      res = getConfigurationDescriptor(dev, data, SAFE_USB_HOST_DATA_BUFF_SIZE/*sizeof(data)*/, &total_conf_descr_length);
       if (res != USB_TYPE_OK) {
           return res;
       }
@@ -868,8 +875,8 @@
   #if (DEBUG > 3)
       USB_DBG("CONFIGURATION DESCRIPTOR:\r\n");
       for (int i = 0; i < total_conf_descr_length; i++)
-          printf("%02X ", data[i]);
-      printf("\r\n\r\n");
+          USB_DBG_X("%02X ", data[i]);
+      USB_DBG_X("\r\n\r\n");
   #endif
 
       // Parse the configuration descriptor
@@ -990,8 +997,9 @@
     return generalTransfer(dev, ep, buf, len, blocking, INTERRUPT_ENDPOINT, false);
 }
 
-USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write) {
-
+USB_TYPE USBHost::generalTransfer(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking, ENDPOINT_TYPE type, bool write)
+{
+    
 #if DEBUG_TRANSFER
     const char * type_str = (type == BULK_ENDPOINT) ? "BULK" : ((type == INTERRUPT_ENDPOINT) ? "INTERRUPT" : "ISOCHRONOUS");
     USB_DBG_TRANSFER("----- %s %s [dev: %p - %s - hub: %d - port: %d - addr: %d - ep: %02X]------", type_str, (write) ? "WRITE" : "READ", dev, dev->getName(ep->getIntfNb()), dev->getHub(), dev->getPort(), dev->getAddress(), ep->getAddress());
@@ -1031,8 +1039,8 @@
     if (write) {
         USB_DBG_TRANSFER("%s WRITE buffer", type_str);
         for (int i = 0; i < ep->getLengthTransferred(); i++)
-            printf("%02X ", buf[i]);
-        printf("\r\n\r\n");
+            USB_DBG_X("%02X ", buf[i]);
+        USB_DBG_X("\r\n\r\n");
     }
 #endif
     addTransfer(ep, buf, len);
@@ -1087,12 +1095,12 @@
 #if DEBUG_TRANSFER
     USB_DBG_TRANSFER("SETUP PACKET: ");
     for (int i = 0; i < 8; i++)
-        printf("%01X ", setupPacket[i]);
-    printf("\r\n");
+        USB_DBG_X("%01X ", setupPacket[i]);
+    USB_DBG_X("\r\n");
 #endif
 
     control->setNextToken(TD_SETUP);
-    addTransfer(control, (uint8_t*)setupPacket, 8);
+    addTransfer(control, (uint8_t*)setupPacket, SAFE_USB_HOST_SETUP_PACKET_BUFF_SIZE);
 
     control->ep_queue.get();
     res = control->getState();
@@ -1106,6 +1114,7 @@
     if (length_transfer) {
         token = (write) ? TD_OUT : TD_IN;
         control->setNextToken(token);
+
         addTransfer(control, (uint8_t *)buf, length_transfer);
 
         control->ep_queue.get();
@@ -1116,13 +1125,13 @@
         if (write) {
             USB_DBG_TRANSFER("CONTROL WRITE buffer");
             for (int i = 0; i < control->getLengthTransferred(); i++)
-                printf("%02X ", buf[i]);
-            printf("\r\n\r\n");
+                USB_DBG_X("%02X ", buf[i]);
+            USB_DBG_X("\r\n\r\n");
         } else {
             USB_DBG_TRANSFER("CONTROL READ SUCCESS [%d bytes transferred]", control->getLengthTransferred());
             for (int i = 0; i < control->getLengthTransferred(); i++)
-                printf("%02X ", buf[i]);
-            printf("\r\n\r\n");
+                USB_DBG_X("%02X ", buf[i]);
+            USB_DBG_X("\r\n\r\n");
         }
 #endif
 
@@ -1133,6 +1142,7 @@
 
     token = (write) ? TD_IN : TD_OUT;
     control->setNextToken(token);
+
     addTransfer(control, NULL, 0);
 
     control->ep_queue.get();