I added the Isochronous to USBHost library. The Isochronous code based on the following. http://developer.mbed.org/users/va009039/code/USBHostC270_example/

Dependencies:   FATFileSystem mbed-rtos

Fork of USBHost_AddIso by GR-PEACH_producer_meeting

Committer:
dkato
Date:
Mon Apr 18 10:01:46 2016 +0000
Revision:
33:bf48dc2a4240
Parent:
32:6824d71b37c1
Supports IAR.

Who changed what in which revision?

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