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_td.h"
va009039 0:b0f04c137829 3 #define __DEBUG
va009039 0:b0f04c137829 4 #include "mydbg.h"
va009039 0:b0f04c137829 5
va009039 0:b0f04c137829 6 #define __TEST
va009039 0:b0f04c137829 7
va009039 0:b0f04c137829 8 #ifdef __TEST
va009039 0:b0f04c137829 9 #include <queue>
va009039 0:b0f04c137829 10 #endif
va009039 0:b0f04c137829 11
va009039 0:b0f04c137829 12 template class tdqueue<HCTD*>;
va009039 0:b0f04c137829 13 template class tdqueue<HCITD*>;
va009039 0:b0f04c137829 14
va009039 0:b0f04c137829 15 HCTD* td_reverse(HCTD* td)
va009039 0:b0f04c137829 16 {
va009039 0:b0f04c137829 17 HCTD* result = NULL;
va009039 0:b0f04c137829 18 HCTD* next;
va009039 0:b0f04c137829 19 while(td) {
va009039 0:b0f04c137829 20 next = (HCTD*)td->Next;
va009039 0:b0f04c137829 21 td->Next = (uint32_t)result;
va009039 0:b0f04c137829 22 result = td;
va009039 0:b0f04c137829 23 td = next;
va009039 0:b0f04c137829 24 }
va009039 0:b0f04c137829 25 return result;
va009039 0:b0f04c137829 26 }
va009039 0:b0f04c137829 27
va009039 0:b0f04c137829 28 template <class T>
va009039 0:b0f04c137829 29 tdqueue<T>::tdqueue():m_head(NULL),m_tail(NULL)
va009039 0:b0f04c137829 30 {
va009039 0:b0f04c137829 31
va009039 0:b0f04c137829 32 }
va009039 0:b0f04c137829 33
va009039 0:b0f04c137829 34 template <class T>
va009039 0:b0f04c137829 35 int tdqueue<T>::size()
va009039 0:b0f04c137829 36 {
va009039 0:b0f04c137829 37 int n = 0;
va009039 0:b0f04c137829 38 T td = m_head;
va009039 0:b0f04c137829 39 while(td) {
va009039 0:b0f04c137829 40 td = (T)td->Next;
va009039 0:b0f04c137829 41 n++;
va009039 0:b0f04c137829 42 }
va009039 0:b0f04c137829 43 return n;
va009039 0:b0f04c137829 44 }
va009039 0:b0f04c137829 45
va009039 0:b0f04c137829 46 template <class T>
va009039 0:b0f04c137829 47 bool tdqueue<T>::empty()
va009039 0:b0f04c137829 48 {
va009039 0:b0f04c137829 49 return (m_head == NULL);
va009039 0:b0f04c137829 50 }
va009039 0:b0f04c137829 51
va009039 0:b0f04c137829 52 template <class T>
va009039 0:b0f04c137829 53 T tdqueue<T>::front()
va009039 0:b0f04c137829 54 {
va009039 0:b0f04c137829 55 return m_head;
va009039 0:b0f04c137829 56 }
va009039 0:b0f04c137829 57
va009039 0:b0f04c137829 58 template <class T>
va009039 0:b0f04c137829 59 void tdqueue<T>::pop()
va009039 0:b0f04c137829 60 {
va009039 0:b0f04c137829 61 T td = m_head;
va009039 0:b0f04c137829 62 if (td) {
va009039 0:b0f04c137829 63 m_head = (T)td->Next;
va009039 0:b0f04c137829 64 }
va009039 0:b0f04c137829 65 if (td == m_tail) {
va009039 0:b0f04c137829 66 m_tail = NULL;
va009039 0:b0f04c137829 67 }
va009039 0:b0f04c137829 68 }
va009039 0:b0f04c137829 69
va009039 0:b0f04c137829 70 template <class T>
va009039 0:b0f04c137829 71 void tdqueue<T>::push(T td)
va009039 0:b0f04c137829 72 {
va009039 0:b0f04c137829 73 td->Next = NULL;
va009039 0:b0f04c137829 74 if (m_tail) {
va009039 0:b0f04c137829 75 m_tail->Next = (uint32_t)td;
va009039 0:b0f04c137829 76 }
va009039 0:b0f04c137829 77 m_tail = td;
va009039 0:b0f04c137829 78 if (m_head == NULL) {
va009039 0:b0f04c137829 79 m_head = td;
va009039 0:b0f04c137829 80 }
va009039 0:b0f04c137829 81 }
va009039 0:b0f04c137829 82
va009039 0:b0f04c137829 83 #ifdef __TEST
va009039 0:b0f04c137829 84 static void test_td_list()
va009039 0:b0f04c137829 85 {
va009039 0:b0f04c137829 86 tdqueue<HCTD*> list;
va009039 0:b0f04c137829 87 HCTD* td1;
va009039 0:b0f04c137829 88 HCTD* td2;
va009039 0:b0f04c137829 89 HCTD* td3;
va009039 0:b0f04c137829 90 HCTD* td4;
va009039 0:b0f04c137829 91 // 0
va009039 0:b0f04c137829 92 DBG_ASSERT(list.size() == 0);
va009039 0:b0f04c137829 93 td1 = list.front();
va009039 0:b0f04c137829 94 DBG_ASSERT(td1 == NULL);
va009039 0:b0f04c137829 95 list.pop();
va009039 0:b0f04c137829 96 td1 = list.front();
va009039 0:b0f04c137829 97 DBG_ASSERT(td1 == NULL);
va009039 0:b0f04c137829 98 // 1
va009039 0:b0f04c137829 99 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 100 list.push(td1);
va009039 0:b0f04c137829 101 DBG_ASSERT(list.size() == 1);
va009039 0:b0f04c137829 102 td2 = list.front();
va009039 0:b0f04c137829 103 DBG_ASSERT(td2 == td1);
va009039 0:b0f04c137829 104 list.pop();
va009039 0:b0f04c137829 105 td2 = list.front();
va009039 0:b0f04c137829 106 DBG_ASSERT(td2 == NULL);
va009039 0:b0f04c137829 107 DBG_ASSERT(list.size() == 0);
va009039 0:b0f04c137829 108 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 109 // 2
va009039 0:b0f04c137829 110 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 111 td2 = (HCTD*)usb_get_td(2);
va009039 0:b0f04c137829 112 list.push(td1);
va009039 0:b0f04c137829 113 list.push(td2);
va009039 0:b0f04c137829 114 DBG_ASSERT(list.size() == 2);
va009039 0:b0f04c137829 115 td3 = list.front();
va009039 0:b0f04c137829 116 DBG_ASSERT(td3 == td1);
va009039 0:b0f04c137829 117 list.pop();
va009039 0:b0f04c137829 118 td3 = list.front();
va009039 0:b0f04c137829 119 DBG_ASSERT(td3 == td2);
va009039 0:b0f04c137829 120 list.pop();
va009039 0:b0f04c137829 121 td3 = list.front();
va009039 0:b0f04c137829 122 DBG_ASSERT(td3 == NULL);
va009039 0:b0f04c137829 123 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 124 usb_free_td((byte*)td2);
va009039 0:b0f04c137829 125 // 3
va009039 0:b0f04c137829 126 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 127 td2 = (HCTD*)usb_get_td(2);
va009039 0:b0f04c137829 128 td3 = (HCTD*)usb_get_td(3);
va009039 0:b0f04c137829 129 list.push(td1);
va009039 0:b0f04c137829 130 list.push(td2);
va009039 0:b0f04c137829 131 list.push(td3);
va009039 0:b0f04c137829 132 DBG_ASSERT(list.size() == 3);
va009039 0:b0f04c137829 133 td4 = list.front();
va009039 0:b0f04c137829 134 DBG_ASSERT(td4 == td1);
va009039 0:b0f04c137829 135 list.pop();
va009039 0:b0f04c137829 136 td4 = list.front();
va009039 0:b0f04c137829 137 DBG_ASSERT(td4 == td2);
va009039 0:b0f04c137829 138 list.pop();
va009039 0:b0f04c137829 139 td4 = list.front();
va009039 0:b0f04c137829 140 DBG_ASSERT(td4 == td3);
va009039 0:b0f04c137829 141 list.pop();
va009039 0:b0f04c137829 142 td4 = list.front();
va009039 0:b0f04c137829 143 DBG_ASSERT(td4 == NULL);
va009039 0:b0f04c137829 144 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 145 usb_free_td((byte*)td2);
va009039 0:b0f04c137829 146 usb_free_td((byte*)td3);
va009039 0:b0f04c137829 147 // n
va009039 0:b0f04c137829 148 queue<HCTD*> queue;
va009039 0:b0f04c137829 149 for(int n = 1; n <= 10; n++) {
va009039 0:b0f04c137829 150 DBG_ASSERT(list.size() == queue.size());
va009039 0:b0f04c137829 151 DBG_ASSERT(list.empty() == queue.empty());
va009039 0:b0f04c137829 152 if (list.empty() || (rand()%10) > 5) {
va009039 0:b0f04c137829 153 td1 = (HCTD*)usb_get_td(n);
va009039 0:b0f04c137829 154 if (td1) {
va009039 0:b0f04c137829 155 list.push(td1);
va009039 0:b0f04c137829 156 queue.push(td1);
va009039 0:b0f04c137829 157 }
va009039 0:b0f04c137829 158 //DBG("+ %d %p\n", n, td1);
va009039 0:b0f04c137829 159 } else {
va009039 0:b0f04c137829 160 td1 = list.front();
va009039 0:b0f04c137829 161 td2 = queue.front();
va009039 0:b0f04c137829 162 if (td1 != td2) {
va009039 0:b0f04c137829 163 //DBG("td1=%p td2=%p\n", td1, td2);
va009039 0:b0f04c137829 164 }
va009039 0:b0f04c137829 165 DBG_ASSERT(td1 == td2);
va009039 0:b0f04c137829 166 if (td1) {
va009039 0:b0f04c137829 167 list.pop();
va009039 0:b0f04c137829 168 queue.pop();
va009039 0:b0f04c137829 169 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 170 }
va009039 0:b0f04c137829 171 //DBG("- %d %p\n", n, td1);
va009039 0:b0f04c137829 172 }
va009039 0:b0f04c137829 173 }
va009039 0:b0f04c137829 174 while(!list.empty()) {
va009039 0:b0f04c137829 175 td1 = list.front();
va009039 0:b0f04c137829 176 list.pop();
va009039 0:b0f04c137829 177 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 178 }
va009039 0:b0f04c137829 179 //DBG_ASSERT(0);
va009039 0:b0f04c137829 180 }
va009039 0:b0f04c137829 181
va009039 0:b0f04c137829 182 static void test_td_reverse()
va009039 0:b0f04c137829 183 {
va009039 0:b0f04c137829 184
va009039 0:b0f04c137829 185 HCTD* td1;
va009039 0:b0f04c137829 186 HCTD* td2;
va009039 0:b0f04c137829 187 HCTD* td3;
va009039 0:b0f04c137829 188 HCTD* td4;
va009039 0:b0f04c137829 189 // 0
va009039 0:b0f04c137829 190 td1 = NULL;
va009039 0:b0f04c137829 191 td2 = td_reverse(td1);
va009039 0:b0f04c137829 192 DBG_ASSERT(td2 == NULL);
va009039 0:b0f04c137829 193 // 1
va009039 0:b0f04c137829 194 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 195 DBG_ASSERT(td1);
va009039 0:b0f04c137829 196 DBG_ASSERT(td1->Next == NULL);
va009039 0:b0f04c137829 197 td2 = td_reverse(td1);
va009039 0:b0f04c137829 198 DBG_ASSERT(td2 == td1);
va009039 0:b0f04c137829 199 DBG_ASSERT(td2->Next == NULL);
va009039 0:b0f04c137829 200 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 201 // 2
va009039 0:b0f04c137829 202 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 203 DBG_ASSERT(td1);
va009039 0:b0f04c137829 204 td2 = (HCTD*)usb_get_td(2);
va009039 0:b0f04c137829 205 DBG_ASSERT(td2);
va009039 0:b0f04c137829 206 td1->Next = (uint32_t)td2;
va009039 0:b0f04c137829 207 td3 = td_reverse(td1);
va009039 0:b0f04c137829 208 DBG_ASSERT(td3 == td2);
va009039 0:b0f04c137829 209 DBG_ASSERT(td3->Next == (uint32_t)td1);
va009039 0:b0f04c137829 210 DBG_ASSERT(td1->Next == NULL);
va009039 0:b0f04c137829 211 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 212 usb_free_td((byte*)td2);
va009039 0:b0f04c137829 213 // 3
va009039 0:b0f04c137829 214 td1 = (HCTD*)usb_get_td(1);
va009039 0:b0f04c137829 215 td2 = (HCTD*)usb_get_td(2);
va009039 0:b0f04c137829 216 td3 = (HCTD*)usb_get_td(3);
va009039 0:b0f04c137829 217 td1->Next = (uint32_t)td2;
va009039 0:b0f04c137829 218 td2->Next = (uint32_t)td3;
va009039 0:b0f04c137829 219 td4 = td_reverse(td1);
va009039 0:b0f04c137829 220 DBG_ASSERT(td4 == td3);
va009039 0:b0f04c137829 221 DBG_ASSERT(td3->Next == (uint32_t)td2);
va009039 0:b0f04c137829 222 DBG_ASSERT(td2->Next == (uint32_t)td1);
va009039 0:b0f04c137829 223 DBG_ASSERT(td1->Next == NULL);
va009039 0:b0f04c137829 224 usb_free_td((byte*)td1);
va009039 0:b0f04c137829 225 usb_free_td((byte*)td2);
va009039 0:b0f04c137829 226 usb_free_td((byte*)td3);
va009039 0:b0f04c137829 227 }
va009039 0:b0f04c137829 228
va009039 0:b0f04c137829 229 void test_td()
va009039 0:b0f04c137829 230 {
va009039 0:b0f04c137829 231 test_td_reverse();
va009039 0:b0f04c137829 232 test_td_list();
va009039 0:b0f04c137829 233 DBG("Usb_td.cpp TD test done.\n");
va009039 0:b0f04c137829 234 }
va009039 0:b0f04c137829 235 #else //__TEST
va009039 0:b0f04c137829 236 void test_td()
va009039 0:b0f04c137829 237 {
va009039 0:b0f04c137829 238
va009039 0:b0f04c137829 239 }
va009039 0:b0f04c137829 240 #endif //__TEST