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
--- a/BaseUsbHostIsoEp.cpp	Sun Jan 06 11:45:18 2013 +0000
+++ b/BaseUsbHostIsoEp.cpp	Fri Jan 25 14:51:33 2013 +0000
@@ -1,12 +1,32 @@
-// BaseUsbHostIsoEp.cpp 2012/12/31
+// BaseUsbHostIsoEp.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"
 
+HCITD::HCITD(BaseEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize) {
+    Control = 0xe0000000           | // CC ConditionCode NOT ACCESSED
+             ((FrameCount-1) << 24)| // FC FrameCount
+                  TD_DELAY_INT(0)  | // DI DelayInterrupt
+                 FrameNumber;        // SF StartingFrame
+    BufferPage0 = const_cast<uint8_t*>(buf);
+    BufferEnd = const_cast<uint8_t*>(buf) + PacketSize * FrameCount - 1;
+    Next = NULL; 
+    ep = obj;
+    uint32_t addr = reinterpret_cast<uint32_t>(buf);
+    for(int i = 0; i < FrameCount; i++) {
+        uint16_t offset = addr & 0x0fff;
+        if ((addr&0xfffff000) == (reinterpret_cast<uint32_t>(BufferEnd)&0xfffff000)) {
+            offset |= 0x1000;
+        }
+        OffsetPSW[i] = 0xe000|offset;
+        addr += PacketSize;
+    }
+}
+
 IsochronousEp::IsochronousEp(int addr, uint8_t ep, uint16_t size):BaseEp(addr, ep, size)
 {
     DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size);
@@ -20,7 +40,7 @@
     TEST_ASSERT(m_FrameCount >= 1 && m_FrameCount <= 8);
     m_itd_queue_count = 0;
     reset();
-    HCITD* itd = new_HCITD();
+    HCITD* itd = new_HCITD(this);
     m_pED->TailTd = reinterpret_cast<HCTD*>(itd);
     m_pED->HeadTd = reinterpret_cast<HCTD*>(itd); 
     TEST_ASSERT(itd);
@@ -33,14 +53,14 @@
         return;
     }
     for(int i = 0; i < 32; i++) {
-        if (hcca->InterruptTable[i] == 0) {
-            hcca->InterruptTable[i] = reinterpret_cast<uint32_t>(m_pED);
+        if (hcca->InterruptTable[i] == NULL) {
+            hcca->InterruptTable[i] = m_pED;
         } else {
-            HCED* nextEd = reinterpret_cast<HCED*>(hcca->InterruptTable[i]);
-            while(nextEd->Next && nextEd->Next != reinterpret_cast<uint32_t>(m_pED)) {
-                nextEd = reinterpret_cast<HCED*>(nextEd->Next);
+            HCED* nextEd = hcca->InterruptTable[i];
+            while(nextEd->Next && nextEd->Next != m_pED) {
+                nextEd = nextEd->Next;
             }
-            nextEd->Next = reinterpret_cast<uint32_t>(m_pED);
+            nextEd->Next = m_pED;
         }
     }
     DBG_ED(m_pED);
@@ -51,31 +71,12 @@
     m_FrameNumber = LPC_USB->HcFmNumber + delay_ms;
 }
 
-HCITD* IsochronousEp::new_HCITD()
+HCITD* IsochronousEp::new_HCITD(BaseEp* obj)
 {
-    HCITD* itd;
-    int r = posix_memalign(reinterpret_cast<void**>(&itd), 32, sizeof(HCITD)+m_PacketSize*m_FrameCount);
-    if (r != 0) {
+    HCITD* itd = new(m_PacketSize*m_FrameCount)HCITD(obj, m_FrameNumber, m_FrameCount, m_PacketSize);
+    if (itd == NULL) {
         return NULL;
     } 
-    int di = 0; //DelayInterrupt
-    itd->Control = 0xe0000000            | // CC ConditionCode NOT ACCESSED
-                 ((m_FrameCount-1) << 24)| // FC FrameCount
-                       TD_DELAY_INT(di)  | // DI DelayInterrupt
-                     m_FrameNumber;        // SF StartingFrame
-    itd->BufferPage0 = const_cast<uint8_t*>(itd->buf);
-    itd->BufferEnd = const_cast<uint8_t*>(itd->buf) + m_PacketSize * m_FrameCount - 1;
-    itd->Next = NULL; 
-    itd->ep = this;
-    uint32_t addr = reinterpret_cast<uint32_t>(itd->buf);
-    for(int i = 0; i < m_FrameCount; i++) {
-        uint16_t offset = addr & 0x0fff;
-        if ((addr&0xfffff000) == (reinterpret_cast<uint32_t>(itd->BufferEnd)&0xfffff000)) {
-            offset |= 0x1000;
-        }
-        itd->OffsetPSW[i] = 0xe000|offset;
-        addr += m_PacketSize;
-    }
     m_FrameNumber += m_FrameCount;
     return itd;
 }
@@ -89,12 +90,12 @@
         if (itd == NULL) {
             return NULL;
         }
-        HCITD* blank_itd = new_HCITD();
+        HCITD* blank_itd = new_HCITD(this);
         TEST_ASSERT(blank_itd);
         if (blank_itd == NULL) {
             return NULL;
         }
-        itd->Next = reinterpret_cast<uint32_t>(blank_itd);
+        itd->Next = blank_itd;
         m_pED->TailTd = reinterpret_cast<HCTD*>(blank_itd);
         m_itd_queue_count++;
         //DBG_IED(m_pED);
@@ -115,13 +116,6 @@
         if (evt.status == osEventMessage) {
             HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p);
             TEST_ASSERT(itd);
-            if (itd == NULL) {
-                return NULL;
-            }
-            uint8_t cc = itd->Control>>28;
-            if (cc != 0) {
-                m_ConditionCode = cc;
-            }
             return itd;
         } else if (evt.status == osOK) {
             continue;