root / lab4 / .minix-src / include / minix / usb_ch9.h @ 13
History | View | Annotate | Download (6.72 KB)
1 |
#ifndef MINIX_USB_CH9_H
|
---|---|
2 |
#define MINIX_USB_CH9_H
|
3 |
/*
|
4 |
* Copyright (c) 1998 The NetBSD Foundation, Inc.
|
5 |
* All rights reserved.
|
6 |
*
|
7 |
* This code is derived from software contributed to The NetBSD Foundation
|
8 |
* by Lennart Augustsson (lennart@augustsson.net) at
|
9 |
* Carlstedt Research & Technology.
|
10 |
*
|
11 |
* Redistribution and use in source and binary forms, with or without
|
12 |
* modification, are permitted provided that the following conditions
|
13 |
* are met:
|
14 |
* 1. Redistributions of source code must retain the above copyright
|
15 |
* notice, this list of conditions and the following disclaimer.
|
16 |
* 2. Redistributions in binary form must reproduce the above copyright
|
17 |
* notice, this list of conditions and the following disclaimer in the
|
18 |
* documentation and/or other materials provided with the distribution.
|
19 |
* 3. All advertising materials mentioning features or use of this software
|
20 |
* must display the following acknowledgement:
|
21 |
* This product includes software developed by the NetBSD
|
22 |
* Foundation, Inc. and its contributors.
|
23 |
* 4. Neither the name of The NetBSD Foundation nor the names of its
|
24 |
* contributors may be used to endorse or promote products derived
|
25 |
* from this software without specific prior written permission.
|
26 |
*
|
27 |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
28 |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
29 |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
30 |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
31 |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
32 |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
33 |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
34 |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
35 |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
36 |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
37 |
* POSSIBILITY OF SUCH DAMAGE.
|
38 |
*/
|
39 |
/* USB DESCRIPTORS */
|
40 |
/*
|
41 |
* The USB records contain some unaligned little-endian word
|
42 |
* components. The U[SG]ETW macros take care of both the alignment
|
43 |
* and endian problem and should always be used to access non-byte
|
44 |
* values.
|
45 |
*/
|
46 |
|
47 |
#include <sys/types.h> |
48 |
|
49 |
typedef u8_t uByte;
|
50 |
typedef u8_t uWord[2]; |
51 |
typedef u8_t uDWord[4]; |
52 |
|
53 |
#define USETW2(w,h,l) ((w)[0] = (u_int8_t)(l), (w)[1] = (u_int8_t)(h)) |
54 |
|
55 |
#if 1 |
56 |
#define UGETW(w) ((w)[0] | ((w)[1] << 8)) |
57 |
#define USETW(w,v) ((w)[0] = (u_int8_t)(v), (w)[1] = (u_int8_t)((v) >> 8)) |
58 |
#define UGETDW(w) ((w)[0] | ((w)[1] << 8) | ((w)[2] << 16) | ((w)[3] << 24)) |
59 |
#define USETDW(w,v) ((w)[0] = (u_int8_t)(v), \ |
60 |
(w)[1] = (u_int8_t)((v) >> 8), \ |
61 |
(w)[2] = (u_int8_t)((v) >> 16), \ |
62 |
(w)[3] = (u_int8_t)((v) >> 24)) |
63 |
#else
|
64 |
/*
|
65 |
* On little-endian machines that can handle unanliged accesses
|
66 |
* (e.g. i386) these macros can be replaced by the following.
|
67 |
*/
|
68 |
#define UGETW(w) (*(u_int16_t *)(w))
|
69 |
#define USETW(w,v) (*(u_int16_t *)(w) = (v))
|
70 |
#define UGETDW(w) (*(u_int32_t *)(w))
|
71 |
#define USETDW(w,v) (*(u_int32_t *)(w) = (v))
|
72 |
#endif
|
73 |
|
74 |
#define UPACKED __attribute__((__packed__))
|
75 |
|
76 |
/* Requests */
|
77 |
#define UR_GET_STATUS 0x00 |
78 |
#define UR_CLEAR_FEATURE 0x01 |
79 |
#define UR_SET_FEATURE 0x03 |
80 |
#define UR_SET_ADDRESS 0x05 |
81 |
#define UR_GET_DESCRIPTOR 0x06 |
82 |
#define UDESC_DEVICE 0x01 |
83 |
#define UDESC_CONFIG 0x02 |
84 |
#define UDESC_STRING 0x03 |
85 |
#define USB_LANGUAGE_TABLE 0x00 /* language ID string index */ |
86 |
#define UDESC_INTERFACE 0x04 |
87 |
#define UDESC_ENDPOINT 0x05 |
88 |
#define UDESC_DEVICE_QUALIFIER 0x06 |
89 |
#define UDESC_OTHER_SPEED_CONFIGURATION 0x07 |
90 |
#define UDESC_INTERFACE_POWER 0x08 |
91 |
#define UDESC_OTG 0x09 |
92 |
#define UDESC_DEBUG 0x0A |
93 |
#define UDESC_IFACE_ASSOC 0x0B /* interface association */ |
94 |
#define UDESC_BOS 0x0F /* binary object store */ |
95 |
#define UDESC_DEVICE_CAPABILITY 0x10 |
96 |
#define UDESC_CS_DEVICE 0x21 /* class specific */ |
97 |
#define UDESC_CS_CONFIG 0x22 |
98 |
#define UDESC_CS_STRING 0x23 |
99 |
#define UDESC_CS_INTERFACE 0x24 |
100 |
#define UDESC_CS_ENDPOINT 0x25 |
101 |
#define UDESC_HUB 0x29 |
102 |
#define UDESC_ENDPOINT_SS_COMP 0x30 /* super speed */ |
103 |
#define UR_SET_DESCRIPTOR 0x07 |
104 |
#define UR_GET_CONFIG 0x08 |
105 |
#define UR_SET_CONFIG 0x09 |
106 |
#define UR_GET_INTERFACE 0x0a |
107 |
#define UR_SET_INTERFACE 0x0b |
108 |
#define UR_SYNCH_FRAME 0x0c |
109 |
#define UR_SET_SEL 0x30 |
110 |
#define UR_ISOCH_DELAY 0x31 |
111 |
|
112 |
|
113 |
|
114 |
typedef struct { |
115 |
uByte bLength; |
116 |
uByte bDescriptorType; |
117 |
uByte bDescriptorSubtype; |
118 |
} UPACKED usb_descriptor_t; |
119 |
|
120 |
|
121 |
typedef struct { |
122 |
uByte bLength; |
123 |
uByte bDescriptorType; |
124 |
uWord bcdUSB; |
125 |
#define UD_USB_2_0 0x0200 |
126 |
#define UD_IS_USB2(d) (UGETW((d)->bcdUSB) >= UD_USB_2_0)
|
127 |
uByte bDeviceClass; |
128 |
uByte bDeviceSubClass; |
129 |
uByte bDeviceProtocol; |
130 |
uByte bMaxPacketSize; |
131 |
/* The fields below are not part of the initial descriptor. */
|
132 |
uWord idVendor; |
133 |
uWord idProduct; |
134 |
uWord bcdDevice; |
135 |
uByte iManufacturer; |
136 |
uByte iProduct; |
137 |
uByte iSerialNumber; |
138 |
uByte bNumConfigurations; |
139 |
} UPACKED usb_device_descriptor_t; |
140 |
#define USB_DEVICE_DESCRIPTOR_SIZE 18 |
141 |
|
142 |
typedef struct { |
143 |
uByte bLength; |
144 |
uByte bDescriptorType; |
145 |
uWord wTotalLength; |
146 |
uByte bNumInterface; |
147 |
uByte bConfigurationValue; |
148 |
uByte iConfiguration; |
149 |
uByte bmAttributes; |
150 |
#define UC_BUS_POWERED 0x80 |
151 |
#define UC_SELF_POWERED 0x40 |
152 |
#define UC_REMOTE_WAKEUP 0x20 |
153 |
uByte bMaxPower; /* max current in 2 mA units */
|
154 |
#define UC_POWER_FACTOR 2 |
155 |
} UPACKED usb_config_descriptor_t; |
156 |
#define USB_CONFIG_DESCRIPTOR_SIZE 9 |
157 |
|
158 |
typedef struct { |
159 |
uByte bLength; |
160 |
uByte bDescriptorType; |
161 |
uByte bInterfaceNumber; |
162 |
uByte bAlternateSetting; |
163 |
uByte bNumEndpoints; |
164 |
uByte bInterfaceClass; |
165 |
uByte bInterfaceSubClass; |
166 |
uByte bInterfaceProtocol; |
167 |
uByte iInterface; |
168 |
} UPACKED usb_interface_descriptor_t; |
169 |
#define USB_INTERFACE_DESCRIPTOR_SIZE 9 |
170 |
|
171 |
typedef struct { |
172 |
uByte bLength; |
173 |
uByte bDescriptorType; |
174 |
uByte bEndpointAddress; |
175 |
#define UE_GET_DIR(a) ((a) & 0x80) |
176 |
#define UE_SET_DIR(a,d) ((a) | (((d)&1) << 7)) |
177 |
#define UE_DIR_IN 0x80 |
178 |
#define UE_DIR_OUT 0x00 |
179 |
#define UE_ADDR 0x0f |
180 |
#define UE_GET_ADDR(a) ((a) & UE_ADDR)
|
181 |
uByte bmAttributes; |
182 |
#define UE_XFERTYPE 0x03 |
183 |
#define UE_CONTROL 0x00 |
184 |
#define UE_ISOCHRONOUS 0x01 |
185 |
#define UE_BULK 0x02 |
186 |
#define UE_INTERRUPT 0x03 |
187 |
#define UE_GET_XFERTYPE(a) ((a) & UE_XFERTYPE)
|
188 |
#define UE_ISO_TYPE 0x0c |
189 |
#define UE_ISO_ASYNC 0x04 |
190 |
#define UE_ISO_ADAPT 0x08 |
191 |
#define UE_ISO_SYNC 0x0c |
192 |
#define UE_GET_ISO_TYPE(a) ((a) & UE_ISO_TYPE)
|
193 |
uWord wMaxPacketSize; |
194 |
uByte bInterval; |
195 |
} UPACKED usb_endpoint_descriptor_t; |
196 |
#define USB_ENDPOINT_DESCRIPTOR_SIZE 7 |
197 |
|
198 |
typedef struct { |
199 |
uByte bLength; |
200 |
uByte bDescriptorType; |
201 |
uWord bString[127];
|
202 |
} UPACKED usb_string_descriptor_t; |
203 |
|
204 |
#define USB_MAX_STRING_LEN 128 |
205 |
#define USB_MAX_ENCODED_STRING_LEN (USB_MAX_STRING_LEN * 3) /* UTF8 */ |
206 |
|
207 |
struct usb_device_request {
|
208 |
uByte bmRequestType; |
209 |
uByte bRequest; |
210 |
uWord wValue; |
211 |
uWord wIndex; |
212 |
uWord wLength; |
213 |
} UPACKED; |
214 |
typedef struct usb_device_request usb_device_request_t; |
215 |
|
216 |
|
217 |
#endif
|