supported GR-PEACH original: http://developer.mbed.org/users/va009039/code/USBHostC270_example/ The function of Isochronous has moved to USBHost_AddIso library.
Dependencies: USBHost_custom_Addiso
Fork of USBHostC270_example_GR-PEACH by
Revision 13:fa85d3614acf, committed 2015-04-01
- Comitter:
- dkato
- Date:
- Wed Apr 01 05:46:06 2015 +0000
- Parent:
- 12:ea4badc78215
- Child:
- 14:7d4864959eb7
- Commit message:
- The function of Isochronous has moved to USBHost_AddIso library.
Changed in this revision
--- a/USBHost.lib Wed Mar 20 14:28:39 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/va009039/code/USBHost/#a338d6a681fb
--- a/USBHostC270/USBHostC270.cpp Wed Mar 20 14:28:39 2013 +0000 +++ b/USBHostC270/USBHostC270.cpp Wed Apr 01 05:46:06 2015 +0000 @@ -75,8 +75,6 @@ report_cc_count[i] = 0; report_ps_cc_count[i] = 0; } - LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable - LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable dev_connected = true; return true;
--- a/USBHostC270/USBisochronous/USBIsochronous.cpp Wed Mar 20 14:28:39 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -// USBIsochronous.cpp -#include "USBHostConf.h" -#include "USBHost.h" -#include "USBIsochronous.h" - -//#define ISO_DEBUG 1 -#ifdef ISO_DEBUG -#define ISO_DBG(x, ...) std::printf("[%s:%d]"x"\r\n", __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__); -#else -#define ISO_DBG(...) while(0); -#endif - -#define TEST_ASSERT(A) while(!(A)){fprintf(stderr,"\n\n%s@%d %s ASSERT!\n\n",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);}; - -HCITD::HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize) { - Control = 0xe0000000 | // CC ConditionCode NOT ACCESSED - ((FrameCount-1) << 24)| // FC FrameCount - TD_DELAY_INT(0) | // DI DelayInterrupt - FrameNumber; // SF StartingFrame - BufferPage0 = const_cast<uint8_t*>(buf); - BufferEnd = const_cast<uint8_t*>(buf) + PacketSize * FrameCount - 1; - Next = NULL; - ep = obj; - uint32_t addr = reinterpret_cast<uint32_t>(buf); - for(int i = 0; i < FrameCount; i++) { - uint16_t offset = addr & 0x0fff; - if ((addr&0xfffff000) == (reinterpret_cast<uint32_t>(BufferEnd)&0xfffff000)) { - offset |= 0x1000; - } - OffsetPSW[i] = 0xe000|offset; - addr += PacketSize; - } -} - -void IsochronousEp::init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount, uint8_t queueLimit) -{ - //ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size); - TEST_ASSERT(addr >= 1); - TEST_ASSERT(size >= 8 && size <= 1023); - m_pED = new _HCED(addr, ep, size); - TEST_ASSERT(m_pED); - - m_pED->setFormat(); // F Format ITD - - TEST_ASSERT(size >= 128 && size <= 1023); - m_PacketSize = size; - TEST_ASSERT(frameCount >= 1 && frameCount <= 8); - m_FrameCount = frameCount; - TEST_ASSERT(queueLimit >= 1 && queueLimit <= HCITD_QUEUE_SIZE); - m_itd_queue_limit = queueLimit; - - m_itd_queue_count = 0; - reset(); - HCITD* itd = new_HCITD(this); - m_pED->init_queue<HCITD>(itd); - TEST_ASSERT(itd); - if (itd == NULL) { - return; - } - _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA); - TEST_ASSERT(hcca); - if (hcca == NULL) { - return; - } - hcca->enqueue(m_pED); -} - -void IsochronousEp::reset(int delay_ms) -{ - m_FrameNumber = LPC_USB->HcFmNumber + delay_ms; -} - -HCITD* IsochronousEp::new_HCITD(IsochronousEp* obj) -{ - HCITD* itd = new(m_PacketSize*m_FrameCount)HCITD(obj, m_FrameNumber, m_FrameCount, m_PacketSize); - if (itd == NULL) { - return NULL; - } - m_FrameNumber += m_FrameCount; - return itd; -} - -HCITD* IsochronousEp::isochronousReceive(int timeout_ms) -{ - TEST_ASSERT(m_itd_queue_count >= 0); - while(m_itd_queue_count < m_itd_queue_limit) { - if (m_pED == NULL) { - ISO_DBG("m_pED is NULL"); - break; - } - if (m_pED->Skip()) { - break; - } - HCITD* blank_itd = new_HCITD(this); - TEST_ASSERT(blank_itd); - if (m_pED->enqueue<HCITD>(blank_itd)) { - m_itd_queue_count++; - } - enable(); // Enable Periodic - } - - HCITD* itd = get_queue_HCITD(timeout_ms); - if (itd) { - m_itd_queue_count--; - } - return itd; -} - -int IsochronousEp::isochronousSend(uint8_t* buf, int len, int timeout_ms) -{ - //ISO_DBG("buf: %p, len: %d", buf, len); - HCITD* itd = get_queue_HCITD(timeout_ms); - if (itd) { - delete itd; - m_itd_queue_count--; - TEST_ASSERT(m_itd_queue_count >= 0); - } - TEST_ASSERT(m_itd_queue_count >= 0); - if(m_itd_queue_count < m_itd_queue_limit) { - if (m_pED == NULL) { - ISO_DBG("m_pED is NULL"); - return 0; - } - if (m_pED->Skip()) { - return 0; - } - itd = new_HCITD(this); - TEST_ASSERT(itd); - //ISO_DBG("m_pED: %p itd: %p", m_pED, itd); - memcpy(const_cast<uint8_t*>(itd->buf), buf, len); - if (m_pED->enqueue<HCITD>(itd)) { - m_itd_queue_count++; - } - enable(); // Enable Periodic - //ISO_DBG("m_itd_queue_count: %d", m_itd_queue_count); - return len; - } - return 0; -} - -HCITD* IsochronousEp::get_queue_HCITD(int timeout_ms) -{ - Timer t; - t.reset(); - t.start(); - do { - osEvent evt = m_queue.get(0); - if (evt.status == osEventMessage) { - HCITD* itd = reinterpret_cast<HCITD*>(evt.value.p); - TEST_ASSERT(itd); - return itd; - } else if (evt.status == osOK) { - ; - } else if (evt.status == osEventTimeout) { - break; - } else { - ISO_DBG("evt.status: %02x\n", evt.status); - TEST_ASSERT(evt.status == osEventMessage); - break; - } - } while(t.read_ms() < timeout_ms); - return NULL; -} - -void IsochronousEp::enable() -{ - LPC_USB->HcControl |= OR_CONTROL_PLE; -} - -void IsochronousEp::disconnect() -{ - m_pED->setSkip(); // skip bit on - ISO_DBG("rtos-queue: %d", m_itd_queue_count); - int queue_count = m_itd_queue_count; - Timer t; - t.reset(); - t.start(); - do { - HCITD* itd = get_queue_HCITD(10); - if (itd) { - ISO_DBG("delete ITD:%p from rtos-queue %d ms", itd, t.read_ms()); - delete itd; - queue_count--; - t.reset(); - } - } while(t.read_ms() < 50); - ISO_DBG("rtos-queue: %d, %d ms", queue_count, t.read_ms()); - TEST_ASSERT(queue_count >= 0); - while(1) { - HCITD* itd = m_pED->dequeue<HCITD>(); - if (itd == NULL) { - break; - } - ISO_DBG("delete ITD:%p from ED(%p)-queue", itd, m_pED); - delete itd; - TEST_ASSERT(queue_count > 0); - queue_count--; - } - TEST_ASSERT(queue_count == 0); - HCITD* tail = reinterpret_cast<HCITD*>(m_pED->TailTd); - ISO_DBG("delete ITD:%p from ED(%p)-tail", tail, m_pED); - TEST_ASSERT(tail); - delete tail; - m_pED->init_queue<HCITD>(NULL); - - _HCCA* hcca = reinterpret_cast<_HCCA*>(LPC_USB->HcHCCA); - TEST_ASSERT(hcca); - hcca->dequeue(m_pED); - ISO_DBG("delete ED:%p", m_pED); - delete m_pED; - m_pED = NULL; -}
--- a/USBHostC270/USBisochronous/USBIsochronous.h Wed Mar 20 14:28:39 2013 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,200 +0,0 @@ -// USBIsochronous.h -#pragma once - -class IsochronousEp; -struct HCITD { // HostController Isochronous Transfer Descriptor - __IO uint32_t Control; // +0 Transfer descriptor control - uint8_t* BufferPage0; // +4 Buffer Page 0 - HCITD* Next; // +8 Physical pointer to next Isochronous Transfer Descriptor - uint8_t* BufferEnd; // +12 buffer End - __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW - IsochronousEp* ep; // +32 endpoint object - __IO uint8_t buf[0]; // +36 buffer - // +36 - HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize); - inline void* operator new(size_t size, int buf_size) { - void* p; - if (posix_memalign(&p, 32, size+buf_size) == 0) { - return p; - } - return NULL; - } - - inline void operator delete(void* p) { - free(p); - } - - inline uint16_t StartingFrame() { - return Control & 0xffff; - } - - inline uint8_t FrameCount() { - return ((Control>>24)&7)+1; - } - - inline uint8_t ConditionCode() { - return Control>>28; - } -}; - -struct _HCED { // HostController EndPoint Descriptor - __IO uint32_t Control; // +0 Endpoint descriptor control - HCTD* TailTd; // +4 Physical address of tail in Transfer descriptor list - __IO HCTD* HeadTd; // +8 Physcial address of head in Transfer descriptor list - _HCED* Next; // +12 Physical address of next Endpoint descriptor - // +16 - _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed = 0) { - Control = addr | /* USB address */ - ((ep & 0x7F) << 7) | /* Endpoint address */ - (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */ - ((lowSpeed?1:0) << 13) | /* speed full=0 low=1 */ - (size << 16); /* MaxPkt Size */ - Next = NULL; - } - - inline void* operator new(size_t size) { - void* p; - if (posix_memalign(&p, 16, size) == 0) { - return p; - } - return NULL; - } - - inline void operator delete(void* p) { - free(p); - } - - inline uint8_t FunctionAddress() { - return Control & 0x7f; - } - - inline int Speed() { - return (Control>>13)&1; - } - - inline void setFunctionAddress(int addr) { - Control &= ~0x7f; - Control |= addr; - } - - inline void setMaxPacketSize(uint16_t size) { - Control &= ~0xffff0000; - Control |= size<<16; - } - - int Skip() { - return (Control>>14) & 1; - } - - void setSkip() { - Control |= (1<<14); - } - - void setFormat() { - Control |= (1<<15); - } - - template<typename T> - inline bool enqueue(T* td) { - if (td) { - T* tail = reinterpret_cast<T*>(TailTd); - if (tail) { - tail->Next = td; - TailTd = reinterpret_cast<HCTD*>(td); - return true; - } - } - return false; - } - - template<typename T> - inline T* dequeue() { - T* head = reinterpret_cast<T*>(reinterpret_cast<uint32_t>(HeadTd)&~3); // delete Halted and Toggle Carry bit - T* tail = reinterpret_cast<T*>(TailTd); - if (head == NULL || tail == NULL || head == tail) { - return NULL; - } - HeadTd = reinterpret_cast<HCTD*>(head->Next); - return head; - } - template<typename T> - void init_queue(T* td) { - TailTd = reinterpret_cast<HCTD*>(td); - HeadTd = reinterpret_cast<HCTD*>(td); - } -}; - -struct _HCCA { // Host Controller Communication Area - _HCED* InterruptTable[32]; // +0 Interrupt Table - __IO uint16_t FrameNumber;// +128 Frame Number - __IO uint16_t Pad1; // +130 - __IO HCTD* DoneHead; // +132 Done Head - uint8_t Reserved[116]; // +136 Reserved for future use - uint8_t Unknown[4]; // +252 Unused - // +256 - inline void* operator new(size_t size) { - void* p; - if (posix_memalign(&p, 256, size) == 0) { - return p; - } - return NULL; - } - - inline void operator delete(void* p) { - free(p); - } - - inline void enqueue(_HCED* ed) { - for(int i = 0; i < 32; i++) { - if (InterruptTable[i] == NULL) { - InterruptTable[i] = ed; - } else { - _HCED* nextEd = InterruptTable[i]; - while(nextEd->Next && nextEd->Next != ed) { - nextEd = nextEd->Next; - } - nextEd->Next = ed; - } - } - } - - inline void dequeue(_HCED* ed) { - for(int i = 0; i < 32; i++) { - if (InterruptTable[i] == ed) { - InterruptTable[i] = ed->Next; - } else if (InterruptTable[i]) { - _HCED* nextEd = InterruptTable[i]; - while(nextEd) { - if (nextEd->Next == ed) { - nextEd->Next = ed->Next; - break; - } - nextEd = nextEd->Next; - } - } - } - } -}; - -#define HCITD_QUEUE_SIZE 3 - -class IsochronousEp { -public: - void init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount = 4, uint8_t queueLimit = HCITD_QUEUE_SIZE); - void reset(int delay_ms = 100); - HCITD* isochronousReceive(int timeout_ms); - int isochronousSend(uint8_t* buf, int len, int timeout_ms); - HCITD* get_queue_HCITD(int timeout_ms); - uint16_t m_PacketSize; - void disconnect(); - void irqWdhHandler(HCITD* itd) {m_queue.put(itd);} // WDH -private: - HCITD* new_HCITD(IsochronousEp* obj); - Queue<HCITD, HCITD_QUEUE_SIZE> m_queue; // ITD done queue - int m_itd_queue_count; - int m_itd_queue_limit; - uint16_t m_FrameNumber; - int m_FrameCount; // 1-8 - void enable(); - _HCED* m_pED; -};
--- a/USBHostCam/USBHostCam.cpp Wed Mar 20 14:28:39 2013 +0000 +++ b/USBHostCam/USBHostCam.cpp Wed Apr 01 05:46:06 2015 +0000 @@ -82,8 +82,6 @@ report_cc_count[i] = 0; report_ps_cc_count[i] = 0; } - LPC_USB->HcControl |= OR_CONTROL_PLE; // PeriodicListEnable - LPC_USB->HcControl |= OR_CONTROL_IE; // IsochronousEnable dev_connected = true; return true;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBHost_AddIso.lib Wed Apr 01 05:46:06 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/teams/GR-PEACH_producer_meeting/code/USBHost_AddIso/#2851a9b2bbfb
--- a/main.cpp Wed Mar 20 14:28:39 2013 +0000 +++ b/main.cpp Wed Apr 01 05:46:06 2015 +0000 @@ -4,13 +4,14 @@ Serial pc(USBTX, USBRX); BusOut leds(LED1, LED2, LED3); +static uint8_t buf[1024*10]; + int main() { pc.baud(921600); USBHostMSD* msd = new USBHostMSD("usb"); // USB flash drive USBHostC270* cam = new USBHostC270(C270_MJPEG, C270_160x120, _5FPS); // Logitech C270 - uint8_t buf[1024*3]; Timer interval_t; interval_t.reset(); interval_t.start();
--- a/mbed.bld Wed Mar 20 14:28:39 2013 +0000 +++ b/mbed.bld Wed Apr 01 05:46:06 2015 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/5e5da4a5990b \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/487b796308b0 \ No newline at end of file