1
// USB functions and data.
5
#include "stacks.h" // struct mutex_s
7
// Information on a USB end point.
11
struct usb_pipe *freenext;
21
// Common information for usb devices.
24
struct usb_pipe *defpipe;
26
struct usb_config_descriptor *config;
27
struct usb_interface_descriptor *iface;
33
// Common information for usb controllers.
35
struct usb_pipe *freelist;
36
struct mutex_s resetlock;
37
struct pci_device *pci;
42
// Information for enumerating USB hubs
44
struct usbhub_op_s *op;
45
struct usbdevice_s *usbdev;
55
// Hub callback (32bit) info
57
int (*detect)(struct usbhub_s *hub, u32 port);
58
int (*reset)(struct usbhub_s *hub, u32 port);
59
void (*disconnect)(struct usbhub_s *hub, u32 port);
62
#define USB_TYPE_UHCI 1
63
#define USB_TYPE_OHCI 2
64
#define USB_TYPE_EHCI 3
65
#define USB_TYPE_XHCI 4
67
#define USB_FULLSPEED 0
68
#define USB_LOWSPEED 1
69
#define USB_HIGHSPEED 2
70
#define USB_SUPERSPEED 3
72
#define USB_MAXADDR 127
75
/****************************************************************
76
* usb structs and flags
77
****************************************************************/
79
// USB mandated timings (in ms)
80
#define USB_TIME_SIGATT 100
81
#define USB_TIME_ATTDB 100
82
#define USB_TIME_DRST 10
83
#define USB_TIME_DRSTR 50
84
#define USB_TIME_RSTRCY 10
86
#define USB_TIME_STATUS 50
87
#define USB_TIME_DATAIN 500
88
#define USB_TIME_COMMAND 5000
90
#define USB_TIME_SETADDR_RECOVERY 2
92
#define USB_PID_OUT 0xe1
93
#define USB_PID_IN 0x69
94
#define USB_PID_SETUP 0x2d
96
#define USB_DIR_OUT 0 /* to device */
97
#define USB_DIR_IN 0x80 /* to host */
99
#define USB_TYPE_MASK (0x03 << 5)
100
#define USB_TYPE_STANDARD (0x00 << 5)
101
#define USB_TYPE_CLASS (0x01 << 5)
102
#define USB_TYPE_VENDOR (0x02 << 5)
103
#define USB_TYPE_RESERVED (0x03 << 5)
105
#define USB_RECIP_MASK 0x1f
106
#define USB_RECIP_DEVICE 0x00
107
#define USB_RECIP_INTERFACE 0x01
108
#define USB_RECIP_ENDPOINT 0x02
109
#define USB_RECIP_OTHER 0x03
111
#define USB_REQ_GET_STATUS 0x00
112
#define USB_REQ_CLEAR_FEATURE 0x01
113
#define USB_REQ_SET_FEATURE 0x03
114
#define USB_REQ_SET_ADDRESS 0x05
115
#define USB_REQ_GET_DESCRIPTOR 0x06
116
#define USB_REQ_SET_DESCRIPTOR 0x07
117
#define USB_REQ_GET_CONFIGURATION 0x08
118
#define USB_REQ_SET_CONFIGURATION 0x09
119
#define USB_REQ_GET_INTERFACE 0x0A
120
#define USB_REQ_SET_INTERFACE 0x0B
121
#define USB_REQ_SYNCH_FRAME 0x0C
123
struct usb_ctrlrequest {
131
#define USB_DT_DEVICE 0x01
132
#define USB_DT_CONFIG 0x02
133
#define USB_DT_STRING 0x03
134
#define USB_DT_INTERFACE 0x04
135
#define USB_DT_ENDPOINT 0x05
136
#define USB_DT_DEVICE_QUALIFIER 0x06
137
#define USB_DT_OTHER_SPEED_CONFIG 0x07
138
#define USB_DT_ENDPOINT_COMPANION 0x30
140
struct usb_device_descriptor {
155
u8 bNumConfigurations;
158
#define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */
159
#define USB_CLASS_AUDIO 1
160
#define USB_CLASS_COMM 2
161
#define USB_CLASS_HID 3
162
#define USB_CLASS_PHYSICAL 5
163
#define USB_CLASS_STILL_IMAGE 6
164
#define USB_CLASS_PRINTER 7
165
#define USB_CLASS_MASS_STORAGE 8
166
#define USB_CLASS_HUB 9
168
struct usb_config_descriptor {
174
u8 bConfigurationValue;
180
struct usb_interface_descriptor {
185
u8 bAlternateSetting;
188
u8 bInterfaceSubClass;
189
u8 bInterfaceProtocol;
193
struct usb_endpoint_descriptor {
203
#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
204
#define USB_ENDPOINT_DIR_MASK 0x80
206
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
207
#define USB_ENDPOINT_XFER_CONTROL 0
208
#define USB_ENDPOINT_XFER_ISOC 1
209
#define USB_ENDPOINT_XFER_BULK 2
210
#define USB_ENDPOINT_XFER_INT 3
211
#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
213
#define USB_CONTROL_SETUP_SIZE 8
216
/****************************************************************
217
* usb mass storage flags
218
****************************************************************/
220
#define US_SC_ATAPI_8020 0x02
221
#define US_SC_ATAPI_8070 0x05
222
#define US_SC_SCSI 0x06
224
#define US_PR_BULK 0x50 /* bulk-only transport */
225
#define US_PR_UAS 0x62 /* usb attached scsi */
227
/****************************************************************
229
****************************************************************/
232
int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize);
233
int usb_poll_intr(struct usb_pipe *pipe, void *data);
234
int usb_32bit_pipe(struct usb_pipe *pipe_fl);
235
struct usb_pipe *usb_alloc_pipe(struct usbdevice_s *usbdev
236
, struct usb_endpoint_descriptor *epdesc);
237
void usb_free_pipe(struct usbdevice_s *usbdev, struct usb_pipe *pipe);
238
int usb_send_default_control(struct usb_pipe *pipe
239
, const struct usb_ctrlrequest *req, void *data);
240
int usb_is_freelist(struct usb_s *cntl, struct usb_pipe *pipe);
241
void usb_add_freelist(struct usb_pipe *pipe);
242
struct usb_pipe *usb_get_freelist(struct usb_s *cntl, u8 eptype);
243
void usb_desc2pipe(struct usb_pipe *pipe, struct usbdevice_s *usbdev
244
, struct usb_endpoint_descriptor *epdesc);
245
int usb_get_period(struct usbdevice_s *usbdev
246
, struct usb_endpoint_descriptor *epdesc);
247
int usb_xfer_time(struct usb_pipe *pipe, int datalen);
248
struct usb_endpoint_descriptor *usb_find_desc(struct usbdevice_s *usbdev
249
, int type, int dir);
250
void usb_enumerate(struct usbhub_s *hub);
251
void usb_setup(void);