20#define AUTO_POWER_CONTROL
28#define USB_CLASS_PER_INTERFACE 0
29#define USB_CLASS_AUDIO 1
30#define USB_CLASS_COMM 2
31#define USB_CLASS_HID 3
32#define USB_CLASS_PHYSICAL 5
33#define USB_CLASS_PRINTER 7
34#define USB_CLASS_MASS_STORAGE 8
35#define USB_CLASS_HUB 9
36#define USB_CLASS_DATA 10
37#define USB_CLASS_APP_SPEC 0xfe
38#define USB_CLASS_VENDOR_SPEC 0xff
43#define USB_TYPE_STANDARD (0x00 << 5)
44#define USB_TYPE_CLASS (0x01 << 5)
45#define USB_TYPE_VENDOR (0x02 << 5)
46#define USB_TYPE_RESERVED (0x03 << 5)
51#define USB_RECIP_MASK 0x1f
52#define USB_RECIP_DEVICE 0x00
53#define USB_RECIP_INTERFACE 0x01
54#define USB_RECIP_ENDPOINT 0x02
55#define USB_RECIP_OTHER 0x03
61#define USB_DIR_IN 0x80
66#define USB_DT_DEVICE 0x01
67#define USB_DT_CONFIG 0x02
68#define USB_DT_STRING 0x03
69#define USB_DT_INTERFACE 0x04
70#define USB_DT_ENDPOINT 0x05
72#define USB_DT_HID (USB_TYPE_CLASS | 0x01)
73#define USB_DT_REPORT (USB_TYPE_CLASS | 0x02)
74#define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
75#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
77#define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
78#define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
79#define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
80#define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
81#define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
87#define USB_DT_DEVICE_SIZE 18
88#define USB_DT_CONFIG_SIZE 9
89#define USB_DT_INTERFACE_SIZE 9
90#define USB_DT_ENDPOINT_SIZE 7
91#define USB_DT_ENDPOINT_AUDIO_SIZE 9
92#define USB_DT_HUB_NONVAR_SIZE 7
93#define USB_DT_HID_SIZE 9
98#define USB_ENDPOINT_NUMBER_MASK 0x0f
99#define USB_ENDPOINT_DIR_MASK 0x80
101#define USB_ENDPOINT_XFERTYPE_MASK 0x03
102#define USB_ENDPOINT_XFER_CONTROL 0
103#define USB_ENDPOINT_XFER_ISOC 1
104#define USB_ENDPOINT_XFER_BULK 2
105#define USB_ENDPOINT_XFER_INT 3
110#define USB_PID_UNDEF_0 0xf0
111#define USB_PID_OUT 0xe1
112#define USB_PID_ACK 0xd2
113#define USB_PID_DATA0 0xc3
114#define USB_PID_PING 0xb4
115#define USB_PID_SOF 0xa5
116#define USB_PID_NYET 0x96
117#define USB_PID_DATA2 0x87
118#define USB_PID_SPLIT 0x78
119#define USB_PID_IN 0x69
120#define USB_PID_NAK 0x5a
121#define USB_PID_DATA1 0x4b
122#define USB_PID_PREAMBLE 0x3c
123#define USB_PID_ERR 0x3c
124#define USB_PID_SETUP 0x2d
125#define USB_PID_STALL 0x1e
126#define USB_PID_MDATA 0x0f
131#define USB_REQ_GET_STATUS 0x00
132#define USB_REQ_CLEAR_FEATURE 0x01
133#define USB_REQ_SET_FEATURE 0x03
134#define USB_REQ_SET_ADDRESS 0x05
135#define USB_REQ_GET_DESCRIPTOR 0x06
136#define USB_REQ_SET_DESCRIPTOR 0x07
137#define USB_REQ_GET_CONFIGURATION 0x08
138#define USB_REQ_SET_CONFIGURATION 0x09
139#define USB_REQ_GET_INTERFACE 0x0A
140#define USB_REQ_SET_INTERFACE 0x0B
141#define USB_REQ_SYNCH_FRAME 0x0C
146#define USB_REQ_GET_REPORT 0x01
147#define USB_REQ_GET_IDLE 0x02
148#define USB_REQ_GET_PROTOCOL 0x03
149#define USB_REQ_SET_REPORT 0x09
150#define USB_REQ_SET_IDLE 0x0A
151#define USB_REQ_SET_PROTOCOL 0x0B
158 __packed uint8_t requesttype;
159 __packed uint8_t request;
160 __packed uint16_t
value;
161 __packed uint16_t index;
162 __packed uint16_t length;
184#define USB_MAXCONFIG 8
185#define USB_ALTSETTINGALLOC 16
186#define USB_MAXALTSETTING 128
187#define USB_MAXINTERFACES 32
188#define USB_MAXENDPOINTS 32
192typedef struct usb_descriptor_header
194 __packed uint8_t bLength;
195 __packed uint8_t bDescriptorType;
198typedef struct __attribute__((__packed__)) usb_descriptor_header
201 uint8_t bDescriptorType;
218typedef struct usb_device_descriptor
220 __packed uint8_t bLength;
221 __packed uint8_t bDescriptorType;
222 __packed uint16_t bcdUSB;
223 __packed uint8_t bDeviceClass;
224 __packed uint8_t bDeviceSubClass;
225 __packed uint8_t bDeviceProtocol;
226 __packed uint8_t bMaxPacketSize0;
227 __packed uint16_t idVendor;
228 __packed uint16_t idProduct;
229 __packed uint16_t bcdDevice;
230 __packed uint8_t iManufacturer;
231 __packed uint8_t iProduct;
232 __packed uint8_t iSerialNumber;
233 __packed uint8_t bNumConfigurations;
236typedef struct __attribute__((__packed__)) usb_device_descriptor
239 uint8_t bDescriptorType;
241 uint8_t bDeviceClass;
242 uint8_t bDeviceSubClass;
243 uint8_t bDeviceProtocol;
244 uint8_t bMaxPacketSize0;
248 uint8_t iManufacturer;
250 uint8_t iSerialNumber;
251 uint8_t bNumConfigurations;
260typedef struct usb_endpoint_descriptor
262 __packed uint8_t bLength;
263 __packed uint8_t bDescriptorType;
264 __packed uint8_t bEndpointAddress;
265 __packed uint8_t bmAttributes;
266 __packed uint16_t wMaxPacketSize;
267 __packed uint8_t bInterval;
268 __packed uint8_t bRefresh;
269 __packed uint8_t bSynchAddress;
272typedef struct __attribute__((__packed__)) usb_endpoint_descriptor
275 uint8_t bDescriptorType;
276 uint8_t bEndpointAddress;
277 uint8_t bmAttributes;
278 uint16_t wMaxPacketSize;
281 uint8_t bSynchAddress;
289typedef struct usb_interface_descriptor
291 __packed uint8_t bLength;
292 __packed uint8_t bDescriptorType;
293 __packed uint8_t bInterfaceNumber;
294 __packed uint8_t bAlternateSetting;
295 __packed uint8_t bNumEndpoints;
296 __packed uint8_t bInterfaceClass;
297 __packed uint8_t bInterfaceSubClass;
298 __packed uint8_t bInterfaceProtocol;
299 __packed uint8_t iInterface;
303typedef struct __attribute__((__packed__)) usb_interface_descriptor
306 uint8_t bDescriptorType;
307 uint8_t bInterfaceNumber;
308 uint8_t bAlternateSetting;
309 uint8_t bNumEndpoints;
310 uint8_t bInterfaceClass;
311 uint8_t bInterfaceSubClass;
312 uint8_t bInterfaceProtocol;
322typedef struct usb_config_descriptor
324 __packed uint8_t bLength;
325 __packed uint8_t bDescriptorType;
326 __packed uint16_t wTotalLength;
327 __packed uint8_t bNumInterfaces;
328 __packed uint8_t bConfigurationValue;
329 __packed uint8_t iConfiguration;
330 __packed uint8_t bmAttributes;
331 __packed uint8_t MaxPower;
334typedef struct __attribute__((__packed__)) usb_config_descriptor
337 uint8_t bDescriptorType;
338 uint16_t wTotalLength;
339 uint8_t bNumInterfaces;
340 uint8_t bConfigurationValue;
341 uint8_t iConfiguration;
342 uint8_t bmAttributes;
351typedef struct usb_string_descriptor
353 __packed uint8_t bLength;
354 __packed uint8_t bDescriptorType;
355 __packed uint16_t wData[1];
358typedef struct __attribute__((__packed__)) usb_string_descriptor
361 uint8_t bDescriptorType;
378#define USB_DEVICE_ID_MATCH_VENDOR 0x0001
379#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002
380#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004
381#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008
382#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010
383#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020
384#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040
385#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080
386#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
387#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
389#define USB_DEVICE_ID_MATCH_DEVICE (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
390#define USB_DEVICE_ID_MATCH_DEV_RANGE (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI)
391#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE)
392#define USB_DEVICE_ID_MATCH_DEV_INFO \
393 (USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL)
394#define USB_DEVICE_ID_MATCH_INT_INFO \
395 (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)
398#define USB_DEVICE(vend,prod) \
399 { USB_DEVICE_ID_MATCH_DEVICE, vend, prod, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
401#define USB_DEVICE_VER(vend,prod,lo,hi) \
402 { USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, vend, prod, lo, hi, 0, 0, 0, 0, 0, 0, 0 }
404#define USB_DEVICE_INFO(cl,sc,pr) \
405 { USB_DEVICE_ID_MATCH_DEV_INFO, 0, 0, 0, 0, cl, sc, pr, 0, 0, 0, 0 }
407#define USB_INTERFACE_INFO(cl,sc,pr) \
408 { USB_DEVICE_ID_MATCH_INT_INFO, 0, 0, 0, 0, 0, 0, 0, cl, sc, pr, 0 }
410typedef struct usb_device_id
415 uint16_t match_flags;
424 uint16_t bcdDevice_lo;
425 uint16_t bcdDevice_hi;
431 uint8_t bDeviceClass;
432 uint8_t bDeviceSubClass;
433 uint8_t bDeviceProtocol;
439 uint8_t bInterfaceClass;
440 uint8_t bInterfaceSubClass;
441 uint8_t bInterfaceProtocol;
446 uint32_t driver_info;
450typedef struct usb_driver
455 const USB_DEV_ID_T *id_table;
458 USB_LIST_T driver_list;
471#define USB_DISABLE_SPD 0x0001
472#define URB_SHORT_NOT_OK USB_DISABLE_SPD
473#define USB_ISO_ASAP 0x0002
474#define USB_ASYNC_UNLINK 0x0008
475#define USB_QUEUE_BULK 0x0010
476#define USB_NO_FSBR 0x0020
477#define USB_ZERO_PACKET 0x0040
478#define URB_NO_INTERRUPT 0x0080
480#define USB_TIMEOUT_KILLED 0x1000
482#define URB_ZERO_PACKET USB_ZERO_PACKET
483#define URB_ISO_ASAP USB_ISO_ASAP
491 struct ohci_ed_t *ed;
540#define FILL_CONTROL_URB(a,aa,b,c,d,e,f,g) \
544 (a)->setup_packet=c;\
545 (a)->transfer_buffer=d;\
546 (a)->transfer_buffer_length=e;\
552#define FILL_BULK_URB(a,aa,b,c,d,e,f) \
556 (a)->transfer_buffer=c;\
557 (a)->transfer_buffer_length=d;\
563#define FILL_INT_URB(a,aa,b,c,d,e,f,g) \
567 (a)->transfer_buffer=c;\
568 (a)->transfer_buffer_length=d;\
572 (a)->start_frame=-1;\
576#define FILL_CONTROL_URB_TO(a,aa,b,c,d,e,f,g,h) \
580 (a)->setup_packet=c;\
581 (a)->transfer_buffer=d;\
582 (a)->transfer_buffer_length=e;\
589#define FILL_BULK_URB_TO(a,aa,b,c,d,e,f,g) \
593 (a)->transfer_buffer=c;\
594 (a)->transfer_buffer_length=d;\
601typedef struct usb_operations
605 int (*get_frame_number)(
struct usb_device *usb_dev);
606 int (*submit_urb)(
URB_T *urb);
607 int (*unlink_urb)(
URB_T *urb);
611typedef struct usb_bus
619#define USB_MAXCHILDREN (4)
621typedef struct ep_info_t
626 uint8_t bEndpointAddress;
627 uint8_t bmAttributes;
629 short wMaxPacketSize;
633#define USB_SPEED_UNKNOWN 0
634#define USB_SPEED_LOW 1
635#define USB_SPEED_FULL 2
636#define USB_SPEED_HIGH 3
723#define PIPE_ISOCHRONOUS 0
724#define PIPE_INTERRUPT 1
725#define PIPE_CONTROL 2
728#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT)
730#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1)
731#define usb_pipein(pipe) (((pipe) >> 7) & 1)
732#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
733#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
734#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
735#define usb_pipedata(pipe) (((pipe) >> 19) & 1)
736#define usb_pipeslow(pipe) (((pipe) >> 26) & 1)
737#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
738#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
739#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
740#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)
741#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)
743#define PIPE_DEVEP_MASK 0x0007ff00
746#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1)
747#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep))
748#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << ep)) | ((bit) << ep))
751#define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1)
752#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
753#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
754#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
756static __inline uint32_t __create_pipe(
USB_DEV_T *dev, uint32_t endpoint)
758 return (dev->devnum << 8) | (endpoint << 15) | (dev->slow << 26);
761static __inline uint32_t __default_pipe(
USB_DEV_T *dev)
763 return (dev->slow << 26);
767#define usb_sndctrlpipe(dev,endpoint) (0x80000000 | __create_pipe(dev,endpoint))
768#define usb_rcvctrlpipe(dev,endpoint) (0x80000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
769#define usb_sndisocpipe(dev,endpoint) (0x00000000 | __create_pipe(dev,endpoint))
770#define usb_rcvisocpipe(dev,endpoint) (0x00000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
771#define usb_sndbulkpipe(dev,endpoint) (0xC0000000 | __create_pipe(dev,endpoint))
772#define usb_rcvbulkpipe(dev,endpoint) (0xC0000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
773#define usb_sndintpipe(dev,endpoint) (0x40000000 | __create_pipe(dev,endpoint))
774#define usb_rcvintpipe(dev,endpoint) (0x40000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
775#define usb_snddefctrl(dev) (0x80000000 | __default_pipe(dev))
776#define usb_rcvdefctrl(dev) (0x80000000 | __default_pipe(dev) | USB_DIR_IN)
779extern USB_LIST_T usb_driver_list;
780extern USB_LIST_T usb_bus_list;
785extern USB_BUS_T g_ohci_bus;
809extern int32_t
USBH_SendCtrlMsg(
USB_DEV_T *dev, uint32_t pipe, uint8_t request, uint8_t requesttype, uint16_t
value, uint16_t index,
void *data, uint16_t size,
int timeout);
832extern int usbh_init_ohci(
void);
833extern int usbh_init_hub_driver(
void);
834extern void ohci_irq(
void);
835extern void ohci_int_timer_do(
int);
838extern void usbh_connect_device(
USB_DEV_T *dev);
839extern void usbh_disconnect_device(
USB_DEV_T **pdev);
840extern int usbh_settle_new_device(
USB_DEV_T *dev);
842extern int usb_maxpacket(
USB_DEV_T *dev, uint32_t pipe,
int out);
852extern struct ohci_itd_t * ohci_alloc_idd(
void);
853extern void ohci_free_itd(
struct ohci_itd_t *itd_p);
855extern int usbh_translate_string(
USB_DEV_T *dev,
int index,
char *buf,
int size);
861extern void usbh_dump_urb(
URB_T *purb);
862extern void usbh_print_usb_string(
USB_DEV_T *dev,
char *
id,
int index);
URB_T * USBH_AllocUrb(void)
Allocate an URB from USB Core driver internal URB pool.
int32_t USBH_RegisterDriver(USB_DRIVER_T *new_driver)
Register a device driver to USB Host Core driver.
int32_t USBH_SubmitUrb(URB_T *urb)
Submit an URB to USB core for transfer data.
int32_t USBH_SendBulkMsg(USB_DEV_T *usb_dev, uint32_t pipe, void *data, int len, int *actual_length, int timeout)
Execute a bulk transfer.
int32_t USBH_Resume(void)
Resume USB Host controller and devices.
int32_t USBH_Close(void)
Disable USB Host controller function.
int transfer_buffer_length
int32_t USBH_Suspend(void)
Suspend USB Host Controller and devices.
EP_INFO_T ep_list[MAX_ENDPOINTS]
int32_t USBH_UnlinkUrb(URB_T *urb)
Cancel an URB which has been submit to USB core.
struct usb_device * children[USB_MAXCHILDREN]
USB_DEV_DESC_T descriptor
int32_t USBH_Open(void)
Open USB Host controller function.
int32_t USBH_SetInterface(USB_DEV_T *dev, char interface, char alternate)
Set USB device interface.
int32_t USBH_GetDescriptor(USB_DEV_T *dev, uint8_t type, uint8_t index, void *buf, int size)
Get a descriptor from device.
USB_DRIVER_T * driver[MAX_DRIVER_PER_DEV]
ISO_PACKET_DESCRIPTOR_T iso_frame_desc[8]
void USBH_FreeUrb(URB_T *)
Free the URB allocated from USBH_AllocUrb()
int32_t USBH_ClearHalt(USB_DEV_T *dev, int pipe)
Clear the halt state of an endpoint.
void(* complete)(struct urb_t *)
int USBH_ProcessHubEvents(void)
Processed USB hub device events. User application must invoke this routine in the main while loop....
struct usb_device * parent
int32_t USBH_SetConfiguration(USB_DEV_T *dev, int configuration)
Select USB device configuration.
int32_t USBH_SendCtrlMsg(USB_DEV_T *dev, uint32_t pipe, uint8_t request, uint8_t requesttype, uint16_t value, uint16_t index, void *data, uint16_t size, int timeout)
Execute a control transfer.
USB Host core configuration file.
#define MAX_TD_PER_OHCI_URB
#define MAX_DRIVER_PER_DEV
HIDDEN_SYMBOLS struct __attribute__((__packed__))
HIDDEN_SYMBOLS struct usb_device USB_DEV_T
void usbh_free_device(USB_DEV_T *dev)
void ohci_free_td(TD_T *td_p)
TD_T * ohci_alloc_td(USB_DEV_T *dev)
HIDDEN_SYMBOLS void usbh_init_memory()
void ohci_free_ed(ED_T *ed_p)
USB_DEV_T * usbh_alloc_device(USB_DEV_T *parent, USB_BUS_T *bus)
void usbh_mdelay(uint32_t msec)
void usbh_free_dev_urbs(USB_DEV_T *dev)
void ohci_free_dev_td(USB_DEV_T *dev)