root / arduino-1.0 / hardware / arduino / cores / arduino / USBCore.h @ 58d82c77
History | View | Annotate | Download (7.67 KB)
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
|