USB host library, support isochronous,bulk,interrupt and control.

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Import programBaseUsbHost_example

BaseUsbHost example program

Revision:
4:d931d24c2f81
Parent:
3:ae77d63a1eda
Child:
5:8a2d056e9b38
--- a/BaseUsbHostCtlEp.cpp	Sun Jan 06 11:45:18 2013 +0000
+++ b/BaseUsbHostCtlEp.cpp	Fri Jan 25 14:51:33 2013 +0000
@@ -1,22 +1,43 @@
-// BaseUsbHostCtlEp.cpp 2013/1/2
+// BaseUsbHostCtlEp.cpp 2013/1/25
 #include "mbed.h"
 #include "rtos.h"
 #include "BaseUsbHost.h"
-#define DEBUG
+//#define DEBUG
 #include "BaseUsbHostDebug.h"
 #define TEST
 #include "BaseUsbHostTest.h"
 
+#pragma pack(push,1)
+struct SETUP {
+    uint8_t bmRequestType;// +0
+    uint8_t bRequest;     // +1
+    uint16_t wValue;      // +2
+    uint16_t wIndex;      // +4
+    uint16_t wLength;     // +6
+                          // +8
+    SETUP(uint8_t RequestType, uint8_t Request, uint16_t Value, uint16_t Index, uint16_t Length) {
+        CTASSERT(sizeof(SETUP) == 8);
+        TEST_ASSERT(sizeof(SETUP) == 8);
+        bmRequestType = RequestType;
+        bRequest = Request;
+        wValue = Value;
+        wIndex = Index;
+        wLength = Length;
+    };
+};
+#pragma pack(pop)
+
 static uint8_t device_addr = 1;
 ControlEp::ControlEp(int lowSpeed):BaseEp(0, 0, 8, lowSpeed)
 {
+    CTASSERT(HCTD_QUEUE_SIZE >= 3);
     TEST_ASSERT(HCTD_QUEUE_SIZE >= 3);
-    HCTD* td = new_HCTD();
+    HCTD* td = new HCTD(this);
     TEST_ASSERT(td);
     m_pED->TailTd = td;
     m_pED->HeadTd = td; 
     
-    m_pED->Next = LPC_USB->HcControlHeadED;
+    m_pED->Next = reinterpret_cast<HCED*>(LPC_USB->HcControlHeadED);
     LPC_USB->HcControlHeadED = reinterpret_cast<uint32_t>(m_pED);
 
     DBG_OHCI(LPC_USB->HcControlHeadED);
@@ -71,7 +92,6 @@
     TEST_ASSERT(addr >= 1 && addr <= 127);
     uint8_t buf[8];
     int r = GetDescriptor(1, 0, buf, 8);
-    TEST_ASSERT(r == USB_OK);
     if (r != USB_OK) {
         return r;
     }
@@ -93,36 +113,36 @@
                      uint8_t* data, int length) {
     DBG("Type: %02X Request: %02X Value: %04X Index: %04X %p %d\n", bmRequestType, bRequest, wValue, wIndex, data, length);
     HCTD* setup_td = m_pED->TailTd;
-    setup(setup_td, bmRequestType, bRequest, wValue, wIndex, length);
-    setup_td->Control |= TD_DI;
+    SETUP setup(bmRequestType, bRequest, wValue, wIndex, length);
+    setup_td->transfer(reinterpret_cast<uint8_t*>(&setup), sizeof(SETUP));
+    setup_td->Control |= TD_TOGGLE_0|TD_SETUP|TD_DI; 
 
-    HCTD* data_td = new_HCTD(length);
+    HCTD* data_td = new HCTD(this);
     TEST_ASSERT(data_td);
+    data_td->transfer(data, length);
     data_td->Control |= TD_TOGGLE_1|TD_IN|TD_DI; 
-    setup_td->Next = reinterpret_cast<uint32_t>(data_td);
+    setup_td->Next = data_td;
 
-    HCTD* status_td = new_HCTD();
+    HCTD* status_td = new HCTD(this);
     TEST_ASSERT(status_td);
     status_td->Control |= TD_TOGGLE_1|TD_OUT; // OUT(DATA1)
-    data_td->Next = reinterpret_cast<uint32_t>(status_td);
+    data_td->Next = status_td;
 
-    HCTD* blank_td = new_HCTD();
+    HCTD* blank_td = new HCTD(this);
     TEST_ASSERT(blank_td);
-    status_td->Next = reinterpret_cast<uint32_t>(blank_td);
+    status_td->Next = blank_td;
     m_pED->TailTd = blank_td;
 
     LPC_USB->HcCommandStatus |= OR_CMD_STATUS_CLF;
     LPC_USB->HcControl |= OR_CONTROL_CLE;
 
     int r = wait_queue_HCTD(setup_td, 100); // wait setup stage
-    TEST_ASSERT(r == USB_OK);
     if (r != USB_OK) {
         return r;
     }
     HCTD* td = get_queue_HCTD(100);
     if (td == data_td) {
-        memcpy(data, const_cast<uint8_t*>(td->buf), length);
-        delete_HCTD(td);
+        delete td;
     } else {
         DBG_TD(td);
         TEST_ASSERT(td == data_td);
@@ -137,24 +157,26 @@
                      const uint8_t* data, int length) {
     DBG("Type: %02X Request: %02X Value: %04X Index: %04X %p %d\n", bmRequestType, bRequest, wValue, wIndex, data, length);
     HCTD* setup_td = m_pED->TailTd;
-    setup(setup_td, bmRequestType, bRequest, wValue, wIndex, length);
 
-    HCTD* status_td = new_HCTD();
+    HCTD* status_td = new HCTD(this);
     TEST_ASSERT(status_td);
-    HCTD* blank_td = new_HCTD();
+    HCTD* blank_td = new HCTD(this);
     TEST_ASSERT(blank_td);
-    setup_td->Control |= TD_DI;
+    
+    SETUP setup(bmRequestType, bRequest, wValue, wIndex, length);
+    setup_td->transfer(reinterpret_cast<uint8_t*>(&setup), sizeof(SETUP));
+    setup_td->Control |= TD_TOGGLE_0|TD_SETUP|TD_DI; 
     status_td->Control |= TD_TOGGLE_1|TD_IN; // IN(DATA1)
-    setup_td->Next = reinterpret_cast<uint32_t>(status_td);
-    status_td->Next = reinterpret_cast<uint32_t>(blank_td);
+    setup_td->Next = status_td;
+    status_td->Next = blank_td;
 
     if (length != 0) {
-        HCTD* data_td = new_HCTD(length);
+        HCTD* data_td = new HCTD(this);
         TEST_ASSERT(data_td);
         data_td->Control |= TD_TOGGLE_1|TD_OUT|TD_DI; 
-        memcpy(const_cast<uint8_t*>(data_td->buf), data, length);
-        setup_td->Next = reinterpret_cast<uint32_t>(data_td);
-        data_td->Next = reinterpret_cast<uint32_t>(status_td);
+        data_td->transfer(const_cast<uint8_t*>(data), length);
+        setup_td->Next = data_td;
+        data_td->Next = status_td;
     }
     m_pED->TailTd = blank_td;
     DBG_ED(m_pED);
@@ -167,18 +189,15 @@
     return r;
 }
 
-void ControlEp::setup(HCTD* td, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, 
-                      uint16_t wIndex, uint16_t wLength)
-{
-    td->setup[0] = bmRequestType;
-    td->setup[1] = bRequest;
-    td->setup[2] = wValue;
-    td->setup[3] = wValue>>8;
-    td->setup[4] = wIndex;
-    td->setup[5] = wIndex>>8;
-    td->setup[6] = wLength;
-    td->setup[7] = wLength>>8;
-    td->Control |= TD_TOGGLE_0|TD_SETUP; 
-    td->CurrBufPtr = td->setup;
-    td->BufEnd = td->setup+8-1;
+HCTD::HCTD(BaseEp* obj) {
+    CTASSERT(sizeof(HCTD) == 36);
+    TEST_ASSERT(sizeof(HCTD) == 36);
+    TEST_ASSERT(obj);
+    Control = TD_CC|TD_ROUNDING;
+    CurrBufPtr = NULL;
+    Next = NULL;
+    BufEnd = NULL;
+    buf_top = NULL;
+    buf_size = 0;
+    ep = obj;
 }