UVC host library

Dependents:   LifeCam WebcamServer

Committer:
va009039
Date:
Wed Aug 15 13:52:53 2012 +0000
Revision:
3:3eb41d749f9a
Parent:
0:b0f04c137829
add USB_USE_MALLOC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 0:b0f04c137829 1 #include "mbed.h"
va009039 0:b0f04c137829 2 #include "usb_itd.h"
va009039 0:b0f04c137829 3 //#define __DEBUG
va009039 0:b0f04c137829 4 #include "mydbg.h"
va009039 0:b0f04c137829 5
va009039 0:b0f04c137829 6 usb_itd::usb_itd(HCITD* itd)
va009039 0:b0f04c137829 7 {
va009039 0:b0f04c137829 8 DBG_ASSERT(itd);
va009039 0:b0f04c137829 9 m_itd = itd;
va009039 0:b0f04c137829 10 }
va009039 0:b0f04c137829 11
va009039 0:b0f04c137829 12 bool usb_itd::Done()
va009039 0:b0f04c137829 13 {
va009039 0:b0f04c137829 14 int cc = (m_itd->Control >> 28);
va009039 0:b0f04c137829 15 if (cc == 0xe || cc == 0xf) { // not accessed?
va009039 0:b0f04c137829 16 return false;
va009039 0:b0f04c137829 17 }
va009039 0:b0f04c137829 18 if (m_itd->Next) {
va009039 0:b0f04c137829 19 return false;
va009039 0:b0f04c137829 20 }
va009039 0:b0f04c137829 21 return true;
va009039 0:b0f04c137829 22 }
va009039 0:b0f04c137829 23
va009039 0:b0f04c137829 24 int usb_itd::ConditionCode()
va009039 0:b0f04c137829 25 {
va009039 0:b0f04c137829 26 int cc = (m_itd->Control >> 28);
va009039 0:b0f04c137829 27 return cc;
va009039 0:b0f04c137829 28 }
va009039 0:b0f04c137829 29
va009039 0:b0f04c137829 30 uint16_t usb_itd::get_psw(int n)
va009039 0:b0f04c137829 31 {
va009039 0:b0f04c137829 32 DBG_ASSERT(n >= 0 && n <= 7);
va009039 0:b0f04c137829 33 DBG_ASSERT(m_itd);
va009039 0:b0f04c137829 34 uint16_t psw = 0;
va009039 0:b0f04c137829 35 switch(n) {
va009039 0:b0f04c137829 36 case 0: psw = m_itd->OffsetPSW10; break;
va009039 0:b0f04c137829 37 case 1: psw = m_itd->OffsetPSW10 >> 16; break;
va009039 0:b0f04c137829 38 case 2: psw = m_itd->OffsetPSW32; break;
va009039 0:b0f04c137829 39 case 3: psw = m_itd->OffsetPSW32 >> 16; break;
va009039 0:b0f04c137829 40 case 4: psw = m_itd->OffsetPSW54; break;
va009039 0:b0f04c137829 41 case 5: psw = m_itd->OffsetPSW54 >> 16; break;
va009039 0:b0f04c137829 42 case 6: psw = m_itd->OffsetPSW76; break;
va009039 0:b0f04c137829 43 case 7: psw = m_itd->OffsetPSW76 >> 16; break;
va009039 0:b0f04c137829 44 }
va009039 0:b0f04c137829 45 return psw;
va009039 0:b0f04c137829 46 }
va009039 0:b0f04c137829 47
va009039 0:b0f04c137829 48 uint16_t usb_itd::StartingFrame()
va009039 0:b0f04c137829 49 {
va009039 0:b0f04c137829 50 return (m_itd->Control & ITD_SF);
va009039 0:b0f04c137829 51 }
va009039 0:b0f04c137829 52
va009039 0:b0f04c137829 53 int usb_itd::FrameCount()
va009039 0:b0f04c137829 54 {
va009039 0:b0f04c137829 55 DBG_ASSERT(m_itd);
va009039 0:b0f04c137829 56 int fc = ((m_itd->Control & ITD_FC) >> 24) + 1;
va009039 0:b0f04c137829 57 DBG_ASSERT(fc >= 1 && fc <= 8);
va009039 0:b0f04c137829 58 return fc;
va009039 0:b0f04c137829 59 }
va009039 0:b0f04c137829 60
va009039 0:b0f04c137829 61 int usb_itd::PacketStatus(int n)
va009039 0:b0f04c137829 62 {
va009039 0:b0f04c137829 63 DBG_ASSERT(n >=0 && n <= 7);
va009039 0:b0f04c137829 64 uint16_t psw = get_psw(n);
va009039 0:b0f04c137829 65 int cc = (psw >> 12) & 0xf;
va009039 0:b0f04c137829 66 return cc;
va009039 0:b0f04c137829 67 }
va009039 0:b0f04c137829 68
va009039 0:b0f04c137829 69 int usb_itd::Length(int n)
va009039 0:b0f04c137829 70 {
va009039 0:b0f04c137829 71 DBG_ASSERT(n >=0 && n <= 7);
va009039 0:b0f04c137829 72 uint16_t psw = get_psw(n);
va009039 0:b0f04c137829 73 int size = psw & 0x7ff;
va009039 0:b0f04c137829 74 int cc = (psw >> 12) & 0xf;
va009039 0:b0f04c137829 75 if (cc == 0xe || cc == 0xf) {
va009039 0:b0f04c137829 76 return -1;
va009039 0:b0f04c137829 77 }
va009039 0:b0f04c137829 78 if (cc == 0 || cc == 9) {
va009039 0:b0f04c137829 79 return size;
va009039 0:b0f04c137829 80 }
va009039 0:b0f04c137829 81 debug();
va009039 0:b0f04c137829 82 return -1;
va009039 0:b0f04c137829 83 }
va009039 0:b0f04c137829 84
va009039 0:b0f04c137829 85 uint8_t* usb_itd::BufferPage(int n, int size)
va009039 0:b0f04c137829 86 {
va009039 0:b0f04c137829 87 DBG_ASSERT(n >=0 && n <= 7);
va009039 0:b0f04c137829 88 DBG_ASSERT(size >= 128);
va009039 0:b0f04c137829 89 DBG_ASSERT(size <= 1020);
va009039 0:b0f04c137829 90 uint8_t* buf = (uint8_t*)m_itd->BufferPage0 + n * size;
va009039 0:b0f04c137829 91 DBG_ASSERT((uint32_t)(buf+size-1) <= m_itd->BufferEnd);
va009039 0:b0f04c137829 92 return buf;
va009039 0:b0f04c137829 93 }
va009039 0:b0f04c137829 94
va009039 0:b0f04c137829 95 void usb_itd::free()
va009039 0:b0f04c137829 96 {
va009039 0:b0f04c137829 97 DBG_ASSERT(m_itd);
va009039 0:b0f04c137829 98 if (m_itd) {
va009039 0:b0f04c137829 99 uint8_t* buf = (uint8_t*)m_itd->BufferPage0;
va009039 0:b0f04c137829 100 DBG_ASSERT(buf);
va009039 0:b0f04c137829 101 usb_free_bp(buf);
va009039 0:b0f04c137829 102 usb_free_itd((byte*)m_itd);
va009039 0:b0f04c137829 103 m_itd = NULL;
va009039 0:b0f04c137829 104 }
va009039 0:b0f04c137829 105 }
va009039 0:b0f04c137829 106
va009039 0:b0f04c137829 107 void usb_itd::debug()
va009039 0:b0f04c137829 108 {
va009039 0:b0f04c137829 109 DBG("itd =%08X\n", m_itd);
va009039 0:b0f04c137829 110 DBG("itd->Control =%08X\n", m_itd->Control);
va009039 0:b0f04c137829 111 DBG("itd->BufferPage0=%08X\n", m_itd->BufferPage0);
va009039 0:b0f04c137829 112 DBG("itd->Next =%08X\n", m_itd->Next);
va009039 0:b0f04c137829 113 DBG("itd->BufferEnd =%08X\n", m_itd->BufferEnd);
va009039 0:b0f04c137829 114 DBG("itd->OffsetPSW10=%08X\n", m_itd->OffsetPSW10);
va009039 0:b0f04c137829 115 DBG("itd->OffsetPSW32=%08X\n", m_itd->OffsetPSW32);
va009039 0:b0f04c137829 116 DBG("itd->OffsetPSW54=%08X\n", m_itd->OffsetPSW54);
va009039 0:b0f04c137829 117 DBG("itd->OffsetPSW76=%08X\n", m_itd->OffsetPSW76);
va009039 0:b0f04c137829 118 }