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

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Import programBaseUsbHost_example

BaseUsbHost example program

Revision:
0:b7d6879637a8
Child:
1:3b7bc4f87a61
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BaseUsbHostBlkEp.cpp	Tue Dec 04 13:29:41 2012 +0000
@@ -0,0 +1,88 @@
+// BaseUsbHostBlkEp.cpp 2012/12/3
+#include "mbed.h"
+#include "rtos.h"
+#include "BaseUsbHost.h"
+//#define DEBUG
+#include "BaseUsbHostDebug.h"
+#define TEST
+#include "BaseUsbHostTest.h"
+
+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; 
+
+    m_pED->Next = LPC_USB->HcBulkHeadED;
+    LPC_USB->HcBulkHeadED = reinterpret_cast<uint32_t>(m_pED);
+    
+    DBG_OHCI(LPC_USB->HcBulkHeadED);
+    DBG_ED(m_pED);
+
+    LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
+    LPC_USB->HcControl |= OR_CONTROL_BLE;
+}
+
+int BulkEp::read(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;
+ 
+    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;
+    }
+    return USB_ERROR;
+}
+
+int BulkEp::write(const uint8_t* buf, int len, int millisec)
+{
+    HCTD* data_td = m_pED->TailTd;
+    TEST_ASSERT(data_td);
+    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);
+    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;
+    }
+    return USB_ERROR;
+}
+