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/BaseUsbHostBlkEp.cpp	Wed Dec 05 13:23:06 2012 +0000
+++ b/BaseUsbHostBlkEp.cpp	Tue Dec 11 15:26:54 2012 +0000
@@ -1,4 +1,4 @@
-// BaseUsbHostBlkEp.cpp 2012/12/5
+// BaseUsbHostBlkEp.cpp 2012/12/11
 #include "mbed.h"
 #include "rtos.h"
 #include "BaseUsbHost.h"
@@ -10,10 +10,12 @@
 BulkEp::BulkEp(int addr, uint8_t ep, uint16_t size): BaseEp(addr, ep, size)
 {
     HCTD* td = new_HCTD();
-    TEST_ASSERT(td);
     m_pED->TailTd = td;
     m_pED->HeadTd = td; 
-
+    TEST_ASSERT(td);
+    if (td == NULL) {
+        return;
+    }
     m_pED->Next = LPC_USB->HcBulkHeadED;
     LPC_USB->HcBulkHeadED = reinterpret_cast<uint32_t>(m_pED);
     
@@ -26,44 +28,57 @@
 
 int BulkEp::bulkReceive(uint8_t* buf, int len, int millisec)
 {
-    HCTD* data_td = m_pED->TailTd;
-    TEST_ASSERT(data_td);
-    data_td->Control |= TD_IN;
-    data_td->CurrBufPtr = buf;
-    data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
-    HCTD* blank_td = new_HCTD();
-    TEST_ASSERT(blank_td);
-    data_td->Next = reinterpret_cast<uint32_t>(blank_td);
-    m_pED->TailTd = blank_td;
-    m_td_queue_count++;
-    DBG_ED(m_pED);
-
-    LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
-    LPC_USB->HcControl |= OR_CONTROL_BLE;
- 
+    if (m_td_queue_count == 0) {
+        HCTD* data_td = m_pED->TailTd;
+        TEST_ASSERT(data_td);
+        if (data_td == NULL) {
+            return USB_ERROR;
+        }
+        data_td->Control |= TD_IN;
+        data_td->CurrBufPtr = buf;
+        data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
+        HCTD* blank_td = new_HCTD();
+        TEST_ASSERT(blank_td);
+        if (blank_td == NULL) {
+            return USB_ERROR_MEMORY;
+        }
+        data_td->Next = reinterpret_cast<uint32_t>(blank_td);
+        m_pED->TailTd = blank_td;
+        m_td_queue_count++;
+        DBG_ED(m_pED);
+        LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
+        LPC_USB->HcControl |= OR_CONTROL_BLE;
+    }
+    
     HCTD* td = get_queue_HCTD(millisec);
-    if (td) {
-        DBG_TD(td);
-        int ret = len;
-        if (td->CurrBufPtr) {
-            ret = td->CurrBufPtr - buf;
-        }
-        delete_HCTD(td); 
-        m_td_queue_count--;
-        return ret;
+    if (td == NULL) {
+        return USB_PROCESSING;
     }
-    return USB_ERROR;
+    DBG_TD(td);
+    int ret = len;
+    if (td->CurrBufPtr) {
+        ret = td->CurrBufPtr - buf;
+    }
+    delete_HCTD(td); 
+    m_td_queue_count--;
+    return ret;
 }
 
 int BulkEp::bulkSend(const uint8_t* buf, int len, int millisec)
 {
     HCTD* data_td = m_pED->TailTd;
     TEST_ASSERT(data_td);
+    if (data_td == NULL) {
+        return USB_ERROR;
+    }
     data_td->Control |= TD_OUT;
     data_td->CurrBufPtr = const_cast<uint8_t*>(buf);
     data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
     HCTD* blank_td = new_HCTD();
     TEST_ASSERT(blank_td);
+    if (blank_td == NULL) {
+        return USB_ERROR_MEMORY;
+    }
     data_td->Next = reinterpret_cast<uint32_t>(blank_td);
     m_pED->TailTd = blank_td;
     m_td_queue_count++;
@@ -85,4 +100,3 @@
     }
     return USB_ERROR;
 }
-