testing n-Bed with a Logitech C270 camera

Dependencies:   USBHost mbed

Fork of USBHostC270_example by Norimasa Okamoto

Committer:
va009039
Date:
Sat Mar 16 13:07:55 2013 +0000
Revision:
9:fecabade834a
Child:
10:387c49b2fc7e
LogitechC270 class driver alpha version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
va009039 9:fecabade834a 1 #pragma once
va009039 9:fecabade834a 2
va009039 9:fecabade834a 3 class BaseEp;
va009039 9:fecabade834a 4 struct HCITD { // HostController Isochronous Transfer Descriptor
va009039 9:fecabade834a 5 __IO uint32_t Control; // +0 Transfer descriptor control
va009039 9:fecabade834a 6 uint8_t* BufferPage0; // +4 Buffer Page 0
va009039 9:fecabade834a 7 HCITD* Next; // +8 Physical pointer to next Isochronous Transfer Descriptor
va009039 9:fecabade834a 8 uint8_t* BufferEnd; // +12 buffer End
va009039 9:fecabade834a 9 __IO uint16_t OffsetPSW[8]; // +16 Offset/PSW
va009039 9:fecabade834a 10 BaseEp* ep; // +32 endpoint object
va009039 9:fecabade834a 11 __IO uint8_t buf[0]; // +36 buffer
va009039 9:fecabade834a 12 // +36
va009039 9:fecabade834a 13 HCITD(BaseEp* obj, uint16_t FrameNumber, int FrameCount, uint16_t PacketSize);
va009039 9:fecabade834a 14 inline void* operator new(size_t size, int buf_size) {
va009039 9:fecabade834a 15 void* p;
va009039 9:fecabade834a 16 if (posix_memalign(&p, 32, size+buf_size) == 0) {
va009039 9:fecabade834a 17 return p;
va009039 9:fecabade834a 18 }
va009039 9:fecabade834a 19 return NULL;
va009039 9:fecabade834a 20 }
va009039 9:fecabade834a 21
va009039 9:fecabade834a 22 inline void operator delete(void* p) {
va009039 9:fecabade834a 23 free(p);
va009039 9:fecabade834a 24 }
va009039 9:fecabade834a 25
va009039 9:fecabade834a 26 inline uint16_t StartingFrame() {
va009039 9:fecabade834a 27 return Control & 0xffff;
va009039 9:fecabade834a 28 }
va009039 9:fecabade834a 29
va009039 9:fecabade834a 30 inline uint8_t FrameCount() {
va009039 9:fecabade834a 31 return ((Control>>24)&7)+1;
va009039 9:fecabade834a 32 }
va009039 9:fecabade834a 33
va009039 9:fecabade834a 34 inline uint8_t ConditionCode() {
va009039 9:fecabade834a 35 return Control>>28;
va009039 9:fecabade834a 36 }
va009039 9:fecabade834a 37 };
va009039 9:fecabade834a 38
va009039 9:fecabade834a 39 struct _HCED { // HostController EndPoint Descriptor
va009039 9:fecabade834a 40 __IO uint32_t Control; // +0 Endpoint descriptor control
va009039 9:fecabade834a 41 HCTD* TailTd; // +4 Physical address of tail in Transfer descriptor list
va009039 9:fecabade834a 42 __IO HCTD* HeadTd; // +8 Physcial address of head in Transfer descriptor list
va009039 9:fecabade834a 43 _HCED* Next; // +12 Physical address of next Endpoint descriptor
va009039 9:fecabade834a 44 // +16
va009039 9:fecabade834a 45 _HCED(int addr, uint8_t ep, uint16_t size, int lowSpeed) {
va009039 9:fecabade834a 46 Control = addr | /* USB address */
va009039 9:fecabade834a 47 ((ep & 0x7F) << 7) | /* Endpoint address */
va009039 9:fecabade834a 48 (ep!=0?(((ep&0x80)?2:1) << 11):0)| /* direction : Out = 1, 2 = In */
va009039 9:fecabade834a 49 ((lowSpeed?1:0) << 13) | /* speed full=0 low=1 */
va009039 9:fecabade834a 50 (size << 16); /* MaxPkt Size */
va009039 9:fecabade834a 51 Next = NULL;
va009039 9:fecabade834a 52 }
va009039 9:fecabade834a 53
va009039 9:fecabade834a 54 inline void* operator new(size_t size) {
va009039 9:fecabade834a 55 void* p;
va009039 9:fecabade834a 56 if (posix_memalign(&p, 16, size) == 0) {
va009039 9:fecabade834a 57 return p;
va009039 9:fecabade834a 58 }
va009039 9:fecabade834a 59 return NULL;
va009039 9:fecabade834a 60 }
va009039 9:fecabade834a 61
va009039 9:fecabade834a 62 inline void operator delete(void* p) {
va009039 9:fecabade834a 63 free(p);
va009039 9:fecabade834a 64 }
va009039 9:fecabade834a 65
va009039 9:fecabade834a 66 inline uint8_t FunctionAddress() {
va009039 9:fecabade834a 67 return Control & 0x7f;
va009039 9:fecabade834a 68 }
va009039 9:fecabade834a 69
va009039 9:fecabade834a 70 inline int Speed() {
va009039 9:fecabade834a 71 return (Control>>13)&1;
va009039 9:fecabade834a 72 }
va009039 9:fecabade834a 73
va009039 9:fecabade834a 74 inline void setFunctionAddress(int addr) {
va009039 9:fecabade834a 75 Control &= ~0x7f;
va009039 9:fecabade834a 76 Control |= addr;
va009039 9:fecabade834a 77 }
va009039 9:fecabade834a 78
va009039 9:fecabade834a 79 inline void setMaxPacketSize(uint16_t size) {
va009039 9:fecabade834a 80 Control &= ~0xffff0000;
va009039 9:fecabade834a 81 Control |= size<<16;
va009039 9:fecabade834a 82 }
va009039 9:fecabade834a 83 };
va009039 9:fecabade834a 84
va009039 9:fecabade834a 85 struct _HCCA { // Host Controller Communication Area
va009039 9:fecabade834a 86 _HCED* InterruptTable[32]; // +0 Interrupt Table
va009039 9:fecabade834a 87 __IO uint16_t FrameNumber;// +128 Frame Number
va009039 9:fecabade834a 88 __IO uint16_t Pad1; // +130
va009039 9:fecabade834a 89 __IO HCTD* DoneHead; // +132 Done Head
va009039 9:fecabade834a 90 uint8_t Reserved[116]; // +136 Reserved for future use
va009039 9:fecabade834a 91 uint8_t Unknown[4]; // +252 Unused
va009039 9:fecabade834a 92 // +256
va009039 9:fecabade834a 93 inline void* operator new(size_t size) {
va009039 9:fecabade834a 94 void* p;
va009039 9:fecabade834a 95 if (posix_memalign(&p, 256, size) == 0) {
va009039 9:fecabade834a 96 return p;
va009039 9:fecabade834a 97 }
va009039 9:fecabade834a 98 return NULL;
va009039 9:fecabade834a 99 }
va009039 9:fecabade834a 100
va009039 9:fecabade834a 101 inline void operator delete(void* p) {
va009039 9:fecabade834a 102 free(p);
va009039 9:fecabade834a 103 }
va009039 9:fecabade834a 104 };
va009039 9:fecabade834a 105
va009039 9:fecabade834a 106 #define HCTD_QUEUE_SIZE 3
va009039 9:fecabade834a 107
va009039 9:fecabade834a 108 class BaseEp { // endpoint
va009039 9:fecabade834a 109 public:
va009039 9:fecabade834a 110 BaseEp(int addr, uint8_t ep = 0, uint16_t size = 8, int lowSpeed = 0);
va009039 9:fecabade834a 111 int GetAddr();
va009039 9:fecabade834a 112 int GetLowSpeed();
va009039 9:fecabade834a 113 void update_FunctionAddress(int addr);
va009039 9:fecabade834a 114 void update_MaxPacketSize(uint16_t size);
va009039 9:fecabade834a 115 int transfer(uint8_t* buf, int len);
va009039 9:fecabade834a 116 int status(uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 117 //
va009039 9:fecabade834a 118 virtual void enable() = 0;
va009039 9:fecabade834a 119 virtual void irqWdhHandler(HCTD* td) {m_queue.put(td);} // WDH
va009039 9:fecabade834a 120 int wait_queue_HCTD(HCTD* wait_td, uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 121 // report
va009039 9:fecabade834a 122 uint8_t m_ConditionCode;
va009039 9:fecabade834a 123 int m_report_queue_error;
va009039 9:fecabade834a 124 protected:
va009039 9:fecabade834a 125 int send_receive(uint8_t* buf, int len, int millisec);
va009039 9:fecabade834a 126 HCTD* get_queue_HCTD(uint32_t millisec=osWaitForever);
va009039 9:fecabade834a 127 _HCED* m_pED;
va009039 9:fecabade834a 128 Queue<HCTD, HCTD_QUEUE_SIZE> m_queue; // TD done queue
va009039 9:fecabade834a 129 int m_td_queue_count;
va009039 9:fecabade834a 130 };
va009039 9:fecabade834a 131
va009039 9:fecabade834a 132 class IsochronousEp : public BaseEp {
va009039 9:fecabade834a 133 public:
va009039 9:fecabade834a 134 IsochronousEp(int addr, uint8_t ep, uint16_t size);
va009039 9:fecabade834a 135 void reset(int delay_ms = 100);
va009039 9:fecabade834a 136 HCITD* isochronousReveive(int millisec=osWaitForever);
va009039 9:fecabade834a 137 int isochronousSend(uint8_t* buf, int len, int millisec=osWaitForever);
va009039 9:fecabade834a 138 HCITD* get_queue_HCITD(int millisec);
va009039 9:fecabade834a 139 uint16_t m_PacketSize;
va009039 9:fecabade834a 140 private:
va009039 9:fecabade834a 141 HCITD* new_HCITD(BaseEp* obj);
va009039 9:fecabade834a 142 int m_itd_queue_count;
va009039 9:fecabade834a 143 uint16_t m_FrameNumber;
va009039 9:fecabade834a 144 int m_FrameCount; // 1-8
va009039 9:fecabade834a 145 virtual void enable();
va009039 9:fecabade834a 146 };
va009039 9:fecabade834a 147
va009039 9:fecabade834a 148 class BaseUvc {
va009039 9:fecabade834a 149 public:
va009039 9:fecabade834a 150 void poll(int millisec=osWaitForever);
va009039 9:fecabade834a 151 int Control(int req, int cs, int index, uint8_t* buf, int size);
va009039 9:fecabade834a 152 //ControlEp* m_ctlEp;
va009039 9:fecabade834a 153 IsochronousEp* m_isoEp;
va009039 9:fecabade834a 154 uint32_t report_cc_count[16]; // ConditionCode
va009039 9:fecabade834a 155 uint32_t report_ps_cc_count[16]; // Packt Status ConditionCode
va009039 9:fecabade834a 156 // callback
va009039 9:fecabade834a 157 void onResult(uint16_t frame, uint8_t* buf, int len);
va009039 9:fecabade834a 158 void setOnResult( void (*pMethod)(uint16_t, uint8_t*, int) );
va009039 9:fecabade834a 159 class CDummy;
va009039 9:fecabade834a 160 template<class T>
va009039 9:fecabade834a 161 void setOnResult( T* pItem, void (T::*pMethod)(uint16_t, uint8_t*, int) )
va009039 9:fecabade834a 162 {
va009039 9:fecabade834a 163 m_pCb = NULL;
va009039 9:fecabade834a 164 m_pCbItem = (CDummy*) pItem;
va009039 9:fecabade834a 165 m_pCbMeth = (void (CDummy::*)(uint16_t, uint8_t*, int)) pMethod;
va009039 9:fecabade834a 166 }
va009039 9:fecabade834a 167 void clearOnResult();
va009039 9:fecabade834a 168 CDummy* m_pCbItem;
va009039 9:fecabade834a 169 void (CDummy::*m_pCbMeth)(uint16_t, uint8_t*, int);
va009039 9:fecabade834a 170 void (*m_pCb)(uint16_t, uint8_t*, int);
va009039 9:fecabade834a 171 };