1 // USB functions and data. 2 #ifndef __USB_H 3 #define __USB_H 4 5 #include "stacks.h" // struct mutex_s 6 7 // Information on a USB end point. 8 struct usb_pipe { 9 union { 10 struct usb_s *cntl; 11 struct usb_pipe *freenext; 12 }; 13 u8 type; 14 u8 ep; 15 u8 devaddr; 16 u8 speed; 17 u16 maxpacket; 18 u8 eptype; 19 }; 20 21 // Common information for usb devices. 22 struct usbdevice_s { 23 struct usbhub_s *hub; 24 struct usb_pipe *defpipe; 25 u32 port; 26 struct usb_config_descriptor *config; 27 struct usb_interface_descriptor *iface; 28 int imax; 29 u8 speed; 30 u8 devaddr; 31 }; 32 33 // Common information for usb controllers. 34 struct usb_s { 35 struct usb_pipe *freelist; 36 struct mutex_s resetlock; 37 struct pci_device *pci; 38 u8 type; 39 u8 maxaddr; 40 }; 41 42 // Information for enumerating USB hubs 43 struct usbhub_s { 44 struct usbhub_op_s *op; 45 struct usbdevice_s *usbdev; 46 struct usb_s *cntl; 47 struct mutex_s lock; 48 u32 detectend; 49 u32 port; 50 u32 threads; 51 u32 portcount; 52 u32 devcount; 53 }; 54 55 // Hub callback (32bit) info 56 struct usbhub_op_s { 57 int (*detect)(struct usbhub_s *hub, u32 port); 58 int (*reset)(struct usbhub_s *hub, u32 port); 59 int (*portmap)(struct usbhub_s *hub, u32 port); 60 void (*disconnect)(struct usbhub_s *hub, u32 port); 61 }; 62 63 #define USB_TYPE_UHCI 1 64 #define USB_TYPE_OHCI 2 65 #define USB_TYPE_EHCI 3 66 #define USB_TYPE_XHCI 4 67 68 #define USB_FULLSPEED 0 69 #define USB_LOWSPEED 1 70 #define USB_HIGHSPEED 2 71 #define USB_SUPERSPEED 3 72 73 #define USB_MAXADDR 127 74 75 76 /**************************************************************** 77 * usb structs and flags 78 ****************************************************************/ 79 80 // USB mandated timings (in ms) 81 #define USB_TIME_SIGATT 100 82 #define USB_TIME_ATTDB 100 83 #define USB_TIME_DRST 10 84 #define USB_TIME_DRSTR 50 85 #define USB_TIME_RSTRCY 10 86 87 #define USB_TIME_STATUS 50 88 #define USB_TIME_DATAIN 500 89 #define USB_TIME_COMMAND 5000 90 91 #define USB_TIME_SETADDR_RECOVERY 2 92 93 #define USB_PID_OUT 0xe1 94 #define USB_PID_IN 0x69 95 #define USB_PID_SETUP 0x2d 96 97 #define USB_DIR_OUT 0 /* to device */ 98 #define USB_DIR_IN 0x80 /* to host */ 99 100 #define USB_TYPE_MASK (0x03 << 5) 101 #define USB_TYPE_STANDARD (0x00 << 5) 102 #define USB_TYPE_CLASS (0x01 << 5) 103 #define USB_TYPE_VENDOR (0x02 << 5) 104 #define USB_TYPE_RESERVED (0x03 << 5) 105 106 #define USB_RECIP_MASK 0x1f 107 #define USB_RECIP_DEVICE 0x00 108 #define USB_RECIP_INTERFACE 0x01 109 #define USB_RECIP_ENDPOINT 0x02 110 #define USB_RECIP_OTHER 0x03 111 112 #define USB_REQ_GET_STATUS 0x00 113 #define USB_REQ_CLEAR_FEATURE 0x01 114 #define USB_REQ_SET_FEATURE 0x03 115 #define USB_REQ_SET_ADDRESS 0x05 116 #define USB_REQ_GET_DESCRIPTOR 0x06 117 #define USB_REQ_SET_DESCRIPTOR 0x07 118 #define USB_REQ_GET_CONFIGURATION 0x08 119 #define USB_REQ_SET_CONFIGURATION 0x09 120 #define USB_REQ_GET_INTERFACE 0x0A 121 #define USB_REQ_SET_INTERFACE 0x0B 122 #define USB_REQ_SYNCH_FRAME 0x0C 123 124 struct usb_ctrlrequest { 125 u8 bRequestType; 126 u8 bRequest; 127 u16 wValue; 128 u16 wIndex; 129 u16 wLength; 130 } PACKED; 131 132 #define USB_DT_DEVICE 0x01 133 #define USB_DT_CONFIG 0x02 134 #define USB_DT_STRING 0x03 135 #define USB_DT_INTERFACE 0x04 136 #define USB_DT_ENDPOINT 0x05 137 #define USB_DT_DEVICE_QUALIFIER 0x06 138 #define USB_DT_OTHER_SPEED_CONFIG 0x07 139 #define USB_DT_ENDPOINT_COMPANION 0x30 140 141 struct usb_device_descriptor { 142 u8 bLength; 143 u8 bDescriptorType; 144 145 u16 bcdUSB; 146 u8 bDeviceClass; 147 u8 bDeviceSubClass; 148 u8 bDeviceProtocol; 149 u8 bMaxPacketSize0; 150 u16 idVendor; 151 u16 idProduct; 152 u16 bcdDevice; 153 u8 iManufacturer; 154 u8 iProduct; 155 u8 iSerialNumber; 156 u8 bNumConfigurations; 157 } PACKED; 158 159 #define USB_CLASS_PER_INTERFACE 0 /* for DeviceClass */ 160 #define USB_CLASS_AUDIO 1 161 #define USB_CLASS_COMM 2 162 #define USB_CLASS_HID 3 163 #define USB_CLASS_PHYSICAL 5 164 #define USB_CLASS_STILL_IMAGE 6 165 #define USB_CLASS_PRINTER 7 166 #define USB_CLASS_MASS_STORAGE 8 167 #define USB_CLASS_HUB 9 168 169 struct usb_config_descriptor { 170 u8 bLength; 171 u8 bDescriptorType; 172 173 u16 wTotalLength; 174 u8 bNumInterfaces; 175 u8 bConfigurationValue; 176 u8 iConfiguration; 177 u8 bmAttributes; 178 u8 bMaxPower; 179 } PACKED; 180 181 struct usb_interface_descriptor { 182 u8 bLength; 183 u8 bDescriptorType; 184 185 u8 bInterfaceNumber; 186 u8 bAlternateSetting; 187 u8 bNumEndpoints; 188 u8 bInterfaceClass; 189 u8 bInterfaceSubClass; 190 u8 bInterfaceProtocol; 191 u8 iInterface; 192 } PACKED; 193 194 struct usb_endpoint_descriptor { 195 u8 bLength; 196 u8 bDescriptorType; 197 198 u8 bEndpointAddress; 199 u8 bmAttributes; 200 u16 wMaxPacketSize; 201 u8 bInterval; 202 } PACKED; 203 204 #define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */ 205 #define USB_ENDPOINT_DIR_MASK 0x80 206 207 #define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */ 208 #define USB_ENDPOINT_XFER_CONTROL 0 209 #define USB_ENDPOINT_XFER_ISOC 1 210 #define USB_ENDPOINT_XFER_BULK 2 211 #define USB_ENDPOINT_XFER_INT 3 212 #define USB_ENDPOINT_MAX_ADJUSTABLE 0x80 213 214 #define USB_CONTROL_SETUP_SIZE 8 215 216 217 /**************************************************************** 218 * usb mass storage flags 219 ****************************************************************/ 220 221 #define US_SC_ATAPI_8020 0x02 222 #define US_SC_ATAPI_8070 0x05 223 #define US_SC_SCSI 0x06 224 225 #define US_PR_BULK 0x50 /* bulk-only transport */ 226 #define US_PR_UAS 0x62 /* usb attached scsi */ 227 228 /**************************************************************** 229 * function defs 230 ****************************************************************/ 231 232 // usb.c 233 int usb_send_bulk(struct usb_pipe *pipe, int dir, void *data, int datasize); 234 int usb_poll_intr(struct usb_pipe *pipe, void *data); 235 int usb_32bit_pipe(struct usb_pipe *pipe_fl); 236 struct usb_pipe *usb_alloc_pipe(struct usbdevice_s *usbdev 237 , struct usb_endpoint_descriptor *epdesc); 238 void usb_free_pipe(struct usbdevice_s *usbdev, struct usb_pipe *pipe); 239 int usb_send_default_control(struct usb_pipe *pipe 240 , const struct usb_ctrlrequest *req, void *data); 241 int usb_is_freelist(struct usb_s *cntl, struct usb_pipe *pipe); 242 void usb_add_freelist(struct usb_pipe *pipe); 243 struct usb_pipe *usb_get_freelist(struct usb_s *cntl, u8 eptype); 244 void usb_desc2pipe(struct usb_pipe *pipe, struct usbdevice_s *usbdev 245 , struct usb_endpoint_descriptor *epdesc); 246 int usb_get_period(struct usbdevice_s *usbdev 247 , struct usb_endpoint_descriptor *epdesc); 248 int usb_xfer_time(struct usb_pipe *pipe, int datalen); 249 struct usb_endpoint_descriptor *usb_find_desc(struct usbdevice_s *usbdev 250 , int type, int dir); 251 void usb_enumerate(struct usbhub_s *hub); 252 void usb_setup(void); 253 254 #endif // usb.h 255