]> git.gir.st - tmk_keyboard.git/blob - tmk_core/protocol/usb_hid/arduino-1.0.1/cores/arduino/USBCore.h
Merge commit 'a074364c3731d66b56d988c8a6c960a83ea0e0a1' as 'tmk_core'
[tmk_keyboard.git] / tmk_core / protocol / usb_hid / arduino-1.0.1 / cores / arduino / USBCore.h
1
2 // Copyright (c) 2010, Peter Barrett
3 /*
4 ** Permission to use, copy, modify, and/or distribute this software for
5 ** any purpose with or without fee is hereby granted, provided that the
6 ** above copyright notice and this permission notice appear in all copies.
7 **
8 ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
9 ** WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
10 ** WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
11 ** BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
12 ** OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
13 ** WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
14 ** ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
15 ** SOFTWARE.
16 */
17
18 #ifndef __USBCORE_H__
19 #define __USBCORE_H__
20
21 // Standard requests
22 #define GET_STATUS 0
23 #define CLEAR_FEATURE 1
24 #define SET_FEATURE 3
25 #define SET_ADDRESS 5
26 #define GET_DESCRIPTOR 6
27 #define SET_DESCRIPTOR 7
28 #define GET_CONFIGURATION 8
29 #define SET_CONFIGURATION 9
30 #define GET_INTERFACE 10
31 #define SET_INTERFACE 11
32
33
34 // bmRequestType
35 #define REQUEST_HOSTTODEVICE 0x00
36 #define REQUEST_DEVICETOHOST 0x80
37 #define REQUEST_DIRECTION 0x80
38
39 #define REQUEST_STANDARD 0x00
40 #define REQUEST_CLASS 0x20
41 #define REQUEST_VENDOR 0x40
42 #define REQUEST_TYPE 0x60
43
44 #define REQUEST_DEVICE 0x00
45 #define REQUEST_INTERFACE 0x01
46 #define REQUEST_ENDPOINT 0x02
47 #define REQUEST_OTHER 0x03
48 #define REQUEST_RECIPIENT 0x03
49
50 #define REQUEST_DEVICETOHOST_CLASS_INTERFACE (REQUEST_DEVICETOHOST + REQUEST_CLASS + REQUEST_INTERFACE)
51 #define REQUEST_HOSTTODEVICE_CLASS_INTERFACE (REQUEST_HOSTTODEVICE + REQUEST_CLASS + REQUEST_INTERFACE)
52
53 // Class requests
54
55 #define CDC_SET_LINE_CODING 0x20
56 #define CDC_GET_LINE_CODING 0x21
57 #define CDC_SET_CONTROL_LINE_STATE 0x22
58
59 #define MSC_RESET 0xFF
60 #define MSC_GET_MAX_LUN 0xFE
61
62 #define HID_GET_REPORT 0x01
63 #define HID_GET_IDLE 0x02
64 #define HID_GET_PROTOCOL 0x03
65 #define HID_SET_REPORT 0x09
66 #define HID_SET_IDLE 0x0A
67 #define HID_SET_PROTOCOL 0x0B
68
69 // Descriptors
70
71 #define USB_DEVICE_DESC_SIZE 18
72 #define USB_CONFIGUARTION_DESC_SIZE 9
73 #define USB_INTERFACE_DESC_SIZE 9
74 #define USB_ENDPOINT_DESC_SIZE 7
75
76 #define USB_DEVICE_DESCRIPTOR_TYPE 1
77 #define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
78 #define USB_STRING_DESCRIPTOR_TYPE 3
79 #define USB_INTERFACE_DESCRIPTOR_TYPE 4
80 #define USB_ENDPOINT_DESCRIPTOR_TYPE 5
81
82 #define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
83 #define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
84 #define USB_DEVICE_CLASS_STORAGE 0x08
85 #define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
86
87 #define USB_CONFIG_POWERED_MASK 0x40
88 #define USB_CONFIG_BUS_POWERED 0x80
89 #define USB_CONFIG_SELF_POWERED 0xC0
90 #define USB_CONFIG_REMOTE_WAKEUP 0x20
91
92 // bMaxPower in Configuration Descriptor
93 #define USB_CONFIG_POWER_MA(mA) ((mA)/2)
94
95 // bEndpointAddress in Endpoint Descriptor
96 #define USB_ENDPOINT_DIRECTION_MASK 0x80
97 #define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
98 #define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
99
100 #define USB_ENDPOINT_TYPE_MASK 0x03
101 #define USB_ENDPOINT_TYPE_CONTROL 0x00
102 #define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
103 #define USB_ENDPOINT_TYPE_BULK 0x02
104 #define USB_ENDPOINT_TYPE_INTERRUPT 0x03
105
106 #define TOBYTES(x) ((x) & 0xFF),(((x) >> 8) & 0xFF)
107
108 #define CDC_V1_10 0x0110
109 #define CDC_COMMUNICATION_INTERFACE_CLASS 0x02
110
111 #define CDC_CALL_MANAGEMENT 0x01
112 #define CDC_ABSTRACT_CONTROL_MODEL 0x02
113 #define CDC_HEADER 0x00
114 #define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02
115 #define CDC_UNION 0x06
116 #define CDC_CS_INTERFACE 0x24
117 #define CDC_CS_ENDPOINT 0x25
118 #define CDC_DATA_INTERFACE_CLASS 0x0A
119
120 #define MSC_SUBCLASS_SCSI 0x06
121 #define MSC_PROTOCOL_BULK_ONLY 0x50
122
123 #define HID_HID_DESCRIPTOR_TYPE 0x21
124 #define HID_REPORT_DESCRIPTOR_TYPE 0x22
125 #define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23
126
127
128 // Device
129 typedef struct {
130 u8 len; // 18
131 u8 dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE
132 u16 usbVersion; // 0x200
133 u8 deviceClass;
134 u8 deviceSubClass;
135 u8 deviceProtocol;
136 u8 packetSize0; // Packet 0
137 u16 idVendor;
138 u16 idProduct;
139 u16 deviceVersion; // 0x100
140 u8 iManufacturer;
141 u8 iProduct;
142 u8 iSerialNumber;
143 u8 bNumConfigurations;
144 } DeviceDescriptor;
145
146 // Config
147 typedef struct {
148 u8 len; // 9
149 u8 dtype; // 2
150 u16 clen; // total length
151 u8 numInterfaces;
152 u8 config;
153 u8 iconfig;
154 u8 attributes;
155 u8 maxPower;
156 } ConfigDescriptor;
157
158 // String
159
160 // Interface
161 typedef struct
162 {
163 u8 len; // 9
164 u8 dtype; // 4
165 u8 number;
166 u8 alternate;
167 u8 numEndpoints;
168 u8 interfaceClass;
169 u8 interfaceSubClass;
170 u8 protocol;
171 u8 iInterface;
172 } InterfaceDescriptor;
173
174 // Endpoint
175 typedef struct
176 {
177 u8 len; // 7
178 u8 dtype; // 5
179 u8 addr;
180 u8 attr;
181 u16 packetSize;
182 u8 interval;
183 } EndpointDescriptor;
184
185 // Interface Association Descriptor
186 // Used to bind 2 interfaces together in CDC compostite device
187 typedef struct
188 {
189 u8 len; // 8
190 u8 dtype; // 11
191 u8 firstInterface;
192 u8 interfaceCount;
193 u8 functionClass;
194 u8 funtionSubClass;
195 u8 functionProtocol;
196 u8 iInterface;
197 } IADDescriptor;
198
199 // CDC CS interface descriptor
200 typedef struct
201 {
202 u8 len; // 5
203 u8 dtype; // 0x24
204 u8 subtype;
205 u8 d0;
206 u8 d1;
207 } CDCCSInterfaceDescriptor;
208
209 typedef struct
210 {
211 u8 len; // 4
212 u8 dtype; // 0x24
213 u8 subtype;
214 u8 d0;
215 } CDCCSInterfaceDescriptor4;
216
217 typedef struct
218 {
219 u8 len;
220 u8 dtype; // 0x24
221 u8 subtype; // 1
222 u8 bmCapabilities;
223 u8 bDataInterface;
224 } CMFunctionalDescriptor;
225
226 typedef struct
227 {
228 u8 len;
229 u8 dtype; // 0x24
230 u8 subtype; // 1
231 u8 bmCapabilities;
232 } ACMFunctionalDescriptor;
233
234 typedef struct
235 {
236 // IAD
237 IADDescriptor iad; // Only needed on compound device
238
239 // Control
240 InterfaceDescriptor cif; //
241 CDCCSInterfaceDescriptor header;
242 CMFunctionalDescriptor callManagement; // Call Management
243 ACMFunctionalDescriptor controlManagement; // ACM
244 CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION
245 EndpointDescriptor cifin;
246
247 // Data
248 InterfaceDescriptor dif;
249 EndpointDescriptor in;
250 EndpointDescriptor out;
251 } CDCDescriptor;
252
253 typedef struct
254 {
255 InterfaceDescriptor msc;
256 EndpointDescriptor in;
257 EndpointDescriptor out;
258 } MSCDescriptor;
259
260 typedef struct
261 {
262 u8 len; // 9
263 u8 dtype; // 0x21
264 u8 addr;
265 u8 versionL; // 0x101
266 u8 versionH; // 0x101
267 u8 country;
268 u8 desctype; // 0x22 report
269 u8 descLenL;
270 u8 descLenH;
271 } HIDDescDescriptor;
272
273 typedef struct
274 {
275 InterfaceDescriptor hid;
276 HIDDescDescriptor desc;
277 EndpointDescriptor in;
278 } HIDDescriptor;
279
280
281 #define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \
282 { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs }
283
284 #define D_CONFIG(_totalLength,_interfaces) \
285 { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) }
286
287 #define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
288 { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
289
290 #define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \
291 { 7, 5, _addr,_attr,_packetSize, _interval }
292
293 #define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \
294 { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 }
295
296 #define D_HIDREPORT(_descriptorLength) \
297 { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 }
298
299 #define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 }
300 #define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 }
301
302
303 #endif
Imprint / Impressum