blob: 8b2af405d917916319eaee35bf5c066d1ce50cbb [file] [log] [blame]
Kevin O'Connor114592f2009-09-28 21:32:08 -04001// USB functions and data.
2#ifndef __USB_H
3#define __USB_H
4
Kevin O'Connor8ebcac02010-03-09 19:58:23 -05005#include "util.h" // struct mutex_s
6
Kevin O'Connord28b0fe2010-03-28 15:11:19 -04007// Information on a USB end point.
Kevin O'Connor357bdfa2010-02-26 08:57:13 -05008struct usb_pipe {
Kevin O'Connor4547eb92010-02-28 02:17:28 -05009 struct usb_s *cntl;
Kevin O'Connora5f2b912010-12-31 14:35:26 -050010 u64 path;
Kevin O'Connor4547eb92010-02-28 02:17:28 -050011 u8 type;
12 u8 ep;
13 u8 devaddr;
Kevin O'Connor190cc622010-03-09 19:43:52 -050014 u8 speed;
Kevin O'Connor4547eb92010-02-28 02:17:28 -050015 u16 maxpacket;
Kevin O'Connor190cc622010-03-09 19:43:52 -050016 u8 tt_devaddr;
17 u8 tt_port;
Kevin O'Connor357bdfa2010-02-26 08:57:13 -050018};
19
Kevin O'Connor406fad62010-02-28 02:23:19 -050020// Common information for usb controllers.
Kevin O'Connor114592f2009-09-28 21:32:08 -040021struct usb_s {
Kevin O'Connor357bdfa2010-02-26 08:57:13 -050022 struct usb_pipe *defaultpipe;
Kevin O'Connor8ebcac02010-03-09 19:58:23 -050023 struct mutex_s resetlock;
Kevin O'Connor8ff8e012011-07-09 14:11:21 -040024 struct pci_device *pci;
Kevin O'Connor406fad62010-02-28 02:23:19 -050025 int busid;
26 u8 type;
27 u8 maxaddr;
Kevin O'Connor114592f2009-09-28 21:32:08 -040028};
29
Kevin O'Connord28b0fe2010-03-28 15:11:19 -040030// Information for enumerating USB hubs
31struct usbhub_s {
32 struct usbhub_op_s *op;
33 struct usb_pipe *pipe;
34 struct usb_s *cntl;
35 struct mutex_s lock;
36 u32 powerwait;
37 u32 port;
38 u32 threads;
39 u32 portcount;
40 u32 devcount;
41};
42
43// Hub callback (32bit) info
44struct usbhub_op_s {
45 int (*detect)(struct usbhub_s *hub, u32 port);
46 int (*reset)(struct usbhub_s *hub, u32 port);
47 void (*disconnect)(struct usbhub_s *hub, u32 port);
48};
49
Kevin O'Connor59f02832009-10-12 10:09:15 -040050#define USB_TYPE_UHCI 1
51#define USB_TYPE_OHCI 2
Kevin O'Connor190cc622010-03-09 19:43:52 -050052#define USB_TYPE_EHCI 3
53
54#define USB_FULLSPEED 0
55#define USB_LOWSPEED 1
56#define USB_HIGHSPEED 2
Kevin O'Connor59f02832009-10-12 10:09:15 -040057
Kevin O'Connor114592f2009-09-28 21:32:08 -040058#define USB_MAXADDR 127
59
Kevin O'Connor114592f2009-09-28 21:32:08 -040060
61/****************************************************************
62 * usb structs and flags
63 ****************************************************************/
64
Kevin O'Connor8bbc79c2010-02-14 12:16:32 -050065// USB mandated timings (in ms)
66#define USB_TIME_SIGATT 100
67#define USB_TIME_ATTDB 100
68#define USB_TIME_DRST 10
69#define USB_TIME_DRSTR 50
70#define USB_TIME_RSTRCY 10
71
72#define USB_TIME_SETADDR_RECOVERY 2
73
Kevin O'Connor114592f2009-09-28 21:32:08 -040074#define USB_PID_OUT 0xe1
75#define USB_PID_IN 0x69
76#define USB_PID_SETUP 0x2d
77
78#define USB_DIR_OUT 0 /* to device */
79#define USB_DIR_IN 0x80 /* to host */
80
81#define USB_TYPE_MASK (0x03 << 5)
82#define USB_TYPE_STANDARD (0x00 << 5)
83#define USB_TYPE_CLASS (0x01 << 5)
84#define USB_TYPE_VENDOR (0x02 << 5)
85#define USB_TYPE_RESERVED (0x03 << 5)
86
87#define USB_RECIP_MASK 0x1f
88#define USB_RECIP_DEVICE 0x00
89#define USB_RECIP_INTERFACE 0x01
90#define USB_RECIP_ENDPOINT 0x02
91#define USB_RECIP_OTHER 0x03
92
93#define USB_REQ_GET_STATUS 0x00
94#define USB_REQ_CLEAR_FEATURE 0x01
95#define USB_REQ_SET_FEATURE 0x03
96#define USB_REQ_SET_ADDRESS 0x05
97#define USB_REQ_GET_DESCRIPTOR 0x06
98#define USB_REQ_SET_DESCRIPTOR 0x07
99#define USB_REQ_GET_CONFIGURATION 0x08
100#define USB_REQ_SET_CONFIGURATION 0x09
101#define USB_REQ_GET_INTERFACE 0x0A
102#define USB_REQ_SET_INTERFACE 0x0B
103#define USB_REQ_SYNCH_FRAME 0x0C
104
105struct usb_ctrlrequest {
106 u8 bRequestType;
107 u8 bRequest;
108 u16 wValue;
109 u16 wIndex;
110 u16 wLength;
111} PACKED;
112
113#define USB_DT_DEVICE 0x01
114#define USB_DT_CONFIG 0x02
115#define USB_DT_STRING 0x03
116#define USB_DT_INTERFACE 0x04
117#define USB_DT_ENDPOINT 0x05
118#define USB_DT_DEVICE_QUALIFIER 0x06
119#define USB_DT_OTHER_SPEED_CONFIG 0x07
120
121struct usb_device_descriptor {
122 u8 bLength;
123 u8 bDescriptorType;
124
125 u16 bcdUSB;
126 u8 bDeviceClass;
127 u8 bDeviceSubClass;
128 u8 bDeviceProtocol;
129 u8 bMaxPacketSize0;
130 u16 idVendor;
131 u16 idProduct;
132 u16 bcdDevice;
133 u8 iManufacturer;
134 u8 iProduct;
135 u8 iSerialNumber;
136 u8 bNumConfigurations;
137} PACKED;
138
139#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
140#define USB_CLASS_AUDIO 1
141#define USB_CLASS_COMM 2
142#define USB_CLASS_HID 3
143#define USB_CLASS_PHYSICAL 5
144#define USB_CLASS_STILL_IMAGE 6
145#define USB_CLASS_PRINTER 7
146#define USB_CLASS_MASS_STORAGE 8
147#define USB_CLASS_HUB 9
148
149struct usb_config_descriptor {
150 u8 bLength;
151 u8 bDescriptorType;
152
153 u16 wTotalLength;
154 u8 bNumInterfaces;
155 u8 bConfigurationValue;
156 u8 iConfiguration;
157 u8 bmAttributes;
158 u8 bMaxPower;
159} PACKED;
160
161struct usb_interface_descriptor {
162 u8 bLength;
163 u8 bDescriptorType;
164
165 u8 bInterfaceNumber;
166 u8 bAlternateSetting;
167 u8 bNumEndpoints;
168 u8 bInterfaceClass;
169 u8 bInterfaceSubClass;
170 u8 bInterfaceProtocol;
171 u8 iInterface;
172} PACKED;
173
174struct usb_endpoint_descriptor {
175 u8 bLength;
176 u8 bDescriptorType;
177
178 u8 bEndpointAddress;
179 u8 bmAttributes;
180 u16 wMaxPacketSize;
181 u8 bInterval;
182} PACKED;
183
184#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
185#define USB_ENDPOINT_DIR_MASK 0x80
186
187#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
188#define USB_ENDPOINT_XFER_CONTROL 0
189#define USB_ENDPOINT_XFER_ISOC 1
190#define USB_ENDPOINT_XFER_BULK 2
191#define USB_ENDPOINT_XFER_INT 3
192#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
193
Kevin O'Connor4547eb92010-02-28 02:17:28 -0500194
195/****************************************************************
196 * function defs
197 ****************************************************************/
198
199// usb.c
200void usb_setup(void);
Kevin O'Connord28b0fe2010-03-28 15:11:19 -0400201void usb_enumerate(struct usbhub_s *hub);
Kevin O'Connor4547eb92010-02-28 02:17:28 -0500202int send_default_control(struct usb_pipe *pipe, const struct usb_ctrlrequest *req
203 , void *data);
204int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize);
205void free_pipe(struct usb_pipe *pipe);
206struct usb_pipe *alloc_bulk_pipe(struct usb_pipe *pipe
207 , struct usb_endpoint_descriptor *epdesc);
208struct usb_pipe *alloc_intr_pipe(struct usb_pipe *pipe
209 , struct usb_endpoint_descriptor *epdesc);
210int usb_poll_intr(struct usb_pipe *pipe, void *data);
211struct usb_endpoint_descriptor *findEndPointDesc(
212 struct usb_interface_descriptor *iface, int imax, int type, int dir);
213u32 mkendpFromDesc(struct usb_pipe *pipe
214 , struct usb_endpoint_descriptor *epdesc);
215
Kevin O'Connor114592f2009-09-28 21:32:08 -0400216#endif // usb.h