Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of uvchost by
usb_itd.cpp
00001 #include "mbed.h" 00002 #include "usb_itd.h" 00003 //#define __DEBUG 00004 #include "mydbg.h" 00005 00006 usb_itd::usb_itd(HCITD* itd) 00007 { 00008 DBG_ASSERT(itd); 00009 m_itd = itd; 00010 } 00011 00012 bool usb_itd::Done() 00013 { 00014 int cc = (m_itd->Control >> 28); 00015 if (cc == 0xe || cc == 0xf) { // not accessed? 00016 return false; 00017 } 00018 if (m_itd->Next) { 00019 return false; 00020 } 00021 return true; 00022 } 00023 00024 int usb_itd::ConditionCode() 00025 { 00026 int cc = (m_itd->Control >> 28); 00027 return cc; 00028 } 00029 00030 uint16_t usb_itd::get_psw(int n) 00031 { 00032 DBG_ASSERT(n >= 0 && n <= 7); 00033 DBG_ASSERT(m_itd); 00034 uint16_t psw = 0; 00035 switch(n) { 00036 case 0: psw = m_itd->OffsetPSW10; break; 00037 case 1: psw = m_itd->OffsetPSW10 >> 16; break; 00038 case 2: psw = m_itd->OffsetPSW32; break; 00039 case 3: psw = m_itd->OffsetPSW32 >> 16; break; 00040 case 4: psw = m_itd->OffsetPSW54; break; 00041 case 5: psw = m_itd->OffsetPSW54 >> 16; break; 00042 case 6: psw = m_itd->OffsetPSW76; break; 00043 case 7: psw = m_itd->OffsetPSW76 >> 16; break; 00044 } 00045 return psw; 00046 } 00047 00048 uint16_t usb_itd::StartingFrame() 00049 { 00050 return (m_itd->Control & ITD_SF); 00051 } 00052 00053 int usb_itd::FrameCount() 00054 { 00055 DBG_ASSERT(m_itd); 00056 int fc = ((m_itd->Control & ITD_FC) >> 24) + 1; 00057 DBG_ASSERT(fc >= 1 && fc <= 8); 00058 return fc; 00059 } 00060 00061 int usb_itd::PacketStatus(int n) 00062 { 00063 DBG_ASSERT(n >=0 && n <= 7); 00064 uint16_t psw = get_psw(n); 00065 int cc = (psw >> 12) & 0xf; 00066 return cc; 00067 } 00068 00069 int usb_itd::Length(int n) 00070 { 00071 DBG_ASSERT(n >=0 && n <= 7); 00072 uint16_t psw = get_psw(n); 00073 int size = psw & 0x7ff; 00074 int cc = (psw >> 12) & 0xf; 00075 if (cc == 0xe || cc == 0xf) { 00076 return -1; 00077 } 00078 if (cc == 0 || cc == 9) { 00079 return size; 00080 } 00081 debug(); 00082 return -1; 00083 } 00084 00085 uint8_t* usb_itd::BufferPage(int n, int size) 00086 { 00087 DBG_ASSERT(n >=0 && n <= 7); 00088 DBG_ASSERT(size >= 128); 00089 DBG_ASSERT(size <= 1020); 00090 uint8_t* buf = (uint8_t*)m_itd->BufferPage0 + n * size; 00091 DBG_ASSERT((uint32_t)(buf+size-1) <= m_itd->BufferEnd); 00092 return buf; 00093 } 00094 00095 void usb_itd::free() 00096 { 00097 DBG_ASSERT(m_itd); 00098 if (m_itd) { 00099 uint8_t* buf = (uint8_t*)m_itd->BufferPage0; 00100 DBG_ASSERT(buf); 00101 usb_free_bp(buf); 00102 usb_free_itd((byte*)m_itd); 00103 m_itd = NULL; 00104 } 00105 } 00106 00107 void usb_itd::debug() 00108 { 00109 DBG("itd =%08X\n", m_itd); 00110 DBG("itd->Control =%08X\n", m_itd->Control); 00111 DBG("itd->BufferPage0=%08X\n", m_itd->BufferPage0); 00112 DBG("itd->Next =%08X\n", m_itd->Next); 00113 DBG("itd->BufferEnd =%08X\n", m_itd->BufferEnd); 00114 DBG("itd->OffsetPSW10=%08X\n", m_itd->OffsetPSW10); 00115 DBG("itd->OffsetPSW32=%08X\n", m_itd->OffsetPSW32); 00116 DBG("itd->OffsetPSW54=%08X\n", m_itd->OffsetPSW54); 00117 DBG("itd->OffsetPSW76=%08X\n", m_itd->OffsetPSW76); 00118 }
Generated on Wed Jul 13 2022 01:34:55 by
1.7.2
