UVC host library
Dependents: LifeCam WebcamServer
uvc/usb_itd.cpp@3:3eb41d749f9a, 2012-08-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |