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

Dependents:   BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example

Import programBaseUsbHost_example

BaseUsbHost example program

Committer:
va009039
Date:
Wed Dec 05 13:23:06 2012 +0000
Revision:
1:3b7bc4f87a61
Parent:
0:b7d6879637a8
Child:
2:fe1e62051d88
add uvc class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 1:3b7bc4f87a61 1 // BaseUsbHostBlkEp.cpp 2012/12/5
va009039 0:b7d6879637a8 2 #include "mbed.h"
va009039 0:b7d6879637a8 3 #include "rtos.h"
va009039 0:b7d6879637a8 4 #include "BaseUsbHost.h"
va009039 0:b7d6879637a8 5 //#define DEBUG
va009039 0:b7d6879637a8 6 #include "BaseUsbHostDebug.h"
va009039 0:b7d6879637a8 7 #define TEST
va009039 0:b7d6879637a8 8 #include "BaseUsbHostTest.h"
va009039 0:b7d6879637a8 9
va009039 0:b7d6879637a8 10 BulkEp::BulkEp(int addr, uint8_t ep, uint16_t size): BaseEp(addr, ep, size)
va009039 0:b7d6879637a8 11 {
va009039 0:b7d6879637a8 12 HCTD* td = new_HCTD();
va009039 0:b7d6879637a8 13 TEST_ASSERT(td);
va009039 0:b7d6879637a8 14 m_pED->TailTd = td;
va009039 0:b7d6879637a8 15 m_pED->HeadTd = td;
va009039 0:b7d6879637a8 16
va009039 0:b7d6879637a8 17 m_pED->Next = LPC_USB->HcBulkHeadED;
va009039 0:b7d6879637a8 18 LPC_USB->HcBulkHeadED = reinterpret_cast<uint32_t>(m_pED);
va009039 0:b7d6879637a8 19
va009039 0:b7d6879637a8 20 DBG_OHCI(LPC_USB->HcBulkHeadED);
va009039 0:b7d6879637a8 21 DBG_ED(m_pED);
va009039 0:b7d6879637a8 22
va009039 0:b7d6879637a8 23 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 0:b7d6879637a8 24 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 0:b7d6879637a8 25 }
va009039 0:b7d6879637a8 26
va009039 1:3b7bc4f87a61 27 int BulkEp::bulkReceive(uint8_t* buf, int len, int millisec)
va009039 0:b7d6879637a8 28 {
va009039 0:b7d6879637a8 29 HCTD* data_td = m_pED->TailTd;
va009039 0:b7d6879637a8 30 TEST_ASSERT(data_td);
va009039 0:b7d6879637a8 31 data_td->Control |= TD_IN;
va009039 0:b7d6879637a8 32 data_td->CurrBufPtr = buf;
va009039 0:b7d6879637a8 33 data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
va009039 0:b7d6879637a8 34 HCTD* blank_td = new_HCTD();
va009039 0:b7d6879637a8 35 TEST_ASSERT(blank_td);
va009039 0:b7d6879637a8 36 data_td->Next = reinterpret_cast<uint32_t>(blank_td);
va009039 0:b7d6879637a8 37 m_pED->TailTd = blank_td;
va009039 0:b7d6879637a8 38 m_td_queue_count++;
va009039 0:b7d6879637a8 39 DBG_ED(m_pED);
va009039 0:b7d6879637a8 40
va009039 0:b7d6879637a8 41 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 0:b7d6879637a8 42 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 0:b7d6879637a8 43
va009039 0:b7d6879637a8 44 HCTD* td = get_queue_HCTD(millisec);
va009039 0:b7d6879637a8 45 if (td) {
va009039 0:b7d6879637a8 46 DBG_TD(td);
va009039 0:b7d6879637a8 47 int ret = len;
va009039 0:b7d6879637a8 48 if (td->CurrBufPtr) {
va009039 0:b7d6879637a8 49 ret = td->CurrBufPtr - buf;
va009039 0:b7d6879637a8 50 }
va009039 0:b7d6879637a8 51 delete_HCTD(td);
va009039 0:b7d6879637a8 52 m_td_queue_count--;
va009039 0:b7d6879637a8 53 return ret;
va009039 0:b7d6879637a8 54 }
va009039 0:b7d6879637a8 55 return USB_ERROR;
va009039 0:b7d6879637a8 56 }
va009039 0:b7d6879637a8 57
va009039 1:3b7bc4f87a61 58 int BulkEp::bulkSend(const uint8_t* buf, int len, int millisec)
va009039 0:b7d6879637a8 59 {
va009039 0:b7d6879637a8 60 HCTD* data_td = m_pED->TailTd;
va009039 0:b7d6879637a8 61 TEST_ASSERT(data_td);
va009039 0:b7d6879637a8 62 data_td->Control |= TD_OUT;
va009039 0:b7d6879637a8 63 data_td->CurrBufPtr = const_cast<uint8_t*>(buf);
va009039 0:b7d6879637a8 64 data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
va009039 0:b7d6879637a8 65 HCTD* blank_td = new_HCTD();
va009039 0:b7d6879637a8 66 TEST_ASSERT(blank_td);
va009039 0:b7d6879637a8 67 data_td->Next = reinterpret_cast<uint32_t>(blank_td);
va009039 0:b7d6879637a8 68 m_pED->TailTd = blank_td;
va009039 0:b7d6879637a8 69 m_td_queue_count++;
va009039 0:b7d6879637a8 70 DBG_ED(m_pED);
va009039 0:b7d6879637a8 71
va009039 0:b7d6879637a8 72 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 0:b7d6879637a8 73 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 0:b7d6879637a8 74
va009039 0:b7d6879637a8 75 HCTD* td = get_queue_HCTD(millisec);
va009039 0:b7d6879637a8 76 if (td) {
va009039 0:b7d6879637a8 77 DBG_TD(td);
va009039 0:b7d6879637a8 78 int ret = len;
va009039 0:b7d6879637a8 79 if (td->CurrBufPtr) {
va009039 0:b7d6879637a8 80 ret = td->CurrBufPtr - buf;
va009039 0:b7d6879637a8 81 }
va009039 0:b7d6879637a8 82 delete_HCTD(td);
va009039 0:b7d6879637a8 83 m_td_queue_count--;
va009039 0:b7d6879637a8 84 return ret;
va009039 0:b7d6879637a8 85 }
va009039 0:b7d6879637a8 86 return USB_ERROR;
va009039 0:b7d6879637a8 87 }
va009039 0:b7d6879637a8 88