source: arduino-1-6-7/trunk/fuentes/arduino-ide-amd64/hardware/arduino/avr/cores/arduino/USBCore.h @ 46

Last change on this file since 46 was 46, checked in by jrpelegrina, 4 years ago

First release to Xenial

File size: 7.5 KB
Line 
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#include "USBAPI.h"
22
23//      Standard requests
24#define GET_STATUS                      0
25#define CLEAR_FEATURE           1
26#define SET_FEATURE                     3
27#define SET_ADDRESS                     5
28#define GET_DESCRIPTOR          6
29#define SET_DESCRIPTOR          7
30#define GET_CONFIGURATION       8
31#define SET_CONFIGURATION       9
32#define GET_INTERFACE           10
33#define SET_INTERFACE           11
34
35
36// bmRequestType
37#define REQUEST_HOSTTODEVICE    0x00
38#define REQUEST_DEVICETOHOST    0x80
39#define REQUEST_DIRECTION               0x80
40
41#define REQUEST_STANDARD                0x00
42#define REQUEST_CLASS                   0x20
43#define REQUEST_VENDOR                  0x40
44#define REQUEST_TYPE                    0x60
45
46#define REQUEST_DEVICE                  0x00
47#define REQUEST_INTERFACE               0x01
48#define REQUEST_ENDPOINT                0x02
49#define REQUEST_OTHER                   0x03
50#define REQUEST_RECIPIENT               0x03
51
52#define REQUEST_DEVICETOHOST_CLASS_INTERFACE    (REQUEST_DEVICETOHOST | REQUEST_CLASS | REQUEST_INTERFACE)
53#define REQUEST_HOSTTODEVICE_CLASS_INTERFACE    (REQUEST_HOSTTODEVICE | REQUEST_CLASS | REQUEST_INTERFACE)
54#define REQUEST_DEVICETOHOST_STANDARD_INTERFACE (REQUEST_DEVICETOHOST | REQUEST_STANDARD | REQUEST_INTERFACE)
55
56//      Class requests
57
58#define CDC_SET_LINE_CODING                     0x20
59#define CDC_GET_LINE_CODING                     0x21
60#define CDC_SET_CONTROL_LINE_STATE      0x22
61#define CDC_SEND_BREAK                          0x23
62
63#define MSC_RESET                                       0xFF
64#define MSC_GET_MAX_LUN                         0xFE
65
66//      Descriptors
67
68#define USB_DEVICE_DESC_SIZE 18
69#define USB_CONFIGUARTION_DESC_SIZE 9
70#define USB_INTERFACE_DESC_SIZE 9
71#define USB_ENDPOINT_DESC_SIZE 7
72
73#define USB_DEVICE_DESCRIPTOR_TYPE             1
74#define USB_CONFIGURATION_DESCRIPTOR_TYPE      2
75#define USB_STRING_DESCRIPTOR_TYPE             3
76#define USB_INTERFACE_DESCRIPTOR_TYPE          4
77#define USB_ENDPOINT_DESCRIPTOR_TYPE           5
78
79// usb_20.pdf Table 9.6 Standard Feature Selectors
80#define DEVICE_REMOTE_WAKEUP                   1
81#define ENDPOINT_HALT                          2
82#define TEST_MODE                              3
83
84// usb_20.pdf Figure 9-4. Information Returned by a GetStatus() Request to a Device
85#define FEATURE_SELFPOWERED_ENABLED     (1 << 0)
86#define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1)
87
88#define USB_DEVICE_CLASS_COMMUNICATIONS        0x02
89#define USB_DEVICE_CLASS_HUMAN_INTERFACE       0x03
90#define USB_DEVICE_CLASS_STORAGE               0x08
91#define USB_DEVICE_CLASS_VENDOR_SPECIFIC       0xFF
92
93#define USB_CONFIG_POWERED_MASK                0x40
94#define USB_CONFIG_BUS_POWERED                 0x80
95#define USB_CONFIG_SELF_POWERED                0xC0
96#define USB_CONFIG_REMOTE_WAKEUP               0x20
97
98// bMaxPower in Configuration Descriptor
99#define USB_CONFIG_POWER_MA(mA)                ((mA)/2)
100
101// bEndpointAddress in Endpoint Descriptor
102#define USB_ENDPOINT_DIRECTION_MASK            0x80
103#define USB_ENDPOINT_OUT(addr)                 (lowByte((addr) | 0x00))
104#define USB_ENDPOINT_IN(addr)                  (lowByte((addr) | 0x80))
105
106#define USB_ENDPOINT_TYPE_MASK                 0x03
107#define USB_ENDPOINT_TYPE_CONTROL              0x00
108#define USB_ENDPOINT_TYPE_ISOCHRONOUS          0x01
109#define USB_ENDPOINT_TYPE_BULK                 0x02
110#define USB_ENDPOINT_TYPE_INTERRUPT            0x03
111
112#define TOBYTES(x) ((x) & 0xFF),(((x) >> 8) & 0xFF)
113
114#define CDC_V1_10                               0x0110
115#define CDC_COMMUNICATION_INTERFACE_CLASS       0x02
116
117#define CDC_CALL_MANAGEMENT                     0x01
118#define CDC_ABSTRACT_CONTROL_MODEL              0x02
119#define CDC_HEADER                              0x00
120#define CDC_ABSTRACT_CONTROL_MANAGEMENT         0x02
121#define CDC_UNION                               0x06
122#define CDC_CS_INTERFACE                        0x24
123#define CDC_CS_ENDPOINT                         0x25
124#define CDC_DATA_INTERFACE_CLASS                0x0A
125
126#define MSC_SUBCLASS_SCSI                                               0x06
127#define MSC_PROTOCOL_BULK_ONLY                                  0x50
128
129//      Device
130typedef struct {
131        u8 len;                         // 18
132        u8 dtype;                       // 1 USB_DEVICE_DESCRIPTOR_TYPE
133        u16 usbVersion;         // 0x200
134        u8      deviceClass;
135        u8      deviceSubClass;
136        u8      deviceProtocol;
137        u8      packetSize0;    // Packet 0
138        u16     idVendor;
139        u16     idProduct;
140        u16     deviceVersion;  // 0x100
141        u8      iManufacturer;
142        u8      iProduct;
143        u8      iSerialNumber;
144        u8      bNumConfigurations;
145} DeviceDescriptor;
146
147//      Config
148typedef struct {
149        u8      len;                    // 9
150        u8      dtype;                  // 2
151        u16 clen;                       // total length
152        u8      numInterfaces;
153        u8      config;
154        u8      iconfig;
155        u8      attributes;
156        u8      maxPower;
157} ConfigDescriptor;
158
159//      String
160
161//      Interface
162typedef struct
163{
164        u8 len;         // 9
165        u8 dtype;       // 4
166        u8 number;
167        u8 alternate;
168        u8 numEndpoints;
169        u8 interfaceClass;
170        u8 interfaceSubClass;
171        u8 protocol;
172        u8 iInterface;
173} InterfaceDescriptor;
174
175//      Endpoint
176typedef struct
177{
178        u8 len;         // 7
179        u8 dtype;       // 5
180        u8 addr;
181        u8 attr;
182        u16 packetSize;
183        u8 interval;
184} EndpointDescriptor;
185
186// Interface Association Descriptor
187// Used to bind 2 interfaces together in CDC compostite device
188typedef struct
189{
190        u8 len;                         // 8
191        u8 dtype;                       // 11
192        u8 firstInterface;
193        u8 interfaceCount;
194        u8 functionClass;
195        u8 funtionSubClass;
196        u8 functionProtocol;
197        u8 iInterface;
198} IADDescriptor;
199
200//      CDC CS interface descriptor
201typedef struct
202{
203        u8 len;         // 5
204        u8 dtype;       // 0x24
205        u8 subtype;
206        u8 d0;
207        u8 d1;
208} CDCCSInterfaceDescriptor;
209
210typedef struct
211{
212        u8 len;         // 4
213        u8 dtype;       // 0x24
214        u8 subtype;
215        u8 d0;
216} CDCCSInterfaceDescriptor4;
217
218typedef struct 
219{
220    u8  len;
221    u8  dtype;          // 0x24
222    u8  subtype;        // 1
223    u8  bmCapabilities;
224    u8  bDataInterface;
225} CMFunctionalDescriptor;
226       
227typedef struct 
228{
229    u8  len;
230    u8  dtype;          // 0x24
231    u8  subtype;        // 1
232    u8  bmCapabilities;
233} ACMFunctionalDescriptor;
234
235typedef struct 
236{
237        //      IAD
238        IADDescriptor                           iad;    // Only needed on compound device
239
240        //      Control
241        InterfaceDescriptor                     cif;    //
242        CDCCSInterfaceDescriptor        header;
243        CMFunctionalDescriptor          callManagement;                 // Call Management
244        ACMFunctionalDescriptor         controlManagement;              // ACM
245        CDCCSInterfaceDescriptor        functionalDescriptor;   // CDC_UNION
246        EndpointDescriptor                      cifin;
247
248        //      Data
249        InterfaceDescriptor                     dif;
250        EndpointDescriptor                      in;
251        EndpointDescriptor                      out;
252} CDCDescriptor;
253
254typedef struct 
255{
256        InterfaceDescriptor                     msc;
257        EndpointDescriptor                      in;
258        EndpointDescriptor                      out;
259} MSCDescriptor;
260
261
262#define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs) \
263        { 18, 1, 0x200, _class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_configs }
264
265#define D_CONFIG(_totalLength,_interfaces) \
266        { 9, 2, _totalLength,_interfaces, 1, 0, USB_CONFIG_BUS_POWERED | USB_CONFIG_REMOTE_WAKEUP, USB_CONFIG_POWER_MA(500) }
267
268#define D_INTERFACE(_n,_numEndpoints,_class,_subClass,_protocol) \
269        { 9, 4, _n, 0, _numEndpoints, _class,_subClass, _protocol, 0 }
270
271#define D_ENDPOINT(_addr,_attr,_packetSize, _interval) \
272        { 7, 5, _addr,_attr,_packetSize, _interval }
273
274#define D_IAD(_firstInterface, _count, _class, _subClass, _protocol) \
275        { 8, 11, _firstInterface, _count, _class, _subClass, _protocol, 0 }
276
277#define D_CDCCS(_subtype,_d0,_d1)       { 5, 0x24, _subtype, _d0, _d1 }
278#define D_CDCCS4(_subtype,_d0)          { 4, 0x24, _subtype, _d0 }
279
280
281#endif
Note: See TracBrowser for help on using the repository browser.