LogitechC270 webcam class driver alpha version
Fork of USBHostMSD_HelloWorld by
Diff: USBHostC270/BaseUvc.cpp
- Revision:
- 11:6a8eef89eb22
- Parent:
- 10:387c49b2fc7e
- Child:
- 12:ea4badc78215
diff -r 387c49b2fc7e -r 6a8eef89eb22 USBHostC270/BaseUvc.cpp --- a/USBHostC270/BaseUvc.cpp Sun Mar 17 13:22:13 2013 +0000 +++ b/USBHostC270/BaseUvc.cpp Mon Mar 18 12:34:47 2013 +0000 @@ -102,12 +102,13 @@ } } -IsochronousEp::IsochronousEp(int addr, uint8_t ep, uint16_t size):BaseEp(addr, ep, size) +void IsochronousEp::init(int addr, uint8_t ep, uint16_t size) { - ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size); + //ISO_DBG("%p FA:%d EP:%02X MPS:%d\n", this, addr, ep, size); + BaseEp::init(addr, ep, size); TEST_ASSERT(m_pED); - m_pED->Control |= (1 << 15); // F Format ITD + m_pED->setFormat(); // F Format ITD TEST_ASSERT(size >= 128 && size <= 1023); m_PacketSize = size; @@ -116,8 +117,7 @@ m_itd_queue_count = 0; reset(); HCITD* itd = new_HCITD(this); - m_pED->TailTd = reinterpret_cast<HCTD*>(itd); - m_pED->HeadTd = reinterpret_cast<HCTD*>(itd); + m_pED->init_queue<HCITD>(itd); TEST_ASSERT(itd); if (itd == NULL) { return; @@ -149,20 +149,15 @@ { TEST_ASSERT(m_itd_queue_count >= 0); while(m_itd_queue_count < 3 && m_itd_queue_count < HCTD_QUEUE_SIZE) { - HCITD* itd = reinterpret_cast<HCITD*>(m_pED->TailTd); - TEST_ASSERT(itd); - if (itd == NULL) { - return NULL; + TEST_ASSERT(m_pED); + if (m_pED->Skip()) { + break; } HCITD* blank_itd = new_HCITD(this); TEST_ASSERT(blank_itd); - if (blank_itd == NULL) { - return NULL; + if (m_pED->enqueue<HCITD>(blank_itd)) { + m_itd_queue_count++; } - itd->Next = blank_itd; - m_pED->TailTd = reinterpret_cast<HCTD*>(blank_itd); - m_itd_queue_count++; - //DBG_IED(m_pED); enable(); // Enable Periodic } @@ -202,47 +197,53 @@ void IsochronousEp::disconnect() { m_pED->setSkip(); - ISO_DBG("m_itd_queue_count: %d", m_itd_queue_count); + Thread::wait(50); + ISO_DBG("rtos-queue: %d", m_itd_queue_count); + int queue_count = m_itd_queue_count; Timer t; t.reset(); t.start(); - while(m_itd_queue_count > 0 && t.read_ms() <= (8*3)) { - HCITD* itd = get_queue_HCITD(0); + while(queue_count > 0 && t.read_ms() < 50) { + HCITD* itd = get_queue_HCITD(10); if (itd) { - ISO_DBG("ITD: %p", itd); + ISO_DBG("delete ITD:%p from rtos-queue %d ms", itd, t.read_ms()); delete itd; - m_itd_queue_count--; + queue_count--; t.reset(); } } - ISO_DBG("m_itd_queue_count: %d, t_ms: %d", m_itd_queue_count, t.read_ms()); - HCITD* head = reinterpret_cast<HCITD*>(reinterpret_cast<uint32_t>(m_pED->HeadTd)&~3); // delete Halted and Toggle Carry bit - TEST_ASSERT(head); + ISO_DBG("rtos-queue: %d, %d ms", queue_count, t.read_ms()); + 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); - while(head != tail) { - HCITD* next = head->Next; - TEST_ASSERT(next); - ISO_DBG("ED ITD:%p next:%p", head, next); - delete head; - TEST_ASSERT(m_itd_queue_count > 0); - m_itd_queue_count--; - head = next; - } - TEST_ASSERT(m_itd_queue_count == 0); - delete head; + 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; } -BaseEp::BaseEp(int addr, uint8_t ep, uint16_t size, int lowSpeed):m_td_queue_count(0) +void BaseEp::init(int addr, uint8_t ep, uint16_t size, int lowSpeed) { ISO_DBG("%p FA=%d EN=%02x MPS=%d S=%d\n", this, addr, ep, size, lowSpeed); TEST_ASSERT(size >= 8 && size <= 1023); TEST_ASSERT(lowSpeed == 0 || lowSpeed == 1); m_pED = new _HCED(addr, ep, size, lowSpeed); TEST_ASSERT(m_pED); + m_td_queue_count = 0; }