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:
Tue Dec 04 13:29:41 2012 +0000
Revision:
0:b7d6879637a8
Child:
1:3b7bc4f87a61
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:b7d6879637a8 1 // BaseUsbHostIntEp.cpp 2012/12/4
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 InterruptEp::InterruptEp(int addr, uint8_t ep, uint16_t size, int lowSpeed)
va009039 0:b7d6879637a8 11 :BaseEp(addr, ep, size, lowSpeed)
va009039 0:b7d6879637a8 12 {
va009039 0:b7d6879637a8 13 HCTD* td = new_HCTD();
va009039 0:b7d6879637a8 14 TEST_ASSERT(td);
va009039 0:b7d6879637a8 15 m_pED->TailTd = td;
va009039 0:b7d6879637a8 16 m_pED->HeadTd = td;
va009039 0:b7d6879637a8 17
va009039 0:b7d6879637a8 18 HCCA* pHcca = reinterpret_cast<HCCA*>(LPC_USB->HcHCCA);
va009039 0:b7d6879637a8 19 TEST_ASSERT(pHcca);
va009039 0:b7d6879637a8 20 int n = 0;
va009039 0:b7d6879637a8 21 m_pED->Next = pHcca->InterruptTable[n];
va009039 0:b7d6879637a8 22 pHcca->InterruptTable[n] = reinterpret_cast<uint32_t>(m_pED);
va009039 0:b7d6879637a8 23 LPC_USB->HcControl |= OR_CONTROL_PLE;
va009039 0:b7d6879637a8 24 }
va009039 0:b7d6879637a8 25
va009039 0:b7d6879637a8 26 int InterruptEp::read(uint8_t* buf, int len, int millisec)
va009039 0:b7d6879637a8 27 {
va009039 0:b7d6879637a8 28 if (m_td_queue_count == 0) {
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 LPC_USB->HcControl |= OR_CONTROL_PLE; // Enable Periodic
va009039 0:b7d6879637a8 41 }
va009039 0:b7d6879637a8 42
va009039 0:b7d6879637a8 43 HCTD* td = get_queue_HCTD(millisec);
va009039 0:b7d6879637a8 44 if (td) {
va009039 0:b7d6879637a8 45 DBG_TD(td);
va009039 0:b7d6879637a8 46 int ret = len;
va009039 0:b7d6879637a8 47 if (td->CurrBufPtr) {
va009039 0:b7d6879637a8 48 ret = td->CurrBufPtr - buf;
va009039 0:b7d6879637a8 49 }
va009039 0:b7d6879637a8 50 delete_HCTD(td);
va009039 0:b7d6879637a8 51 m_td_queue_count--;
va009039 0:b7d6879637a8 52 return ret;
va009039 0:b7d6879637a8 53 }
va009039 0:b7d6879637a8 54 return USB_TIMEOUT;
va009039 0:b7d6879637a8 55 }