diff options
author | Ryan <fauxpark@gmail.com> | 2021-08-18 18:20:25 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-18 18:20:25 +1000 |
commit | b16091659cc9a724a8800f77e631643b4ab089ad (patch) | |
tree | e44933472c6d100bd4fc5d8a693d9d21e3c32f6f /lib/usbhost/USB_Host_Shield_2.0/cdcacm.h | |
parent | cf5e40c25139ff64ff246f1c6280e983ef75551c (diff) | |
download | qmk_firmware-b16091659cc9a724a8800f77e631643b4ab089ad.tar.gz qmk_firmware-b16091659cc9a724a8800f77e631643b4ab089ad.zip |
Move USB Host Shield and Arduino core to `lib/` (#13973)
Diffstat (limited to 'lib/usbhost/USB_Host_Shield_2.0/cdcacm.h')
-rw-r--r-- | lib/usbhost/USB_Host_Shield_2.0/cdcacm.h | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/lib/usbhost/USB_Host_Shield_2.0/cdcacm.h b/lib/usbhost/USB_Host_Shield_2.0/cdcacm.h new file mode 100644 index 000000000..2a38524d8 --- /dev/null +++ b/lib/usbhost/USB_Host_Shield_2.0/cdcacm.h | |||
@@ -0,0 +1,252 @@ | |||
1 | /* Copyright (C) 2011 Circuits At Home, LTD. All rights reserved. | ||
2 | |||
3 | This software may be distributed and modified under the terms of the GNU | ||
4 | General Public License version 2 (GPL2) as published by the Free Software | ||
5 | Foundation and appearing in the file GPL2.TXT included in the packaging of | ||
6 | this file. Please note that GPL2 Section 2[b] requires that all works based | ||
7 | on this software must also be made publicly available under the terms of | ||
8 | the GPL2 ("Copyleft"). | ||
9 | |||
10 | Contact information | ||
11 | ------------------- | ||
12 | |||
13 | Circuits At Home, LTD | ||
14 | Web : http://www.circuitsathome.com | ||
15 | e-mail : support@circuitsathome.com | ||
16 | */ | ||
17 | #if !defined(__CDCACM_H__) | ||
18 | #define __CDCACM_H__ | ||
19 | |||
20 | #include "Usb.h" | ||
21 | |||
22 | #define bmREQ_CDCOUT USB_SETUP_HOST_TO_DEVICE|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE | ||
23 | #define bmREQ_CDCIN USB_SETUP_DEVICE_TO_HOST|USB_SETUP_TYPE_CLASS|USB_SETUP_RECIPIENT_INTERFACE | ||
24 | |||
25 | // CDC Subclass Constants | ||
26 | #define CDC_SUBCLASS_DLCM 0x01 // Direct Line Control Model | ||
27 | #define CDC_SUBCLASS_ACM 0x02 // Abstract Control Model | ||
28 | #define CDC_SUBCLASS_TCM 0x03 // Telephone Control Model | ||
29 | #define CDC_SUBCLASS_MCCM 0x04 // Multi Channel Control Model | ||
30 | #define CDC_SUBCLASS_CAPI 0x05 // CAPI Control Model | ||
31 | #define CDC_SUBCLASS_ETHERNET 0x06 // Ethernet Network Control Model | ||
32 | #define CDC_SUBCLASS_ATM 0x07 // ATM Network Control Model | ||
33 | #define CDC_SUBCLASS_WIRELESS_HANDSET 0x08 // Wireless Handset Control Model | ||
34 | #define CDC_SUBCLASS_DEVICE_MANAGEMENT 0x09 // Device Management | ||
35 | #define CDC_SUBCLASS_MOBILE_DIRECT_LINE 0x0A // Mobile Direct Line Model | ||
36 | #define CDC_SUBCLASS_OBEX 0x0B // OBEX | ||
37 | #define CDC_SUBCLASS_ETHERNET_EMU 0x0C // Ethernet Emulation Model | ||
38 | |||
39 | // Communication Interface Class Control Protocol Codes | ||
40 | #define CDC_PROTOCOL_ITU_T_V_250 0x01 // AT Commands defined by ITU-T V.250 | ||
41 | #define CDC_PROTOCOL_PCCA_101 0x02 // AT Commands defined by PCCA-101 | ||
42 | #define CDC_PROTOCOL_PCCA_101_O 0x03 // AT Commands defined by PCCA-101 & Annex O | ||
43 | #define CDC_PROTOCOL_GSM_7_07 0x04 // AT Commands defined by GSM 7.07 | ||
44 | #define CDC_PROTOCOL_3GPP_27_07 0x05 // AT Commands defined by 3GPP 27.007 | ||
45 | #define CDC_PROTOCOL_C_S0017_0 0x06 // AT Commands defined by TIA for CDMA | ||
46 | #define CDC_PROTOCOL_USB_EEM 0x07 // Ethernet Emulation Model | ||
47 | |||
48 | // CDC Commands defined by CDC 1.2 | ||
49 | #define CDC_SEND_ENCAPSULATED_COMMAND 0x00 | ||
50 | #define CDC_GET_ENCAPSULATED_RESPONSE 0x01 | ||
51 | |||
52 | // CDC Commands defined by PSTN 1.2 | ||
53 | #define CDC_SET_COMM_FEATURE 0x02 | ||
54 | #define CDC_GET_COMM_FEATURE 0x03 | ||
55 | #define CDC_CLEAR_COMM_FEATURE 0x04 | ||
56 | #define CDC_SET_AUX_LINE_STATE 0x10 | ||
57 | #define CDC_SET_HOOK_STATE 0x11 | ||
58 | #define CDC_PULSE_SETUP 0x12 | ||
59 | #define CDC_SEND_PULSE 0x13 | ||
60 | #define CDC_SET_PULSE_TIME 0x14 | ||
61 | #define CDC_RING_AUX_JACK 0x15 | ||
62 | #define CDC_SET_LINE_CODING 0x20 | ||
63 | #define CDC_GET_LINE_CODING 0x21 | ||
64 | #define CDC_SET_CONTROL_LINE_STATE 0x22 | ||
65 | #define CDC_SEND_BREAK 0x23 | ||
66 | #define CDC_SET_RINGER_PARMS 0x30 | ||
67 | #define CDC_GET_RINGER_PARMS 0x31 | ||
68 | #define CDC_SET_OPERATION_PARMS 0x32 | ||
69 | #define CDC_GET_OPERATION_PARMS 0x33 | ||
70 | #define CDC_SET_LINE_PARMS 0x34 | ||
71 | #define CDC_GET_LINE_PARMS 0x35 | ||
72 | #define CDC_DIAL_DIGITS 0x36 | ||
73 | |||
74 | //Class-Specific Notification Codes | ||
75 | #define NETWORK_CONNECTION 0x00 | ||
76 | #define RESPONSE_AVAILABLE 0x01 | ||
77 | #define AUX_JACK_HOOK_STATE 0x08 | ||
78 | #define RING_DETECT 0x09 | ||
79 | #define SERIAL_STATE 0x20 | ||
80 | #define CALL_STATE_CHANGE 0x28 | ||
81 | #define LINE_STATE_CHANGE 0x29 | ||
82 | #define CONNECTION_SPEED_CHANGE 0x2a | ||
83 | |||
84 | // CDC Functional Descriptor Structures | ||
85 | |||
86 | typedef struct { | ||
87 | uint8_t bFunctionLength; | ||
88 | uint8_t bDescriptorType; | ||
89 | uint8_t bDescriptorSubtype; | ||
90 | uint8_t bmCapabilities; | ||
91 | uint8_t bDataInterface; | ||
92 | } CALL_MGMNT_FUNC_DESCR; | ||
93 | |||
94 | typedef struct { | ||
95 | uint8_t bFunctionLength; | ||
96 | uint8_t bDescriptorType; | ||
97 | uint8_t bDescriptorSubtype; | ||
98 | uint8_t bmCapabilities; | ||
99 | } ACM_FUNC_DESCR, DLM_FUNC_DESCR, TEL_OPER_MODES_FUNC_DESCR, | ||
100 | TEL_CALL_STATE_REP_CPBL_FUNC_DESCR; | ||
101 | |||
102 | typedef struct { | ||
103 | uint8_t bFunctionLength; | ||
104 | uint8_t bDescriptorType; | ||
105 | uint8_t bDescriptorSubtype; | ||
106 | uint8_t bRingerVolSteps; | ||
107 | uint8_t bNumRingerPatterns; | ||
108 | } TEL_RINGER_FUNC_DESCR; | ||
109 | |||
110 | typedef struct { | ||
111 | uint32_t dwDTERate; // Data Terminal Rate in bits per second | ||
112 | uint8_t bCharFormat; // 0 - 1 stop bit, 1 - 1.5 stop bits, 2 - 2 stop bits | ||
113 | uint8_t bParityType; // 0 - None, 1 - Odd, 2 - Even, 3 - Mark, 4 - Space | ||
114 | uint8_t bDataBits; // Data bits (5, 6, 7, 8 or 16) | ||
115 | } LINE_CODING; | ||
116 | |||
117 | typedef struct { | ||
118 | uint8_t bmRequestType; // 0xa1 for class-specific notifications | ||
119 | uint8_t bNotification; | ||
120 | uint16_t wValue; | ||
121 | uint16_t wIndex; | ||
122 | uint16_t wLength; | ||
123 | uint16_t bmState; //UART state bitmap for SERIAL_STATE, other notifications variable length | ||
124 | } CLASS_NOTIFICATION; | ||
125 | |||
126 | class ACM; | ||
127 | |||
128 | class CDCAsyncOper { | ||
129 | public: | ||
130 | |||
131 | virtual uint8_t OnInit(ACM *pacm) { | ||
132 | return 0; | ||
133 | }; | ||
134 | //virtual void OnDataRcvd(ACM *pacm, uint8_t nbytes, uint8_t *dataptr) = 0; | ||
135 | //virtual void OnDisconnected(ACM *pacm) = 0; | ||
136 | }; | ||
137 | |||
138 | /** | ||
139 | * This structure is used to report the extended capabilities of the connected device. | ||
140 | * It is also used to report the current status. | ||
141 | * Regular CDC-ACM reports all as false. | ||
142 | */ | ||
143 | typedef struct { | ||
144 | |||
145 | union { | ||
146 | uint8_t tty; | ||
147 | |||
148 | struct { | ||
149 | bool enhanced : 1; // Do we have the ability to set/clear any features? | ||
150 | // Status and 8th bit in data stream. | ||
151 | // Presence only indicates feature is available, but this isn't used for CDC-ACM. | ||
152 | bool wide : 1; | ||
153 | bool autoflow_RTS : 1; // Has autoflow on RTS/CTS | ||
154 | bool autoflow_DSR : 1; // Has autoflow on DTR/DSR | ||
155 | bool autoflow_XON : 1; // Has autoflow XON/XOFF | ||
156 | bool half_duplex : 1; // Has half-duplex capability. | ||
157 | } __attribute__((packed)); | ||
158 | }; | ||
159 | } tty_features; | ||
160 | |||
161 | #define ACM_MAX_ENDPOINTS 4 | ||
162 | |||
163 | class ACM : public USBDeviceConfig, public UsbConfigXtracter { | ||
164 | protected: | ||
165 | static const uint8_t epDataInIndex; // DataIn endpoint index | ||
166 | static const uint8_t epDataOutIndex; // DataOUT endpoint index | ||
167 | static const uint8_t epInterruptInIndex; // InterruptIN endpoint index | ||
168 | |||
169 | USB *pUsb; | ||
170 | CDCAsyncOper *pAsync; | ||
171 | uint8_t bAddress; | ||
172 | uint8_t bConfNum; // configuration number | ||
173 | uint8_t bControlIface; // Control interface value | ||
174 | uint8_t bDataIface; // Data interface value | ||
175 | uint8_t bNumEP; // total number of EP in the configuration | ||
176 | uint32_t qNextPollTime; // next poll time | ||
177 | volatile bool bPollEnable; // poll enable flag | ||
178 | volatile bool ready; //device ready indicator | ||
179 | tty_features _enhanced_status; // current status | ||
180 | |||
181 | EpInfo epInfo[ACM_MAX_ENDPOINTS]; | ||
182 | |||
183 | void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR* ep_ptr); | ||
184 | |||
185 | public: | ||
186 | ACM(USB *pusb, CDCAsyncOper *pasync); | ||
187 | |||
188 | uint8_t SetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr); | ||
189 | uint8_t GetCommFeature(uint16_t fid, uint8_t nbytes, uint8_t *dataptr); | ||
190 | uint8_t ClearCommFeature(uint16_t fid); | ||
191 | uint8_t SetLineCoding(const LINE_CODING *dataptr); | ||
192 | uint8_t GetLineCoding(LINE_CODING *dataptr); | ||
193 | uint8_t SetControlLineState(uint8_t state); | ||
194 | uint8_t SendBreak(uint16_t duration); | ||
195 | uint8_t GetNotif(uint16_t *bytes_rcvd, uint8_t *dataptr); | ||
196 | |||
197 | // Methods for receiving and sending data | ||
198 | uint8_t RcvData(uint16_t *nbytesptr, uint8_t *dataptr); | ||
199 | uint8_t SndData(uint16_t nbytes, uint8_t *dataptr); | ||
200 | |||
201 | // USBDeviceConfig implementation | ||
202 | uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed); | ||
203 | uint8_t Release(); | ||
204 | uint8_t Poll(); | ||
205 | |||
206 | bool available(void) { | ||
207 | return false; | ||
208 | }; | ||
209 | |||
210 | virtual uint8_t GetAddress() { | ||
211 | return bAddress; | ||
212 | }; | ||
213 | |||
214 | virtual bool isReady() { | ||
215 | return ready; | ||
216 | }; | ||
217 | |||
218 | virtual tty_features enhanced_status(void) { | ||
219 | return _enhanced_status; | ||
220 | }; | ||
221 | |||
222 | virtual tty_features enhanced_features(void) { | ||
223 | tty_features rv; | ||
224 | rv.enhanced = false; | ||
225 | rv.autoflow_RTS = false; | ||
226 | rv.autoflow_DSR = false; | ||
227 | rv.autoflow_XON = false; | ||
228 | rv.half_duplex = false; | ||
229 | rv.wide = false; | ||
230 | return rv; | ||
231 | }; | ||
232 | |||
233 | virtual void autoflowRTS(bool s) { | ||
234 | }; | ||
235 | |||
236 | virtual void autoflowDSR(bool s) { | ||
237 | }; | ||
238 | |||
239 | virtual void autoflowXON(bool s) { | ||
240 | }; | ||
241 | |||
242 | virtual void half_duplex(bool s) { | ||
243 | }; | ||
244 | |||
245 | virtual void wide(bool s) { | ||
246 | }; | ||
247 | |||
248 | // UsbConfigXtracter implementation | ||
249 | void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep); | ||
250 | }; | ||
251 | |||
252 | #endif // __CDCACM_H__ | ||