1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#ifndef _USB_H_
27#define _USB_H_
28
29#include <usb_defs.h>
30#include <usbdescriptors.h>
31
32
33#define USB_ALTSETTINGALLOC 4
34#define USB_MAXALTSETTING 128
35
36#define USB_MAX_DEVICE 32
37#define USB_MAXCONFIG 8
38#define USB_MAXINTERFACES 8
39#define USB_MAXENDPOINTS 16
40#define USB_MAXCHILDREN 8
41#define USB_MAX_HUB 16
42
43#define USB_CNTL_TIMEOUT 100
44
45
46struct devrequest {
47 unsigned char requesttype;
48 unsigned char request;
49 unsigned short value;
50 unsigned short index;
51 unsigned short length;
52} __attribute__ ((packed));
53
54
55struct usb_descriptor_header {
56 unsigned char bLength;
57 unsigned char bDescriptorType;
58} __attribute__ ((packed));
59
60
61struct usb_interface {
62 struct usb_interface_descriptor desc;
63
64 unsigned char no_of_ep;
65 unsigned char num_altsetting;
66 unsigned char act_altsetting;
67
68 struct usb_endpoint_descriptor ep_desc[USB_MAXENDPOINTS];
69} __attribute__ ((packed));
70
71
72struct usb_config {
73 struct usb_configuration_descriptor desc;
74
75 unsigned char no_of_if;
76 struct usb_interface if_desc[USB_MAXINTERFACES];
77} __attribute__ ((packed));
78
79enum {
80
81 PACKET_SIZE_8 = 0,
82 PACKET_SIZE_16 = 1,
83 PACKET_SIZE_32 = 2,
84 PACKET_SIZE_64 = 3,
85};
86
87struct usb_device {
88 int devnum;
89 int speed;
90 char mf[32];
91 char prod[32];
92 char serial[32];
93
94
95 int maxpacketsize;
96
97 unsigned int toggle[2];
98
99
100
101 unsigned int halted[2];
102 int epmaxpacketin[16];
103 int epmaxpacketout[16];
104
105 int configno;
106 struct usb_device_descriptor descriptor;
107 struct usb_config config;
108
109 int have_langid;
110 int string_langid;
111 int (*irq_handle)(struct usb_device *dev);
112 unsigned long irq_status;
113 int irq_act_len;
114 void *privptr;
115
116
117
118
119 unsigned long status;
120 int act_len;
121 int maxchild;
122 int portnr;
123 struct usb_device *parent;
124 struct usb_device *children[USB_MAXCHILDREN];
125};
126
127
128
129
130
131#if defined(CONFIG_USB_UHCI) || defined(CONFIG_USB_OHCI) || \
132 defined(CONFIG_USB_EHCI) || defined(CONFIG_USB_OHCI_NEW) || \
133 defined(CONFIG_USB_SL811HS) || defined(CONFIG_USB_ISP116X_HCD) || \
134 defined(CONFIG_USB_R8A66597_HCD) || defined(CONFIG_USB_DAVINCI) || \
135 defined(CONFIG_USB_OMAP3) || defined(CONFIG_USB_DA8XX) || \
136 defined(CONFIG_USB_BLACKFIN) || defined(CONFIG_USB_AM35X)
137
138int usb_lowlevel_init(void);
139int usb_lowlevel_stop(void);
140int submit_bulk_msg(struct usb_device *dev, unsigned long pipe,
141 void *buffer, int transfer_len);
142int submit_control_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
143 int transfer_len, struct devrequest *setup);
144int submit_int_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
145 int transfer_len, int interval);
146void usb_event_poll(void);
147
148
149#define USB_UHCI_VEND_ID 0x8086
150#define USB_UHCI_DEV_ID 0x7112
151
152#else
153#error USB Lowlevel not defined
154#endif
155
156#ifdef CONFIG_USB_STORAGE
157
158#define USB_MAX_STOR_DEV 5
159block_dev_desc_t *usb_stor_get_dev(int index);
160int usb_stor_scan(int mode);
161int usb_stor_info(void);
162
163#endif
164
165#ifdef CONFIG_USB_KEYBOARD
166
167int drv_usb_kbd_init(void);
168int usb_kbd_deregister(void);
169
170#endif
171
172int usb_init(void);
173int usb_stop(void);
174
175
176int usb_set_protocol(struct usb_device *dev, int ifnum, int protocol);
177int usb_set_idle(struct usb_device *dev, int ifnum, int duration,
178 int report_id);
179struct usb_device *usb_get_dev_index(int index);
180int usb_control_msg(struct usb_device *dev, unsigned int pipe,
181 unsigned char request, unsigned char requesttype,
182 unsigned short value, unsigned short index,
183 void *data, unsigned short size, int timeout);
184int usb_bulk_msg(struct usb_device *dev, unsigned int pipe,
185 void *data, int len, int *actual_length, int timeout);
186int usb_submit_int_msg(struct usb_device *dev, unsigned long pipe,
187 void *buffer, int transfer_len, int interval);
188void usb_disable_asynch(int disable);
189int usb_maxpacket(struct usb_device *dev, unsigned long pipe);
190inline void wait_ms(unsigned long ms);
191int usb_get_configuration_no(struct usb_device *dev, unsigned char *buffer,
192 int cfgno);
193int usb_get_report(struct usb_device *dev, int ifnum, unsigned char type,
194 unsigned char id, void *buf, int size);
195int usb_get_class_descriptor(struct usb_device *dev, int ifnum,
196 unsigned char type, unsigned char id, void *buf,
197 int size);
198int usb_clear_halt(struct usb_device *dev, int pipe);
199int usb_string(struct usb_device *dev, int index, char *buf, size_t size);
200int usb_set_interface(struct usb_device *dev, int interface, int alternate);
201
202
203
204#define __swap_16(x) \
205 ({ unsigned short x_ = (unsigned short)x; \
206 (unsigned short)( \
207 ((x_ & 0x00FFU) << 8) | ((x_ & 0xFF00U) >> 8)); \
208 })
209#define __swap_32(x) \
210 ({ unsigned long x_ = (unsigned long)x; \
211 (unsigned long)( \
212 ((x_ & 0x000000FFUL) << 24) | \
213 ((x_ & 0x0000FF00UL) << 8) | \
214 ((x_ & 0x00FF0000UL) >> 8) | \
215 ((x_ & 0xFF000000UL) >> 24)); \
216 })
217
218#ifdef __LITTLE_ENDIAN
219# define swap_16(x) (x)
220# define swap_32(x) (x)
221#else
222# define swap_16(x) __swap_16(x)
223# define swap_32(x) __swap_32(x)
224#endif
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261#define create_pipe(dev,endpoint) \
262 (((dev)->devnum << 8) | ((endpoint) << 15) | \
263 ((dev)->speed << 26) | (dev)->maxpacketsize)
264#define default_pipe(dev) ((dev)->speed << 26)
265
266#define usb_sndctrlpipe(dev, endpoint) ((PIPE_CONTROL << 30) | \
267 create_pipe(dev, endpoint))
268#define usb_rcvctrlpipe(dev, endpoint) ((PIPE_CONTROL << 30) | \
269 create_pipe(dev, endpoint) | \
270 USB_DIR_IN)
271#define usb_sndisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS << 30) | \
272 create_pipe(dev, endpoint))
273#define usb_rcvisocpipe(dev, endpoint) ((PIPE_ISOCHRONOUS << 30) | \
274 create_pipe(dev, endpoint) | \
275 USB_DIR_IN)
276#define usb_sndbulkpipe(dev, endpoint) ((PIPE_BULK << 30) | \
277 create_pipe(dev, endpoint))
278#define usb_rcvbulkpipe(dev, endpoint) ((PIPE_BULK << 30) | \
279 create_pipe(dev, endpoint) | \
280 USB_DIR_IN)
281#define usb_sndintpipe(dev, endpoint) ((PIPE_INTERRUPT << 30) | \
282 create_pipe(dev, endpoint))
283#define usb_rcvintpipe(dev, endpoint) ((PIPE_INTERRUPT << 30) | \
284 create_pipe(dev, endpoint) | \
285 USB_DIR_IN)
286#define usb_snddefctrl(dev) ((PIPE_CONTROL << 30) | \
287 default_pipe(dev))
288#define usb_rcvdefctrl(dev) ((PIPE_CONTROL << 30) | \
289 default_pipe(dev) | \
290 USB_DIR_IN)
291
292
293#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1)
294#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep))
295#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = \
296 ((dev)->toggle[out] & \
297 ~(1 << ep)) | ((bit) << ep))
298
299
300#define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1)
301#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
302#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
303#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
304
305#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : \
306 USB_PID_OUT)
307
308#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1)
309#define usb_pipein(pipe) (((pipe) >> 7) & 1)
310#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
311#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
312#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
313#define usb_pipedata(pipe) (((pipe) >> 19) & 1)
314#define usb_pipespeed(pipe) (((pipe) >> 26) & 3)
315#define usb_pipeslow(pipe) (usb_pipespeed(pipe) == USB_SPEED_LOW)
316#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
317#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
318#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
319#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)
320#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)
321
322
323
324
325
326struct usb_port_status {
327 unsigned short wPortStatus;
328 unsigned short wPortChange;
329} __attribute__ ((packed));
330
331struct usb_hub_status {
332 unsigned short wHubStatus;
333 unsigned short wHubChange;
334} __attribute__ ((packed));
335
336
337
338struct usb_hub_descriptor {
339 unsigned char bLength;
340 unsigned char bDescriptorType;
341 unsigned char bNbrPorts;
342 unsigned short wHubCharacteristics;
343 unsigned char bPwrOn2PwrGood;
344 unsigned char bHubContrCurrent;
345 unsigned char DeviceRemovable[(USB_MAXCHILDREN+1+7)/8];
346 unsigned char PortPowerCtrlMask[(USB_MAXCHILDREN+1+7)/8];
347
348
349} __attribute__ ((packed));
350
351
352struct usb_hub_device {
353 struct usb_device *pusb_dev;
354 struct usb_hub_descriptor desc;
355};
356
357#endif
358