1 // USB functions and data.
5 #include "util.h" // struct mutex_s
7 // Information on a USB end point.
20 // Common information for usb controllers.
22 struct usb_pipe *defaultpipe;
23 struct mutex_s resetlock;
24 struct pci_device *pci;
30 // Information for enumerating USB hubs
32 struct usbhub_op_s *op;
33 struct usb_pipe *pipe;
43 // Hub callback (32bit) info
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);
50 #define USB_TYPE_UHCI 1
51 #define USB_TYPE_OHCI 2
52 #define USB_TYPE_EHCI 3
54 #define USB_FULLSPEED 0
55 #define USB_LOWSPEED 1
56 #define USB_HIGHSPEED 2
58 #define USB_MAXADDR 127
61 /****************************************************************
62 * usb structs and flags
63 ****************************************************************/
65 // 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
72 #define USB_TIME_SETADDR_RECOVERY 2
74 #define USB_PID_OUT 0xe1
75 #define USB_PID_IN 0x69
76 #define USB_PID_SETUP 0x2d
78 #define USB_DIR_OUT 0 /* to device */
79 #define USB_DIR_IN 0x80 /* to host */
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)
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
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
105 struct usb_ctrlrequest {
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
121 struct usb_device_descriptor {
136 u8 bNumConfigurations;
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
149 struct usb_config_descriptor {
155 u8 bConfigurationValue;
161 struct usb_interface_descriptor {
166 u8 bAlternateSetting;
169 u8 bInterfaceSubClass;
170 u8 bInterfaceProtocol;
174 struct usb_endpoint_descriptor {
184 #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
185 #define USB_ENDPOINT_DIR_MASK 0x80
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
195 /****************************************************************
197 ****************************************************************/
200 void usb_setup(void);
201 void usb_enumerate(struct usbhub_s *hub);
202 int send_default_control(struct usb_pipe *pipe, const struct usb_ctrlrequest *req
204 int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize);
205 void free_pipe(struct usb_pipe *pipe);
206 struct usb_pipe *alloc_bulk_pipe(struct usb_pipe *pipe
207 , struct usb_endpoint_descriptor *epdesc);
208 struct usb_pipe *alloc_intr_pipe(struct usb_pipe *pipe
209 , struct usb_endpoint_descriptor *epdesc);
210 int usb_poll_intr(struct usb_pipe *pipe, void *data);
211 struct usb_endpoint_descriptor *findEndPointDesc(
212 struct usb_interface_descriptor *iface, int imax, int type, int dir);
213 u32 mkendpFromDesc(struct usb_pipe *pipe
214 , struct usb_endpoint_descriptor *epdesc);