testing n-Bed with a Logitech C270 camera

Dependencies:   USBHost mbed

Fork of USBHostC270_example by Norimasa Okamoto

Committer:
va009039
Date:
Mon Mar 18 12:34:47 2013 +0000
Revision:
11:6a8eef89eb22
Parent:
10:387c49b2fc7e
Child:
12:ea4badc78215
started detach implementation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 10:387c49b2fc7e 1 // BaseUvc.h
va009039 10:387c49b2fc7e 2
va009039 9:fecabade834a 3 #pragma once
va009039 9:fecabade834a 4
va009039 10:387c49b2fc7e 5 // --- UVC --------------------------------------------------
va009039 10:387c49b2fc7e 6 #define _30FPS 333333
va009039 10:387c49b2fc7e 7 #define _25FPS 400000
va009039 10:387c49b2fc7e 8 #define _20FPS 500000
va009039 10:387c49b2fc7e 9 #define _15FPS 666666
va009039 10:387c49b2fc7e 10 #define _10FPS 1000000
va009039 10:387c49b2fc7e 11 #define _5FPS 2000000
va009039 10:387c49b2fc7e 12 #define _1FPS 10000000
va009039 10:387c49b2fc7e 13
va009039 10:387c49b2fc7e 14 #define SET_CUR 0x01
va009039 10:387c49b2fc7e 15 #define GET_CUR 0x81
va009039 10:387c49b2fc7e 16 #define GET_MIN 0x82
va009039 10:387c49b2fc7e 17 #define GET_MAX 0x83
va009039 10:387c49b2fc7e 18 #define GET_RES 0x84
va009039 10:387c49b2fc7e 19 #define GET_LEN 0x85
va009039 10:387c49b2fc7e 20 #define GET_INFO 0x86
va009039 10:387c49b2fc7e 21 #define GET_DEF 0x87
va009039 10:387c49b2fc7e 22
va009039 10:387c49b2fc7e 23 #define VS_PROBE_CONTROL 0x01
va009039 10:387c49b2fc7e 24 #define VS_COMMIT_CONTROL 0x02
va009039 10:387c49b2fc7e 25
va009039 9:fecabade834a 26 class BaseEp;
va009039 9:fecabade834a 27 struct HCITD { // HostController Isochronous Transfer Descriptor
va009039 9:fecabade834a 28 __IO uint32_t Control; // +0 Transfer descriptor control
va009039 9:fecabade834a 29 uint8_t* BufferPage0; // +4 Buffer Page 0
va009039 9:fecabade834a 30 HCITD* Next; // +8 Physical pointer to next Isochronous Transfer Descriptor
va009039 9:fecabade834a 31 uint8_t* BufferEnd; // +12 buffer End
va009039 9:fecabade834a 32 __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW
va009039 9:fecabade834a 33 BaseEp* ep; // +32 endpoint object
va009039 9:fecabade834a 34 __IO uint8_t buf[0]; // +36 buffer
va009039 9:fecabade834a 35 // +36
va009039 9:fecabade834a 36 HCITD(BaseEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize);
va009039 9:fecabade834a 37 inline void* operator new(size_t size, int buf_size) {
va009039 9:fecabade834a 38 void* p;
va009039 9:fecabade834a 39 if (posix_memalign(&p, 32, size+buf_size) == 0) {
va009039 9:fecabade834a 40 return p;
va009039 9:fecabade834a 41 }
va009039 9:fecabade834a 42 return NULL;
va009039 9:fecabade834a 43 }
va009039 9:fecabade834a 44
va009039 9:fecabade834a 45 inline void operator delete(void* p) {
va009039 9:fecabade834a 46 free(p);
va009039 9:fecabade834a 47 }
va009039 9:fecabade834a 48
va009039 9:fecabade834a 49 inline uint16_t StartingFrame() {
va009039 9:fecabade834a 50 return Control & 0xffff;
va009039 9:fecabade834a 51 }
va009039 9:fecabade834a 52
va009039 9:fecabade834a 53 inline uint8_t FrameCount() {
va009039 9:fecabade834a 54 return ((Control>>24)&7)+1;
va009039 9:fecabade834a 55 }
va009039 9:fecabade834a 56
va009039 9:fecabade834a 57 inline uint8_t ConditionCode() {
va009039 9:fecabade834a 58 return Control>>28;
va009039 9:fecabade834a 59 }
va009039 9:fecabade834a 60 };
va009039 9:fecabade834a 61
va009039 9:fecabade834a 62 struct _HCED { // HostController EndPoint Descriptor
va009039 9:fecabade834a 63 __IO uint32_t Control; // +0 Endpoint descriptor control
va009039 9:fecabade834a 64 HCTD* TailTd; // +4 Physical address of tail in Transfer descriptor list
va009039 9:fecabade834a 65 __IO HCTD* HeadTd; // +8 Physcial address of head in Transfer descriptor list
va009039 9:fecabade834a 66 _HCED* Next; // +12 Physical address of next Endpoint descriptor
va009039 9:fecabade834a 67 // +16
va009039 9:fecabade834a 68 _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed) {
va009039 9:fecabade834a 69 Control = addr | /* USB address */
va009039 9:fecabade834a 70 ((ep & 0x7F) << 7) | /* Endpoint address */
va009039 9:fecabade834a 71 (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */
va009039 9:fecabade834a 72 ((lowSpeed?1:0) << 13) | /* speed full=0 low=1 */
va009039 9:fecabade834a 73 (size << 16); /* MaxPkt Size */
va009039 9:fecabade834a 74 Next = NULL;
va009039 9:fecabade834a 75 }
va009039 9:fecabade834a 76
va009039 9:fecabade834a 77 inline void* operator new(size_t size) {
va009039 9:fecabade834a 78 void* p;
va009039 9:fecabade834a 79 if (posix_memalign(&p, 16, size) == 0) {
va009039 9:fecabade834a 80 return p;
va009039 9:fecabade834a 81 }
va009039 9:fecabade834a 82 return NULL;
va009039 9:fecabade834a 83 }
va009039 9:fecabade834a 84
va009039 9:fecabade834a 85 inline void operator delete(void* p) {
va009039 9:fecabade834a 86 free(p);
va009039 9:fecabade834a 87 }
va009039 9:fecabade834a 88
va009039 9:fecabade834a 89 inline uint8_t FunctionAddress() {
va009039 9:fecabade834a 90 return Control & 0x7f;
va009039 9:fecabade834a 91 }
va009039 9:fecabade834a 92
va009039 9:fecabade834a 93 inline int Speed() {
va009039 9:fecabade834a 94 return (Control>>13)&1;
va009039 9:fecabade834a 95 }
va009039 9:fecabade834a 96
va009039 9:fecabade834a 97 inline void setFunctionAddress(int addr) {
va009039 9:fecabade834a 98 Control &= ~0x7f;
va009039 9:fecabade834a 99 Control |= addr;
va009039 9:fecabade834a 100 }
va009039 9:fecabade834a 101
va009039 9:fecabade834a 102 inline void setMaxPacketSize(uint16_t size) {
va009039 9:fecabade834a 103 Control &= ~0xffff0000;
va009039 9:fecabade834a 104 Control |= size<<16;
va009039 9:fecabade834a 105 }
va009039 10:387c49b2fc7e 106
va009039 11:6a8eef89eb22 107 int Skip() {
va009039 11:6a8eef89eb22 108 return (Control>>14) & 1;
va009039 11:6a8eef89eb22 109 }
va009039 11:6a8eef89eb22 110
va009039 11:6a8eef89eb22 111 void setSkip() {
va009039 11:6a8eef89eb22 112 Control |= (1<<14);
va009039 11:6a8eef89eb22 113 }
va009039 11:6a8eef89eb22 114
va009039 11:6a8eef89eb22 115 void setFormat() {
va009039 11:6a8eef89eb22 116 Control |= (1<<15);
va009039 11:6a8eef89eb22 117 }
va009039 11:6a8eef89eb22 118
va009039 11:6a8eef89eb22 119 template<typename T>
va009039 11:6a8eef89eb22 120 inline bool enqueue(T* td) {
va009039 11:6a8eef89eb22 121 if (td) {
va009039 11:6a8eef89eb22 122 T* tail = reinterpret_cast<T*>(TailTd);
va009039 11:6a8eef89eb22 123 if (tail) {
va009039 11:6a8eef89eb22 124 tail->Next = td;
va009039 11:6a8eef89eb22 125 TailTd = reinterpret_cast<HCTD*>(td);
va009039 11:6a8eef89eb22 126 return true;
va009039 11:6a8eef89eb22 127 }
va009039 11:6a8eef89eb22 128 }
va009039 11:6a8eef89eb22 129 return false;
va009039 11:6a8eef89eb22 130 }
va009039 11:6a8eef89eb22 131
va009039 11:6a8eef89eb22 132 template<typename T>
va009039 11:6a8eef89eb22 133 inline T* dequeue() {
va009039 11:6a8eef89eb22 134 T* head = reinterpret_cast<T*>(reinterpret_cast<uint32_t>(HeadTd)&~3); // delete Halted and Toggle Carry bit
va009039 11:6a8eef89eb22 135 T* tail = reinterpret_cast<T*>(TailTd);
va009039 11:6a8eef89eb22 136 if (head == NULL || tail == NULL || head == tail) {
va009039 11:6a8eef89eb22 137 return NULL;
va009039 11:6a8eef89eb22 138 }
va009039 11:6a8eef89eb22 139 HeadTd = reinterpret_cast<HCTD*>(head->Next);
va009039 11:6a8eef89eb22 140 return head;
va009039 11:6a8eef89eb22 141 }
va009039 11:6a8eef89eb22 142 template<typename T>
va009039 11:6a8eef89eb22 143 void init_queue(T* td) {
va009039 11:6a8eef89eb22 144 TailTd = reinterpret_cast<HCTD*>(td);
va009039 11:6a8eef89eb22 145 HeadTd = reinterpret_cast<HCTD*>(td);
va009039 10:387c49b2fc7e 146 }
va009039 9:fecabade834a 147 };
va009039 9:fecabade834a 148
va009039 9:fecabade834a 149 struct _HCCA { // Host Controller Communication Area
va009039 9:fecabade834a 150 _HCED* InterruptTable[32]; // +0 Interrupt Table
va009039 9:fecabade834a 151 __IO uint16_t FrameNumber;// +128 Frame Number
va009039 9:fecabade834a 152 __IO uint16_t Pad1; // +130
va009039 9:fecabade834a 153 __IO HCTD* DoneHead; // +132 Done Head
va009039 9:fecabade834a 154 uint8_t Reserved[116]; // +136 Reserved for future use
va009039 9:fecabade834a 155 uint8_t Unknown[4]; // +252 Unused
va009039 9:fecabade834a 156 // +256
va009039 9:fecabade834a 157 inline void* operator new(size_t size) {
va009039 9:fecabade834a 158 void* p;
va009039 9:fecabade834a 159 if (posix_memalign(&p, 256, size) == 0) {
va009039 9:fecabade834a 160 return p;
va009039 9:fecabade834a 161 }
va009039 9:fecabade834a 162 return NULL;
va009039 9:fecabade834a 163 }
va009039 9:fecabade834a 164
va009039 9:fecabade834a 165 inline void operator delete(void* p) {
va009039 9:fecabade834a 166 free(p);
va009039 9:fecabade834a 167 }
va009039 10:387c49b2fc7e 168
va009039 10:387c49b2fc7e 169 inline void enqueue(_HCED* ed) {
va009039 10:387c49b2fc7e 170 for(int i = 0; i < 32; i++) {
va009039 10:387c49b2fc7e 171 if (InterruptTable[i] == NULL) {
va009039 10:387c49b2fc7e 172 InterruptTable[i] = ed;
va009039 10:387c49b2fc7e 173 } else {
va009039 10:387c49b2fc7e 174 _HCED* nextEd = InterruptTable[i];
va009039 10:387c49b2fc7e 175 while(nextEd->Next && nextEd->Next != ed) {
va009039 10:387c49b2fc7e 176 nextEd = nextEd->Next;
va009039 10:387c49b2fc7e 177 }
va009039 10:387c49b2fc7e 178 nextEd->Next = ed;
va009039 10:387c49b2fc7e 179 }
va009039 10:387c49b2fc7e 180 }
va009039 10:387c49b2fc7e 181 }
va009039 10:387c49b2fc7e 182
va009039 10:387c49b2fc7e 183 inline void dequeue(_HCED* ed) {
va009039 10:387c49b2fc7e 184 for(int i = 0; i < 32; i++) {
va009039 10:387c49b2fc7e 185 if (InterruptTable[i] == ed) {
va009039 10:387c49b2fc7e 186 InterruptTable[i] = ed->Next;
va009039 10:387c49b2fc7e 187 } else if (InterruptTable[i]) {
va009039 10:387c49b2fc7e 188 _HCED* nextEd = InterruptTable[i];
va009039 10:387c49b2fc7e 189 while(nextEd) {
va009039 10:387c49b2fc7e 190 if (nextEd->Next == ed) {
va009039 10:387c49b2fc7e 191 nextEd->Next = ed->Next;
va009039 10:387c49b2fc7e 192 break;
va009039 10:387c49b2fc7e 193 }
va009039 10:387c49b2fc7e 194 nextEd = nextEd->Next;
va009039 10:387c49b2fc7e 195 }
va009039 10:387c49b2fc7e 196 }
va009039 10:387c49b2fc7e 197 }
va009039 10:387c49b2fc7e 198 }
va009039 9:fecabade834a 199 };
va009039 9:fecabade834a 200
va009039 9:fecabade834a 201 #define HCTD_QUEUE_SIZE 3
va009039 9:fecabade834a 202
va009039 9:fecabade834a 203 class BaseEp { // endpoint
va009039 9:fecabade834a 204 public:
va009039 11:6a8eef89eb22 205 void init(int addr, uint8_t ep = 0, uint16_t size = 8, int lowSpeed = 0);
va009039 9:fecabade834a 206 int GetAddr();
va009039 9:fecabade834a 207 int GetLowSpeed();
va009039 9:fecabade834a 208 void update_FunctionAddress(int addr);
va009039 9:fecabade834a 209 void update_MaxPacketSize(uint16_t size);
va009039 9:fecabade834a 210 int transfer(uint8_t* buf, int len);
va009039 9:fecabade834a 211 int status(uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 212 //
va009039 9:fecabade834a 213 virtual void enable() = 0;
va009039 9:fecabade834a 214 virtual void irqWdhHandler(HCTD* td) {m_queue.put(td);} // WDH
va009039 9:fecabade834a 215 int wait_queue_HCTD(HCTD* wait_td, uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 216 // report
va009039 9:fecabade834a 217 uint8_t m_ConditionCode;
va009039 9:fecabade834a 218 int m_report_queue_error;
va009039 9:fecabade834a 219 protected:
va009039 9:fecabade834a 220 int send_receive(uint8_t* buf, int len, int millisec);
va009039 9:fecabade834a 221 HCTD* get_queue_HCTD(uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 222 _HCED* m_pED;
va009039 9:fecabade834a 223 Queue<HCTD, HCTD_QUEUE_SIZE> m_queue; // TD done queue
va009039 9:fecabade834a 224 int m_td_queue_count;
va009039 9:fecabade834a 225 };
va009039 9:fecabade834a 226
va009039 9:fecabade834a 227 class IsochronousEp : public BaseEp {
va009039 9:fecabade834a 228 public:
va009039 11:6a8eef89eb22 229 void init(int addr, uint8_t ep, uint16_t size);
va009039 9:fecabade834a 230 void reset(int delay_ms = 100);
va009039 10:387c49b2fc7e 231 HCITD* isochronousReceive(int millisec=osWaitForever);
va009039 9:fecabade834a 232 int isochronousSend(uint8_t* buf, int len, int millisec=osWaitForever);
va009039 9:fecabade834a 233 HCITD* get_queue_HCITD(int millisec);
va009039 9:fecabade834a 234 uint16_t m_PacketSize;
va009039 10:387c49b2fc7e 235 void disconnect();
va009039 9:fecabade834a 236 private:
va009039 9:fecabade834a 237 HCITD* new_HCITD(BaseEp* obj);
va009039 9:fecabade834a 238 int m_itd_queue_count;
va009039 9:fecabade834a 239 uint16_t m_FrameNumber;
va009039 9:fecabade834a 240 int m_FrameCount; // 1-8
va009039 9:fecabade834a 241 virtual void enable();
va009039 9:fecabade834a 242 };
va009039 9:fecabade834a 243
va009039 9:fecabade834a 244 class BaseUvc {
va009039 9:fecabade834a 245 public:
va009039 9:fecabade834a 246 void poll(int millisec=osWaitForever);
va009039 10:387c49b2fc7e 247 USB_TYPE Control(int req, int cs, int index, uint8_t* buf, int size);
va009039 10:387c49b2fc7e 248 USB_TYPE setInterfaceAlternate(uint8_t intf, uint8_t alt);
va009039 9:fecabade834a 249 //ControlEp* m_ctlEp;
va009039 9:fecabade834a 250 IsochronousEp* m_isoEp;
va009039 9:fecabade834a 251 uint32_t report_cc_count[16]; // ConditionCode
va009039 9:fecabade834a 252 uint32_t report_ps_cc_count[16]; // Packt Status ConditionCode
va009039 9:fecabade834a 253 // callback
va009039 9:fecabade834a 254 void onResult(uint16_t frame, uint8_t* buf, int len);
va009039 9:fecabade834a 255 void setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) );
va009039 9:fecabade834a 256 class CDummy;
va009039 9:fecabade834a 257 template<class T>
va009039 9:fecabade834a 258 void setOnResult( T* pItem, void (T::*pMethod)(uint16_t, uint8_t*, int) )
va009039 9:fecabade834a 259 {
va009039 9:fecabade834a 260 m_pCb = NULL;
va009039 9:fecabade834a 261 m_pCbItem = (CDummy*) pItem;
va009039 9:fecabade834a 262 m_pCbMeth = (void (CDummy::*)(uint16_t, uint8_t*, int)) pMethod;
va009039 9:fecabade834a 263 }
va009039 9:fecabade834a 264 void clearOnResult();
va009039 9:fecabade834a 265 CDummy* m_pCbItem;
va009039 9:fecabade834a 266 void (CDummy::*m_pCbMeth)(uint16_t, uint8_t*, int);
va009039 9:fecabade834a 267 void (*m_pCb)(uint16_t, uint8_t*, int);
va009039 10:387c49b2fc7e 268 protected:
va009039 10:387c49b2fc7e 269 USBHost * host;
va009039 10:387c49b2fc7e 270 USBDeviceConnected * dev;
va009039 9:fecabade834a 271 };