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

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

ライブラリとOS及びベーシックなサンプルの追加.

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