modify for C210 webcam and Startboard Orange.
Dependencies: TextLCD USBHost mbed
Fork of USBHostC270_example by
Norimasa Okamoto さんの http://mbed.org/users/va009039/code/USBHostC270_example/ を C210 webcam と StarBoard Orange での SD カード保存用に変更。
USBHostC270/BaseUvc.h@9:fecabade834a, 2013-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |