Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of USBHostC270_example by
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 | }; |