source: rtos_arduino/trunk/arduino_lib/hardware/arduino/samd/cores/arduino/USB/USBCore.h@ 224

Last change on this file since 224 was 224, checked in by ertl-honda, 8 years ago

1.7.10のファイルに更新

File size: 9.5 KB
Line 
1/*
2 Copyright (c) 2014 Arduino LLC. All right reserved.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 See the GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18/*
19**Modified 04/04/2016 by Arduino.org development team
20*/
21
22
23#ifndef __USBCORE_H__
24#define __USBCORE_H__
25
26// Standard requests
27#define GET_STATUS 0
28#define CLEAR_FEATURE 1
29#define SET_FEATURE 3
30#define SET_ADDRESS 5
31#define GET_DESCRIPTOR 6
32#define SET_DESCRIPTOR 7
33#define GET_CONFIGURATION 8
34#define SET_CONFIGURATION 9
35#define GET_INTERFACE 10
36#define SET_INTERFACE 11
37
38// bEndpointAddress in Endpoint Descriptor
39#define USB_ENDPOINT_DIRECTION_MASK 0x80
40#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
41#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
42
43#define USB_ENDPOINTS 7
44
45#define USB_ENDPOINT_TYPE_MASK 0x03
46#define USB_ENDPOINT_TYPE_CONTROL 0x00
47#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
48#define USB_ENDPOINT_TYPE_BULK 0x02
49#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
50
51// bmRequestType
52#define REQUEST_HOSTTODEVICE 0x00
53#define REQUEST_DEVICETOHOST 0x80
54#define REQUEST_DIRECTION 0x80
55
56#define REQUEST_STANDARD 0x00
57#define REQUEST_CLASS 0x20
58#define REQUEST_VENDOR 0x40
59#define REQUEST_TYPE 0x60
60
61#define REQUEST_DEVICE 0x00
62#define REQUEST_INTERFACE 0x01
63#define REQUEST_ENDPOINT 0x02
64#define REQUEST_OTHER 0x03
65#define REQUEST_RECIPIENT 0x1F
66
67#define REQUEST_DEVICETOHOST_CLASS_INTERFACE (REQUEST_DEVICETOHOST | REQUEST_CLASS | REQUEST_INTERFACE)
68#define REQUEST_HOSTTODEVICE_CLASS_INTERFACE (REQUEST_HOSTTODEVICE | REQUEST_CLASS | REQUEST_INTERFACE)
69#define REQUEST_DEVICETOHOST_STANDARD_INTERFACE (REQUEST_DEVICETOHOST | REQUEST_STANDARD | REQUEST_INTERFACE)
70
71// Class requests
72
73#define CDC_SET_LINE_CODING 0x20
74#define CDC_GET_LINE_CODING 0x21
75#define CDC_SET_CONTROL_LINE_STATE 0x22
76#define CDC_SEND_BREAK 0x23
77
78#define MSC_RESET 0xFF
79#define MSC_GET_MAX_LUN 0xFE
80
81#define HID_GET_REPORT 0x01
82#define HID_GET_IDLE 0x02
83#define HID_GET_PROTOCOL 0x03
84#define HID_SET_REPORT 0x09
85#define HID_SET_IDLE 0x0A
86#define HID_SET_PROTOCOL 0x0B
87
88// Descriptors
89
90// #define USB_DEVICE_DESC_SIZE 18
91// #define USB_CONFIGUARTION_DESC_SIZE 9
92// #define USB_INTERFACE_DESC_SIZE 9
93// #define USB_ENDPOINT_DESC_SIZE 7
94
95#define USB_DEVICE_DESCRIPTOR_TYPE 1
96#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
97#define USB_STRING_DESCRIPTOR_TYPE 3
98#define USB_INTERFACE_DESCRIPTOR_TYPE 4
99#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
100#define USB_DEVICE_QUALIFIER 6
101#define USB_OTHER_SPEED_CONFIGURATION 7
102
103#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
104#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
105#define USB_DEVICE_CLASS_STORAGE 0x08
106#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
107
108#define USB_CONFIG_POWERED_MASK 0x40
109#define USB_CONFIG_BUS_POWERED 0x80
110#define USB_CONFIG_SELF_POWERED 0xC0
111#define USB_CONFIG_REMOTE_WAKEUP 0x20
112
113// bMaxPower in Configuration Descriptor
114#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
115
116#define CDC_V1_10 0x0110
117#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02
118
119#define CDC_CALL_MANAGEMENT 0x01
120#define CDC_ABSTRACT_CONTROL_MODEL 0x02
121#define CDC_HEADER 0x00
122#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02
123#define CDC_UNION 0x06
124#define CDC_CS_INTERFACE 0x24
125#define CDC_CS_ENDPOINT 0x25
126#define CDC_DATA_INTERFACE_CLASS 0x0A
127
128#define MSC_SUBCLASS_SCSI 0x06
129#define MSC_PROTOCOL_BULK_ONLY 0x50
130
131_Pragma("pack(1)")
132
133// Device
134typedef struct {
135 uint8_t len; // 18
136 uint8_t dtype; // 1 USB_DEVICE_DESCRIPTOR_TYPE
137 uint16_t usbVersion; // 0x200
138 uint8_t deviceClass;
139 uint8_t deviceSubClass;
140 uint8_t deviceProtocol;
141 uint8_t packetSize0; // Packet 0
142 uint16_t idVendor;
143 uint16_t idProduct;
144 uint16_t deviceVersion; // 0x100
145 uint8_t iManufacturer;
146 uint8_t iProduct;
147 uint8_t iSerialNumber;
148 uint8_t bNumConfigurations;
149} DeviceDescriptor;
150
151// Config
152typedef struct {
153 uint8_t len; // 9
154 uint8_t dtype; // 2
155 uint16_t clen; // total length
156 uint8_t numInterfaces;
157 uint8_t config;
158 uint8_t iconfig;
159 uint8_t attributes;
160 uint8_t maxPower;
161} ConfigDescriptor;
162
163// String
164
165// Interface
166typedef struct
167{
168 uint8_t len; // 9
169 uint8_t dtype; // 4
170 uint8_t number;
171 uint8_t alternate;
172 uint8_t numEndpoints;
173 uint8_t interfaceClass;
174 uint8_t interfaceSubClass;
175 uint8_t protocol;
176 uint8_t iInterface;
177} InterfaceDescriptor;
178
179// Endpoint
180typedef struct
181{
182 uint8_t len; // 7
183 uint8_t dtype; // 5
184 uint8_t addr;
185 uint8_t attr;
186 uint16_t packetSize;
187 uint8_t interval;
188} EndpointDescriptor;
189
190// Interface Association Descriptor
191// Used to bind 2 interfaces together in CDC compostite device
192typedef struct
193{
194 uint8_t len; // 8
195 uint8_t dtype; // 11
196 uint8_t firstInterface;
197 uint8_t interfaceCount;
198 uint8_t functionClass;
199 uint8_t funtionSubClass;
200 uint8_t functionProtocol;
201 uint8_t iInterface;
202} IADDescriptor;
203
204// CDC CS interface descriptor
205typedef struct
206{
207 uint8_t len; // 5
208 uint8_t dtype; // 0x24
209 uint8_t subtype;
210 uint8_t d0;
211 uint8_t d1;
212} CDCCSInterfaceDescriptor;
213
214typedef struct
215{
216 uint8_t len; // 4
217 uint8_t dtype; // 0x24
218 uint8_t subtype;
219 uint8_t d0;
220} CDCCSInterfaceDescriptor4;
221
222typedef struct
223{
224 uint8_t len;
225 uint8_t dtype; // 0x24
226 uint8_t subtype; // 1
227 uint8_t bmCapabilities;
228 uint8_t bDataInterface;
229} CMFunctionalDescriptor;
230
231typedef struct
232{
233 uint8_t len;
234 uint8_t dtype; // 0x24
235 uint8_t subtype; // 1
236 uint8_t bmCapabilities;
237} ACMFunctionalDescriptor;
238
239typedef struct
240{
241 // IAD
242 IADDescriptor iad; // Only needed on compound device
243 // Control
244 InterfaceDescriptor cif;
245 CDCCSInterfaceDescriptor header;
246 ACMFunctionalDescriptor controlManagement; // ACM
247 CDCCSInterfaceDescriptor functionalDescriptor; // CDC_UNION
248 CMFunctionalDescriptor callManagement; // Call Management
249 EndpointDescriptor cifin;
250
251 // Data
252 InterfaceDescriptor dif;
253 EndpointDescriptor in;
254 EndpointDescriptor out;
255} CDCDescriptor;
256
257typedef struct
258{
259 InterfaceDescriptor msc;
260 EndpointDescriptor in;
261 EndpointDescriptor out;
262} MSCDescriptor;
263
264
265typedef struct
266{
267 uint8_t len; // 9
268 uint8_t dtype; // 0x21
269 uint8_t addr;
270 uint8_t versionL; // 0x101
271 uint8_t versionH; // 0x101
272 uint8_t country;
273 uint8_t desctype; // 0x22 report
274 uint8_t descLenL;
275 uint8_t descLenH;
276} HIDDescDescriptor;
277
278typedef struct
279{
280 InterfaceDescriptor hid;
281 HIDDescDescriptor desc;
282 EndpointDescriptor in;
283} HIDDescriptor;
284
285_Pragma("pack()")
286
287#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \
288 { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs }
289/* Table 9-8. Standard Device Descriptor
290 * bLength, bDescriptorType, bcdUSB, bDeviceClass, bDeviceSubClass, bDeviceProtocol, bMaxPacketSize0,
291 * idVendor, idProduct, bcdDevice, iManufacturer, iProduct, iSerialNumber, bNumConfigurations */
292
293#define D_CONFIG(_totalLength,_interfaces) \
294 { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED, USB_CONFIG_POWER_MA(500) }
295/* Table 9-10. Standard Configuration Descriptor
296 * bLength, bDescriptorType, wTotalLength, bNumInterfaces, bConfigurationValue, iConfiguration
297 * bmAttributes, bMaxPower */
298
299#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
300 { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
301/* Table 9-12. Standard Interface Descriptor
302 * bLength, bDescriptorType, bInterfaceNumber, bAlternateSetting, bNumEndpoints, bInterfaceClass,
303 * bInterfaceSubClass, bInterfaceProtocol, iInterface */
304
305#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \
306 { 7, 5, _addr,_attr,_packetSize, _interval }
307/* Table 9-13. Standard Endpoint Descriptor
308 * bLength, bDescriptorType, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval */
309
310#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \
311 { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 }
312/* iadclasscode_r10.pdf, Table 9\96Z. Standard Interface Association Descriptor
313 * bLength, bDescriptorType, bFirstInterface, bInterfaceCount, bFunctionClass, bFunctionSubClass, bFunctionProtocol, iFunction */
314#define D_HIDREPORT(_descriptorLength) \
315 { 9, 0x21, 0x1, 0x1, 0, 1, 0x22, _descriptorLength, 0 }
316/* HID1_11.pdf E.8 HID Descriptor (Mouse)
317 * bLength, bDescriptorType, bcdHID, bCountryCode, bNumDescriptors, bDescriptorType, wItemLength */
318
319// Functional Descriptor General Format
320#define D_CDCCS(_subtype,_d0,_d1) { 5, 0x24, _subtype, _d0, _d1 }
321#define D_CDCCS4(_subtype,_d0) { 4, 0x24, _subtype, _d0 }
322/* bFunctionLength, bDescriptorType, bDescriptorSubtype, function specific data0, functional specific data N-1
323 * CS_INTERFACE 24h */
324
325#endif
Note: See TracBrowser for help on using the repository browser.