USB host library, support isochronous,bulk,interrupt and control.
Dependents: BaseUsbHost_example BaseJpegDecode_example SimpleJpegDecode_example
Import programBaseUsbHost_example
BaseUsbHost example program
Diff: BaseUsbHostCtlEp.cpp
- Revision:
- 4:d931d24c2f81
- Parent:
- 3:ae77d63a1eda
- Child:
- 5:8a2d056e9b38
--- a/BaseUsbHostCtlEp.cpp Sun Jan 06 11:45:18 2013 +0000 +++ b/BaseUsbHostCtlEp.cpp Fri Jan 25 14:51:33 2013 +0000 @@ -1,22 +1,43 @@ -// BaseUsbHostCtlEp.cpp 2013/1/2 +// BaseUsbHostCtlEp.cpp 2013/1/25 #include "mbed.h" #include "rtos.h" #include "BaseUsbHost.h" -#define DEBUG +//#define DEBUG #include "BaseUsbHostDebug.h" #define TEST #include "BaseUsbHostTest.h" +#pragma pack(push,1) +struct SETUP { + uint8_t bmRequestType;// +0 + uint8_t bRequest; // +1 + uint16_t wValue; // +2 + uint16_t wIndex; // +4 + uint16_t wLength; // +6 + // +8 + SETUP(uint8_t RequestType, uint8_t Request, uint16_t Value, uint16_t Index, uint16_t Length) { + CTASSERT(sizeof(SETUP) == 8); + TEST_ASSERT(sizeof(SETUP) == 8); + bmRequestType = RequestType; + bRequest = Request; + wValue = Value; + wIndex = Index; + wLength = Length; + }; +}; +#pragma pack(pop) + static uint8_t device_addr = 1; ControlEp::ControlEp(int lowSpeed):BaseEp(0, 0, 8, lowSpeed) { + CTASSERT(HCTD_QUEUE_SIZE >= 3); TEST_ASSERT(HCTD_QUEUE_SIZE >= 3); - HCTD* td = new_HCTD(); + HCTD* td = new HCTD(this); TEST_ASSERT(td); m_pED->TailTd = td; m_pED->HeadTd = td; - m_pED->Next = LPC_USB->HcControlHeadED; + m_pED->Next = reinterpret_cast<HCED*>(LPC_USB->HcControlHeadED); LPC_USB->HcControlHeadED = reinterpret_cast<uint32_t>(m_pED); DBG_OHCI(LPC_USB->HcControlHeadED); @@ -71,7 +92,6 @@ TEST_ASSERT(addr >= 1 && addr <= 127); uint8_t buf[8]; int r = GetDescriptor(1, 0, buf, 8); - TEST_ASSERT(r == USB_OK); if (r != USB_OK) { return r; } @@ -93,36 +113,36 @@ uint8_t* data, int length) { DBG("Type: %02X Request: %02X Value: %04X Index: %04X %p %d\n", bmRequestType, bRequest, wValue, wIndex, data, length); HCTD* setup_td = m_pED->TailTd; - setup(setup_td, bmRequestType, bRequest, wValue, wIndex, length); - setup_td->Control |= TD_DI; + SETUP setup(bmRequestType, bRequest, wValue, wIndex, length); + setup_td->transfer(reinterpret_cast<uint8_t*>(&setup), sizeof(SETUP)); + setup_td->Control |= TD_TOGGLE_0|TD_SETUP|TD_DI; - HCTD* data_td = new_HCTD(length); + HCTD* data_td = new HCTD(this); TEST_ASSERT(data_td); + data_td->transfer(data, length); data_td->Control |= TD_TOGGLE_1|TD_IN|TD_DI; - setup_td->Next = reinterpret_cast<uint32_t>(data_td); + setup_td->Next = data_td; - HCTD* status_td = new_HCTD(); + HCTD* status_td = new HCTD(this); TEST_ASSERT(status_td); status_td->Control |= TD_TOGGLE_1|TD_OUT; // OUT(DATA1) - data_td->Next = reinterpret_cast<uint32_t>(status_td); + data_td->Next = status_td; - HCTD* blank_td = new_HCTD(); + HCTD* blank_td = new HCTD(this); TEST_ASSERT(blank_td); - status_td->Next = reinterpret_cast<uint32_t>(blank_td); + status_td->Next = blank_td; m_pED->TailTd = blank_td; LPC_USB->HcCommandStatus |= OR_CMD_STATUS_CLF; LPC_USB->HcControl |= OR_CONTROL_CLE; int r = wait_queue_HCTD(setup_td, 100); // wait setup stage - TEST_ASSERT(r == USB_OK); if (r != USB_OK) { return r; } HCTD* td = get_queue_HCTD(100); if (td == data_td) { - memcpy(data, const_cast<uint8_t*>(td->buf), length); - delete_HCTD(td); + delete td; } else { DBG_TD(td); TEST_ASSERT(td == data_td); @@ -137,24 +157,26 @@ const uint8_t* data, int length) { DBG("Type: %02X Request: %02X Value: %04X Index: %04X %p %d\n", bmRequestType, bRequest, wValue, wIndex, data, length); HCTD* setup_td = m_pED->TailTd; - setup(setup_td, bmRequestType, bRequest, wValue, wIndex, length); - HCTD* status_td = new_HCTD(); + HCTD* status_td = new HCTD(this); TEST_ASSERT(status_td); - HCTD* blank_td = new_HCTD(); + HCTD* blank_td = new HCTD(this); TEST_ASSERT(blank_td); - setup_td->Control |= TD_DI; + + SETUP setup(bmRequestType, bRequest, wValue, wIndex, length); + setup_td->transfer(reinterpret_cast<uint8_t*>(&setup), sizeof(SETUP)); + setup_td->Control |= TD_TOGGLE_0|TD_SETUP|TD_DI; status_td->Control |= TD_TOGGLE_1|TD_IN; // IN(DATA1) - setup_td->Next = reinterpret_cast<uint32_t>(status_td); - status_td->Next = reinterpret_cast<uint32_t>(blank_td); + setup_td->Next = status_td; + status_td->Next = blank_td; if (length != 0) { - HCTD* data_td = new_HCTD(length); + HCTD* data_td = new HCTD(this); TEST_ASSERT(data_td); data_td->Control |= TD_TOGGLE_1|TD_OUT|TD_DI; - memcpy(const_cast<uint8_t*>(data_td->buf), data, length); - setup_td->Next = reinterpret_cast<uint32_t>(data_td); - data_td->Next = reinterpret_cast<uint32_t>(status_td); + data_td->transfer(const_cast<uint8_t*>(data), length); + setup_td->Next = data_td; + data_td->Next = status_td; } m_pED->TailTd = blank_td; DBG_ED(m_pED); @@ -167,18 +189,15 @@ return r; } -void ControlEp::setup(HCTD* td, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, - uint16_t wIndex, uint16_t wLength) -{ - td->setup[0] = bmRequestType; - td->setup[1] = bRequest; - td->setup[2] = wValue; - td->setup[3] = wValue>>8; - td->setup[4] = wIndex; - td->setup[5] = wIndex>>8; - td->setup[6] = wLength; - td->setup[7] = wLength>>8; - td->Control |= TD_TOGGLE_0|TD_SETUP; - td->CurrBufPtr = td->setup; - td->BufEnd = td->setup+8-1; +HCTD::HCTD(BaseEp* obj) { + CTASSERT(sizeof(HCTD) == 36); + TEST_ASSERT(sizeof(HCTD) == 36); + TEST_ASSERT(obj); + Control = TD_CC|TD_ROUNDING; + CurrBufPtr = NULL; + Next = NULL; + BufEnd = NULL; + buf_top = NULL; + buf_size = 0; + ep = obj; }