USB host library, support isochronous,bulk,interrupt and control.
Dependents: BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example
Import programBaseUsbHost_example
BaseUsbHost example program
Diff: BaseUsbHostBlkEp.cpp
- 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; +} +