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

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Import programBaseUsbHost_example

BaseUsbHost example program

Revision:
2:fe1e62051d88
Parent:
1:3b7bc4f87a61
Child:
3:ae77d63a1eda
--- a/BaseUsbHostIsoEp.cpp	Wed Dec 05 13:23:06 2012 +0000
+++ b/BaseUsbHostIsoEp.cpp	Tue Dec 11 15:26:54 2012 +0000
@@ -1,4 +1,4 @@
-// BaseUsbHostIsoEp.cpp 2012/12/5
+// BaseUsbHostIsoEp.cpp 2012/12/11
 #include "mbed.h"
 #include "rtos.h"
 #include "BaseUsbHost.h"
@@ -16,16 +16,22 @@
 
     TEST_ASSERT(size >= 128 && size <= 1023);
     m_PacketSize = size;
-    m_FrameCount = 8;
+    m_FrameCount = 4; // 1-8
+    TEST_ASSERT(m_FrameCount >= 1 && m_FrameCount <= 8);
     m_itd_queue_count = 0;
     reset();
     HCITD* itd = new_HCITD();
-    TEST_ASSERT(itd);
     m_pED->TailTd = reinterpret_cast<HCTD*>(itd);
     m_pED->HeadTd = reinterpret_cast<HCTD*>(itd); 
-
+    TEST_ASSERT(itd);
+    if (itd == NULL) {
+        return;
+    }
     HCCA* hcca = reinterpret_cast<HCCA*>(LPC_USB->HcHCCA);
     TEST_ASSERT(hcca);
+    if (hcca == NULL) {
+        return;
+    }
     for(int i = 0; i < 32; i++) {
         if (hcca->InterruptTable[i] == 0) {
             hcca->InterruptTable[i] = reinterpret_cast<uint32_t>(m_pED);
@@ -84,15 +90,20 @@
 }
 
 
-HCITD* IsochronousEp::isochronousReveive()
+HCITD* IsochronousEp::isochronousReveive(int millisec)
 {
     TEST_ASSERT(m_itd_queue_count >= 0);
-    while(m_itd_queue_count < HCTD_QUEUE_SIZE) {
+    while(m_itd_queue_count < 3 && m_itd_queue_count < HCTD_QUEUE_SIZE) {
         HCITD* itd = reinterpret_cast<HCITD*>(m_pED->TailTd);
         TEST_ASSERT(itd);
-        //DBG_ITD(itd);
+        if (itd == NULL) {
+            return NULL;
+        }
         HCITD* blank_itd = new_HCITD();
         TEST_ASSERT(blank_itd);
+        if (blank_itd == NULL) {
+            return NULL;
+        }
         itd->Next = reinterpret_cast<uint32_t>(blank_itd);
         m_pED->TailTd = reinterpret_cast<HCTD*>(blank_itd);
         m_itd_queue_count++;
@@ -100,21 +111,23 @@
         LPC_USB->HcControl |= OR_CONTROL_PLE; // Enable Periodic
     }
     
-    HCITD* itd = get_queue_HCITD(1);
+    HCITD* itd = get_queue_HCITD(millisec);
     if (itd) {
         m_itd_queue_count--;
     }
     return itd;
 }
 
-HCITD* IsochronousEp::get_queue_HCITD(uint32_t millisec)
+HCITD* IsochronousEp::get_queue_HCITD(int millisec)
 {
     for(int i = 0; i < 16; i++) {
         osEvent evt = m_queue.get(millisec);
         if (evt.status == osEventMessage) {
             HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p);
             TEST_ASSERT(itd);
-            //led3 = !led3;
+            if (itd == NULL) {
+                return NULL;
+            }
             uint8_t cc = itd->Control>>28;
             if (cc != 0) {
                 m_ConditionCode = cc;
@@ -127,8 +140,8 @@
         } else {
             DBG("evt.status: %02x\n", evt.status);
             TEST_ASSERT(evt.status == osEventMessage);
+            return NULL;
         }
     }
     return NULL;
 }
-