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 11 15:26:54 2012 +0000
Revision:
2:fe1e62051d88
Parent:
1:3b7bc4f87a61
Child:
3:ae77d63a1eda
bug fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 2:fe1e62051d88 1 // BaseUsbHostBlkEp.cpp 2012/12/11
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 m_pED->TailTd = td;
va009039 0:b7d6879637a8 14 m_pED->HeadTd = td;
va009039 2:fe1e62051d88 15 TEST_ASSERT(td);
va009039 2:fe1e62051d88 16 if (td == NULL) {
va009039 2:fe1e62051d88 17 return;
va009039 2:fe1e62051d88 18 }
va009039 0:b7d6879637a8 19 m_pED->Next = LPC_USB->HcBulkHeadED;
va009039 0:b7d6879637a8 20 LPC_USB->HcBulkHeadED = reinterpret_cast<uint32_t>(m_pED);
va009039 0:b7d6879637a8 21
va009039 0:b7d6879637a8 22 DBG_OHCI(LPC_USB->HcBulkHeadED);
va009039 0:b7d6879637a8 23 DBG_ED(m_pED);
va009039 0:b7d6879637a8 24
va009039 0:b7d6879637a8 25 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 0:b7d6879637a8 26 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 0:b7d6879637a8 27 }
va009039 0:b7d6879637a8 28
va009039 1:3b7bc4f87a61 29 int BulkEp::bulkReceive(uint8_t* buf, int len, int millisec)
va009039 0:b7d6879637a8 30 {
va009039 2:fe1e62051d88 31 if (m_td_queue_count == 0) {
va009039 2:fe1e62051d88 32 HCTD* data_td = m_pED->TailTd;
va009039 2:fe1e62051d88 33 TEST_ASSERT(data_td);
va009039 2:fe1e62051d88 34 if (data_td == NULL) {
va009039 2:fe1e62051d88 35 return USB_ERROR;
va009039 2:fe1e62051d88 36 }
va009039 2:fe1e62051d88 37 data_td->Control |= TD_IN;
va009039 2:fe1e62051d88 38 data_td->CurrBufPtr = buf;
va009039 2:fe1e62051d88 39 data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
va009039 2:fe1e62051d88 40 HCTD* blank_td = new_HCTD();
va009039 2:fe1e62051d88 41 TEST_ASSERT(blank_td);
va009039 2:fe1e62051d88 42 if (blank_td == NULL) {
va009039 2:fe1e62051d88 43 return USB_ERROR_MEMORY;
va009039 2:fe1e62051d88 44 }
va009039 2:fe1e62051d88 45 data_td->Next = reinterpret_cast<uint32_t>(blank_td);
va009039 2:fe1e62051d88 46 m_pED->TailTd = blank_td;
va009039 2:fe1e62051d88 47 m_td_queue_count++;
va009039 2:fe1e62051d88 48 DBG_ED(m_pED);
va009039 2:fe1e62051d88 49 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 2:fe1e62051d88 50 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 2:fe1e62051d88 51 }
va009039 2:fe1e62051d88 52
va009039 0:b7d6879637a8 53 HCTD* td = get_queue_HCTD(millisec);
va009039 2:fe1e62051d88 54 if (td == NULL) {
va009039 2:fe1e62051d88 55 return USB_PROCESSING;
va009039 0:b7d6879637a8 56 }
va009039 2:fe1e62051d88 57 DBG_TD(td);
va009039 2:fe1e62051d88 58 int ret = len;
va009039 2:fe1e62051d88 59 if (td->CurrBufPtr) {
va009039 2:fe1e62051d88 60 ret = td->CurrBufPtr - buf;
va009039 2:fe1e62051d88 61 }
va009039 2:fe1e62051d88 62 delete_HCTD(td);
va009039 2:fe1e62051d88 63 m_td_queue_count--;
va009039 2:fe1e62051d88 64 return ret;
va009039 0:b7d6879637a8 65 }
va009039 0:b7d6879637a8 66
va009039 1:3b7bc4f87a61 67 int BulkEp::bulkSend(const uint8_t* buf, int len, int millisec)
va009039 0:b7d6879637a8 68 {
va009039 0:b7d6879637a8 69 HCTD* data_td = m_pED->TailTd;
va009039 0:b7d6879637a8 70 TEST_ASSERT(data_td);
va009039 2:fe1e62051d88 71 if (data_td == NULL) {
va009039 2:fe1e62051d88 72 return USB_ERROR;
va009039 2:fe1e62051d88 73 }
va009039 0:b7d6879637a8 74 data_td->Control |= TD_OUT;
va009039 0:b7d6879637a8 75 data_td->CurrBufPtr = const_cast<uint8_t*>(buf);
va009039 0:b7d6879637a8 76 data_td->BufEnd = const_cast<uint8_t*>(buf)+len-1;
va009039 0:b7d6879637a8 77 HCTD* blank_td = new_HCTD();
va009039 0:b7d6879637a8 78 TEST_ASSERT(blank_td);
va009039 2:fe1e62051d88 79 if (blank_td == NULL) {
va009039 2:fe1e62051d88 80 return USB_ERROR_MEMORY;
va009039 2:fe1e62051d88 81 }
va009039 0:b7d6879637a8 82 data_td->Next = reinterpret_cast<uint32_t>(blank_td);
va009039 0:b7d6879637a8 83 m_pED->TailTd = blank_td;
va009039 0:b7d6879637a8 84 m_td_queue_count++;
va009039 0:b7d6879637a8 85 DBG_ED(m_pED);
va009039 0:b7d6879637a8 86
va009039 0:b7d6879637a8 87 LPC_USB->HcCommandStatus |= OR_CMD_STATUS_BLF;
va009039 0:b7d6879637a8 88 LPC_USB->HcControl |= OR_CONTROL_BLE;
va009039 0:b7d6879637a8 89
va009039 0:b7d6879637a8 90 HCTD* td = get_queue_HCTD(millisec);
va009039 0:b7d6879637a8 91 if (td) {
va009039 0:b7d6879637a8 92 DBG_TD(td);
va009039 0:b7d6879637a8 93 int ret = len;
va009039 0:b7d6879637a8 94 if (td->CurrBufPtr) {
va009039 0:b7d6879637a8 95 ret = td->CurrBufPtr - buf;
va009039 0:b7d6879637a8 96 }
va009039 0:b7d6879637a8 97 delete_HCTD(td);
va009039 0:b7d6879637a8 98 m_td_queue_count--;
va009039 0:b7d6879637a8 99 return ret;
va009039 0:b7d6879637a8 100 }
va009039 0:b7d6879637a8 101 return USB_ERROR;
va009039 0:b7d6879637a8 102 }