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:
- 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; } -