see: http://mbed.org/users/okini3939/notebook/wifi_webcam/

Dependencies:   GSwifiInterface_ap_webcam USBHost mbed

Committer:
okini3939
Date:
Fri Jun 06 00:44:06 2014 +0000
Revision:
0:8558bdecb0fa
1st build

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:8558bdecb0fa 1 // USBIsochronous.h
okini3939 0:8558bdecb0fa 2 #pragma once
okini3939 0:8558bdecb0fa 3
okini3939 0:8558bdecb0fa 4 class IsochronousEp;
okini3939 0:8558bdecb0fa 5 struct HCITD { // HostController Isochronous Transfer Descriptor
okini3939 0:8558bdecb0fa 6 __IO uint32_t Control; // +0 Transfer descriptor control
okini3939 0:8558bdecb0fa 7 uint8_t* BufferPage0; // +4 Buffer Page 0
okini3939 0:8558bdecb0fa 8 HCITD* Next; // +8 Physical pointer to next Isochronous Transfer Descriptor
okini3939 0:8558bdecb0fa 9 uint8_t* BufferEnd; // +12 buffer End
okini3939 0:8558bdecb0fa 10 __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW
okini3939 0:8558bdecb0fa 11 IsochronousEp* ep; // +32 endpoint object
okini3939 0:8558bdecb0fa 12 __IO uint8_t buf[0]; // +36 buffer
okini3939 0:8558bdecb0fa 13 // +36
okini3939 0:8558bdecb0fa 14 HCITD(IsochronousEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize);
okini3939 0:8558bdecb0fa 15 inline void* operator new(size_t size, int buf_size) {
okini3939 0:8558bdecb0fa 16 void* p;
okini3939 0:8558bdecb0fa 17 if (posix_memalign(&p, 32, size+buf_size) == 0) {
okini3939 0:8558bdecb0fa 18 return p;
okini3939 0:8558bdecb0fa 19 }
okini3939 0:8558bdecb0fa 20 return NULL;
okini3939 0:8558bdecb0fa 21 }
okini3939 0:8558bdecb0fa 22
okini3939 0:8558bdecb0fa 23 inline void operator delete(void* p) {
okini3939 0:8558bdecb0fa 24 free(p);
okini3939 0:8558bdecb0fa 25 }
okini3939 0:8558bdecb0fa 26
okini3939 0:8558bdecb0fa 27 inline uint16_t StartingFrame() {
okini3939 0:8558bdecb0fa 28 return Control & 0xffff;
okini3939 0:8558bdecb0fa 29 }
okini3939 0:8558bdecb0fa 30
okini3939 0:8558bdecb0fa 31 inline uint8_t FrameCount() {
okini3939 0:8558bdecb0fa 32 return ((Control>>24)&7)+1;
okini3939 0:8558bdecb0fa 33 }
okini3939 0:8558bdecb0fa 34
okini3939 0:8558bdecb0fa 35 inline uint8_t ConditionCode() {
okini3939 0:8558bdecb0fa 36 return Control>>28;
okini3939 0:8558bdecb0fa 37 }
okini3939 0:8558bdecb0fa 38 };
okini3939 0:8558bdecb0fa 39
okini3939 0:8558bdecb0fa 40 struct _HCED { // HostController EndPoint Descriptor
okini3939 0:8558bdecb0fa 41 __IO uint32_t Control; // +0 Endpoint descriptor control
okini3939 0:8558bdecb0fa 42 HCTD* TailTd; // +4 Physical address of tail in Transfer descriptor list
okini3939 0:8558bdecb0fa 43 __IO HCTD* HeadTd; // +8 Physcial address of head in Transfer descriptor list
okini3939 0:8558bdecb0fa 44 _HCED* Next; // +12 Physical address of next Endpoint descriptor
okini3939 0:8558bdecb0fa 45 // +16
okini3939 0:8558bdecb0fa 46 _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed = 0) {
okini3939 0:8558bdecb0fa 47 Control = addr | /* USB address */
okini3939 0:8558bdecb0fa 48 ((ep & 0x7F) << 7) | /* Endpoint address */
okini3939 0:8558bdecb0fa 49 (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */
okini3939 0:8558bdecb0fa 50 ((lowSpeed?1:0) << 13) | /* speed full=0 low=1 */
okini3939 0:8558bdecb0fa 51 (size << 16); /* MaxPkt Size */
okini3939 0:8558bdecb0fa 52 Next = NULL;
okini3939 0:8558bdecb0fa 53 }
okini3939 0:8558bdecb0fa 54
okini3939 0:8558bdecb0fa 55 inline void* operator new(size_t size) {
okini3939 0:8558bdecb0fa 56 void* p;
okini3939 0:8558bdecb0fa 57 if (posix_memalign(&p, 16, size) == 0) {
okini3939 0:8558bdecb0fa 58 return p;
okini3939 0:8558bdecb0fa 59 }
okini3939 0:8558bdecb0fa 60 return NULL;
okini3939 0:8558bdecb0fa 61 }
okini3939 0:8558bdecb0fa 62
okini3939 0:8558bdecb0fa 63 inline void operator delete(void* p) {
okini3939 0:8558bdecb0fa 64 free(p);
okini3939 0:8558bdecb0fa 65 }
okini3939 0:8558bdecb0fa 66
okini3939 0:8558bdecb0fa 67 inline uint8_t FunctionAddress() {
okini3939 0:8558bdecb0fa 68 return Control & 0x7f;
okini3939 0:8558bdecb0fa 69 }
okini3939 0:8558bdecb0fa 70
okini3939 0:8558bdecb0fa 71 inline int Speed() {
okini3939 0:8558bdecb0fa 72 return (Control>>13)&1;
okini3939 0:8558bdecb0fa 73 }
okini3939 0:8558bdecb0fa 74
okini3939 0:8558bdecb0fa 75 inline void setFunctionAddress(int addr) {
okini3939 0:8558bdecb0fa 76 Control &= ~0x7f;
okini3939 0:8558bdecb0fa 77 Control |= addr;
okini3939 0:8558bdecb0fa 78 }
okini3939 0:8558bdecb0fa 79
okini3939 0:8558bdecb0fa 80 inline void setMaxPacketSize(uint16_t size) {
okini3939 0:8558bdecb0fa 81 Control &= ~0xffff0000;
okini3939 0:8558bdecb0fa 82 Control |= size<<16;
okini3939 0:8558bdecb0fa 83 }
okini3939 0:8558bdecb0fa 84
okini3939 0:8558bdecb0fa 85 int Skip() {
okini3939 0:8558bdecb0fa 86 return (Control>>14) & 1;
okini3939 0:8558bdecb0fa 87 }
okini3939 0:8558bdecb0fa 88
okini3939 0:8558bdecb0fa 89 void setSkip() {
okini3939 0:8558bdecb0fa 90 Control |= (1<<14);
okini3939 0:8558bdecb0fa 91 }
okini3939 0:8558bdecb0fa 92
okini3939 0:8558bdecb0fa 93 void setFormat() {
okini3939 0:8558bdecb0fa 94 Control |= (1<<15);
okini3939 0:8558bdecb0fa 95 }
okini3939 0:8558bdecb0fa 96
okini3939 0:8558bdecb0fa 97 template<typename T>
okini3939 0:8558bdecb0fa 98 inline bool enqueue(T* td) {
okini3939 0:8558bdecb0fa 99 if (td) {
okini3939 0:8558bdecb0fa 100 T* tail = reinterpret_cast<T*>(TailTd);
okini3939 0:8558bdecb0fa 101 if (tail) {
okini3939 0:8558bdecb0fa 102 tail->Next = td;
okini3939 0:8558bdecb0fa 103 TailTd = reinterpret_cast<HCTD*>(td);
okini3939 0:8558bdecb0fa 104 return true;
okini3939 0:8558bdecb0fa 105 }
okini3939 0:8558bdecb0fa 106 }
okini3939 0:8558bdecb0fa 107 return false;
okini3939 0:8558bdecb0fa 108 }
okini3939 0:8558bdecb0fa 109
okini3939 0:8558bdecb0fa 110 template<typename T>
okini3939 0:8558bdecb0fa 111 inline T* dequeue() {
okini3939 0:8558bdecb0fa 112 T* head = reinterpret_cast<T*>(reinterpret_cast<uint32_t>(HeadTd)&~3); // delete Halted and Toggle Carry bit
okini3939 0:8558bdecb0fa 113 T* tail = reinterpret_cast<T*>(TailTd);
okini3939 0:8558bdecb0fa 114 if (head == NULL || tail == NULL || head == tail) {
okini3939 0:8558bdecb0fa 115 return NULL;
okini3939 0:8558bdecb0fa 116 }
okini3939 0:8558bdecb0fa 117 HeadTd = reinterpret_cast<HCTD*>(head->Next);
okini3939 0:8558bdecb0fa 118 return head;
okini3939 0:8558bdecb0fa 119 }
okini3939 0:8558bdecb0fa 120 template<typename T>
okini3939 0:8558bdecb0fa 121 void init_queue(T* td) {
okini3939 0:8558bdecb0fa 122 TailTd = reinterpret_cast<HCTD*>(td);
okini3939 0:8558bdecb0fa 123 HeadTd = reinterpret_cast<HCTD*>(td);
okini3939 0:8558bdecb0fa 124 }
okini3939 0:8558bdecb0fa 125 };
okini3939 0:8558bdecb0fa 126
okini3939 0:8558bdecb0fa 127 struct _HCCA { // Host Controller Communication Area
okini3939 0:8558bdecb0fa 128 _HCED* InterruptTable[32]; // +0 Interrupt Table
okini3939 0:8558bdecb0fa 129 __IO uint16_t FrameNumber;// +128 Frame Number
okini3939 0:8558bdecb0fa 130 __IO uint16_t Pad1; // +130
okini3939 0:8558bdecb0fa 131 __IO HCTD* DoneHead; // +132 Done Head
okini3939 0:8558bdecb0fa 132 uint8_t Reserved[116]; // +136 Reserved for future use
okini3939 0:8558bdecb0fa 133 uint8_t Unknown[4]; // +252 Unused
okini3939 0:8558bdecb0fa 134 // +256
okini3939 0:8558bdecb0fa 135 inline void* operator new(size_t size) {
okini3939 0:8558bdecb0fa 136 void* p;
okini3939 0:8558bdecb0fa 137 if (posix_memalign(&p, 256, size) == 0) {
okini3939 0:8558bdecb0fa 138 return p;
okini3939 0:8558bdecb0fa 139 }
okini3939 0:8558bdecb0fa 140 return NULL;
okini3939 0:8558bdecb0fa 141 }
okini3939 0:8558bdecb0fa 142
okini3939 0:8558bdecb0fa 143 inline void operator delete(void* p) {
okini3939 0:8558bdecb0fa 144 free(p);
okini3939 0:8558bdecb0fa 145 }
okini3939 0:8558bdecb0fa 146
okini3939 0:8558bdecb0fa 147 inline void enqueue(_HCED* ed) {
okini3939 0:8558bdecb0fa 148 for(int i = 0; i < 32; i++) {
okini3939 0:8558bdecb0fa 149 if (InterruptTable[i] == NULL) {
okini3939 0:8558bdecb0fa 150 InterruptTable[i] = ed;
okini3939 0:8558bdecb0fa 151 } else {
okini3939 0:8558bdecb0fa 152 _HCED* nextEd = InterruptTable[i];
okini3939 0:8558bdecb0fa 153 while(nextEd->Next && nextEd->Next != ed) {
okini3939 0:8558bdecb0fa 154 nextEd = nextEd->Next;
okini3939 0:8558bdecb0fa 155 }
okini3939 0:8558bdecb0fa 156 nextEd->Next = ed;
okini3939 0:8558bdecb0fa 157 }
okini3939 0:8558bdecb0fa 158 }
okini3939 0:8558bdecb0fa 159 }
okini3939 0:8558bdecb0fa 160
okini3939 0:8558bdecb0fa 161 inline void dequeue(_HCED* ed) {
okini3939 0:8558bdecb0fa 162 for(int i = 0; i < 32; i++) {
okini3939 0:8558bdecb0fa 163 if (InterruptTable[i] == ed) {
okini3939 0:8558bdecb0fa 164 InterruptTable[i] = ed->Next;
okini3939 0:8558bdecb0fa 165 } else if (InterruptTable[i]) {
okini3939 0:8558bdecb0fa 166 _HCED* nextEd = InterruptTable[i];
okini3939 0:8558bdecb0fa 167 while(nextEd) {
okini3939 0:8558bdecb0fa 168 if (nextEd->Next == ed) {
okini3939 0:8558bdecb0fa 169 nextEd->Next = ed->Next;
okini3939 0:8558bdecb0fa 170 break;
okini3939 0:8558bdecb0fa 171 }
okini3939 0:8558bdecb0fa 172 nextEd = nextEd->Next;
okini3939 0:8558bdecb0fa 173 }
okini3939 0:8558bdecb0fa 174 }
okini3939 0:8558bdecb0fa 175 }
okini3939 0:8558bdecb0fa 176 }
okini3939 0:8558bdecb0fa 177 };
okini3939 0:8558bdecb0fa 178
okini3939 0:8558bdecb0fa 179 #define HCITD_QUEUE_SIZE 3
okini3939 0:8558bdecb0fa 180
okini3939 0:8558bdecb0fa 181 class IsochronousEp {
okini3939 0:8558bdecb0fa 182 public:
okini3939 0:8558bdecb0fa 183 void init(int addr, uint8_t ep, uint16_t size, uint8_t frameCount = 4, uint8_t queueLimit = HCITD_QUEUE_SIZE);
okini3939 0:8558bdecb0fa 184 void reset(int delay_ms = 100);
okini3939 0:8558bdecb0fa 185 HCITD* isochronousReceive(int timeout_ms);
okini3939 0:8558bdecb0fa 186 int isochronousSend(uint8_t* buf, int len, int timeout_ms);
okini3939 0:8558bdecb0fa 187 HCITD* get_queue_HCITD(int timeout_ms);
okini3939 0:8558bdecb0fa 188 uint16_t m_PacketSize;
okini3939 0:8558bdecb0fa 189 void disconnect();
okini3939 0:8558bdecb0fa 190 void irqWdhHandler(HCITD* itd) {m_queue.put(itd);} // WDH
okini3939 0:8558bdecb0fa 191 private:
okini3939 0:8558bdecb0fa 192 HCITD* new_HCITD(IsochronousEp* obj);
okini3939 0:8558bdecb0fa 193 Queue<HCITD, HCITD_QUEUE_SIZE> m_queue; // ITD done queue
okini3939 0:8558bdecb0fa 194 int m_itd_queue_count;
okini3939 0:8558bdecb0fa 195 int m_itd_queue_limit;
okini3939 0:8558bdecb0fa 196 uint16_t m_FrameNumber;
okini3939 0:8558bdecb0fa 197 int m_FrameCount; // 1-8
okini3939 0:8558bdecb0fa 198 void enable();
okini3939 0:8558bdecb0fa 199 _HCED* m_pED;
okini3939 0:8558bdecb0fa 200 };