35#define USB_CLASS_PER_INTERFACE 0
36#define USB_CLASS_AUDIO 1
37#define USB_CLASS_COMM 2
38#define USB_CLASS_HID 3
39#define USB_CLASS_PHYSICAL 5
40#define USB_CLASS_PRINTER 7
41#define USB_CLASS_MASS_STORAGE 8
42#define USB_CLASS_HUB 9
43#define USB_CLASS_DATA 10
44#define USB_CLASS_APP_SPEC 0xfe
45#define USB_CLASS_VENDOR_SPEC 0xff
50#define USB_TYPE_STANDARD (0x00 << 5)
51#define USB_TYPE_CLASS (0x01 << 5)
52#define USB_TYPE_VENDOR (0x02 << 5)
53#define USB_TYPE_RESERVED (0x03 << 5)
58#define USB_RECIP_MASK 0x1f
59#define USB_RECIP_DEVICE 0x00
60#define USB_RECIP_INTERFACE 0x01
61#define USB_RECIP_ENDPOINT 0x02
62#define USB_RECIP_OTHER 0x03
68#define USB_DIR_IN 0x80
73#define USB_DT_DEVICE 0x01
74#define USB_DT_CONFIG 0x02
75#define USB_DT_STRING 0x03
76#define USB_DT_INTERFACE 0x04
77#define USB_DT_ENDPOINT 0x05
79#define USB_DT_HID (USB_TYPE_CLASS | 0x01)
80#define USB_DT_REPORT (USB_TYPE_CLASS | 0x02)
81#define USB_DT_PHYSICAL (USB_TYPE_CLASS | 0x03)
82#define USB_DT_HUB (USB_TYPE_CLASS | 0x09)
84#define USB_DT_CS_DEVICE (USB_TYPE_CLASS | USB_DT_DEVICE)
85#define USB_DT_CS_CONFIG (USB_TYPE_CLASS | USB_DT_CONFIG)
86#define USB_DT_CS_STRING (USB_TYPE_CLASS | USB_DT_STRING)
87#define USB_DT_CS_INTERFACE (USB_TYPE_CLASS | USB_DT_INTERFACE)
88#define USB_DT_CS_ENDPOINT (USB_TYPE_CLASS | USB_DT_ENDPOINT)
94#define USB_DT_DEVICE_SIZE 18
95#define USB_DT_CONFIG_SIZE 9
96#define USB_DT_INTERFACE_SIZE 9
97#define USB_DT_ENDPOINT_SIZE 7
98#define USB_DT_ENDPOINT_AUDIO_SIZE 9
99#define USB_DT_HUB_NONVAR_SIZE 7
100#define USB_DT_HID_SIZE 9
105#define USB_ENDPOINT_NUMBER_MASK 0x0f
106#define USB_ENDPOINT_DIR_MASK 0x80
108#define USB_ENDPOINT_XFERTYPE_MASK 0x03
109#define USB_ENDPOINT_XFER_CONTROL 0
110#define USB_ENDPOINT_XFER_ISOC 1
111#define USB_ENDPOINT_XFER_BULK 2
112#define USB_ENDPOINT_XFER_INT 3
117#define USB_PID_UNDEF_0 0xf0
118#define USB_PID_OUT 0xe1
119#define USB_PID_ACK 0xd2
120#define USB_PID_DATA0 0xc3
121#define USB_PID_PING 0xb4
122#define USB_PID_SOF 0xa5
123#define USB_PID_NYET 0x96
124#define USB_PID_DATA2 0x87
125#define USB_PID_SPLIT 0x78
126#define USB_PID_IN 0x69
127#define USB_PID_NAK 0x5a
128#define USB_PID_DATA1 0x4b
129#define USB_PID_PREAMBLE 0x3c
130#define USB_PID_ERR 0x3c
131#define USB_PID_SETUP 0x2d
132#define USB_PID_STALL 0x1e
133#define USB_PID_MDATA 0x0f
138#define USB_REQ_GET_STATUS 0x00
139#define USB_REQ_CLEAR_FEATURE 0x01
140#define USB_REQ_SET_FEATURE 0x03
141#define USB_REQ_SET_ADDRESS 0x05
142#define USB_REQ_GET_DESCRIPTOR 0x06
143#define USB_REQ_SET_DESCRIPTOR 0x07
144#define USB_REQ_GET_CONFIGURATION 0x08
145#define USB_REQ_SET_CONFIGURATION 0x09
146#define USB_REQ_GET_INTERFACE 0x0A
147#define USB_REQ_SET_INTERFACE 0x0B
148#define USB_REQ_SYNCH_FRAME 0x0C
153#define USB_REQ_GET_REPORT 0x01
154#define USB_REQ_GET_IDLE 0x02
155#define USB_REQ_GET_PROTOCOL 0x03
156#define USB_REQ_SET_REPORT 0x09
157#define USB_REQ_SET_IDLE 0x0A
158#define USB_REQ_SET_PROTOCOL 0x0B
175 __packed uint8_t requesttype;
176 __packed uint8_t request;
177 __packed uint16_t
value;
178 __packed uint16_t index;
179 __packed uint16_t length;
201#define USB_MAXCONFIG 8
202#define USB_ALTSETTINGALLOC 16
203#define USB_MAXALTSETTING 128
204#define USB_MAXINTERFACES 32
205#define USB_MAXENDPOINTS 32
209typedef struct usb_descriptor_header
211 __packed uint8_t bLength;
212 __packed uint8_t bDescriptorType;
215typedef struct __attribute__((__packed__)) usb_descriptor_header
218 uint8_t bDescriptorType;
236typedef struct usb_device_descriptor
238 __packed uint8_t bLength;
239 __packed uint8_t bDescriptorType;
240 __packed uint16_t bcdUSB;
241 __packed uint8_t bDeviceClass;
242 __packed uint8_t bDeviceSubClass;
243 __packed uint8_t bDeviceProtocol;
244 __packed uint8_t bMaxPacketSize0;
245 __packed uint16_t idVendor;
246 __packed uint16_t idProduct;
247 __packed uint16_t bcdDevice;
248 __packed uint8_t iManufacturer;
249 __packed uint8_t iProduct;
250 __packed uint8_t iSerialNumber;
251 __packed uint8_t bNumConfigurations;
254typedef struct __attribute__((__packed__)) usb_device_descriptor
257 uint8_t bDescriptorType;
259 uint8_t bDeviceClass;
260 uint8_t bDeviceSubClass;
261 uint8_t bDeviceProtocol;
262 uint8_t bMaxPacketSize0;
266 uint8_t iManufacturer;
268 uint8_t iSerialNumber;
269 uint8_t bNumConfigurations;
278typedef struct usb_endpoint_descriptor
280 __packed uint8_t bLength;
281 __packed uint8_t bDescriptorType;
282 __packed uint8_t bEndpointAddress;
283 __packed uint8_t bmAttributes;
284 __packed uint16_t wMaxPacketSize;
285 __packed uint8_t bInterval;
286 __packed uint8_t bRefresh;
287 __packed uint8_t bSynchAddress;
290typedef struct __attribute__((__packed__)) usb_endpoint_descriptor
293 uint8_t bDescriptorType;
294 uint8_t bEndpointAddress;
295 uint8_t bmAttributes;
296 uint16_t wMaxPacketSize;
299 uint8_t bSynchAddress;
309typedef struct usb_interface_descriptor
311 __packed uint8_t bLength;
312 __packed uint8_t bDescriptorType;
313 __packed uint8_t bInterfaceNumber;
314 __packed uint8_t bAlternateSetting;
315 __packed uint8_t bNumEndpoints;
316 __packed uint8_t bInterfaceClass;
317 __packed uint8_t bInterfaceSubClass;
318 __packed uint8_t bInterfaceProtocol;
319 __packed uint8_t iInterface;
323typedef struct __attribute__((__packed__)) usb_interface_descriptor
326 uint8_t bDescriptorType;
327 uint8_t bInterfaceNumber;
328 uint8_t bAlternateSetting;
329 uint8_t bNumEndpoints;
330 uint8_t bInterfaceClass;
331 uint8_t bInterfaceSubClass;
332 uint8_t bInterfaceProtocol;
344typedef struct usb_config_descriptor
346 __packed uint8_t bLength;
347 __packed uint8_t bDescriptorType;
348 __packed uint16_t wTotalLength;
349 __packed uint8_t bNumInterfaces;
350 __packed uint8_t bConfigurationValue;
351 __packed uint8_t iConfiguration;
352 __packed uint8_t bmAttributes;
353 __packed uint8_t MaxPower;
356typedef struct __attribute__((__packed__)) usb_config_descriptor
359 uint8_t bDescriptorType;
360 uint16_t wTotalLength;
361 uint8_t bNumInterfaces;
362 uint8_t bConfigurationValue;
363 uint8_t iConfiguration;
364 uint8_t bmAttributes;
374typedef struct usb_string_descriptor
376 __packed uint8_t bLength;
377 __packed uint8_t bDescriptorType;
378 __packed uint16_t wData[1];
381typedef struct __attribute__((__packed__)) usb_string_descriptor
384 uint8_t bDescriptorType;
402#define USB_DEVICE_ID_MATCH_VENDOR 0x0001
403#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002
404#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004
405#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008
406#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010
407#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020
408#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040
409#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080
410#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
411#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
413#define USB_DEVICE_ID_MATCH_DEVICE (USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
414#define USB_DEVICE_ID_MATCH_DEV_RANGE (USB_DEVICE_ID_MATCH_DEV_LO | USB_DEVICE_ID_MATCH_DEV_HI)
415#define USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION (USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_DEV_RANGE)
416#define USB_DEVICE_ID_MATCH_DEV_INFO \
417 (USB_DEVICE_ID_MATCH_DEV_CLASS | USB_DEVICE_ID_MATCH_DEV_SUBCLASS | USB_DEVICE_ID_MATCH_DEV_PROTOCOL)
418#define USB_DEVICE_ID_MATCH_INT_INFO \
419 (USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)
422#define USB_DEVICE(vend,prod) \
423 { USB_DEVICE_ID_MATCH_DEVICE, vend, prod, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
425#define USB_DEVICE_VER(vend,prod,lo,hi) \
426 { USB_DEVICE_ID_MATCH_DEVICE_AND_VERSION, vend, prod, lo, hi, 0, 0, 0, 0, 0, 0, 0 }
428#define USB_DEVICE_INFO(cl,sc,pr) \
429 { USB_DEVICE_ID_MATCH_DEV_INFO, 0, 0, 0, 0, cl, sc, pr, 0, 0, 0, 0 }
431#define USB_INTERFACE_INFO(cl,sc,pr) \
432 { USB_DEVICE_ID_MATCH_INT_INFO, 0, 0, 0, 0, 0, 0, 0, cl, sc, pr, 0 }
434typedef struct usb_device_id
439 uint16_t match_flags;
448 uint16_t bcdDevice_lo;
449 uint16_t bcdDevice_hi;
455 uint8_t bDeviceClass;
456 uint8_t bDeviceSubClass;
457 uint8_t bDeviceProtocol;
463 uint8_t bInterfaceClass;
464 uint8_t bInterfaceSubClass;
465 uint8_t bInterfaceProtocol;
470 uint32_t driver_info;
474typedef struct usb_driver
479 const USB_DEV_ID_T *id_table;
482 USB_LIST_T driver_list;
492#define USB_DISABLE_SPD 0x0001
493#define URB_SHORT_NOT_OK USB_DISABLE_SPD
494#define USB_ISO_ASAP 0x0002
495#define USB_ASYNC_UNLINK 0x0008
496#define USB_QUEUE_BULK 0x0010
497#define USB_NO_FSBR 0x0020
498#define USB_ZERO_PACKET 0x0040
499#define URB_NO_INTERRUPT 0x0080
501#define USB_TIMEOUT_KILLED 0x1000
503#define URB_ZERO_PACKET USB_ZERO_PACKET
504#define URB_ISO_ASAP USB_ISO_ASAP
512 struct ohci_ed_t *ed;
562#define FILL_CONTROL_URB(a,aa,b,c,d,e,f,g) \
566 (a)->setup_packet=c;\
567 (a)->transfer_buffer=d;\
568 (a)->transfer_buffer_length=e;\
574#define FILL_BULK_URB(a,aa,b,c,d,e,f) \
578 (a)->transfer_buffer=c;\
579 (a)->transfer_buffer_length=d;\
585#define FILL_INT_URB(a,aa,b,c,d,e,f,g) \
589 (a)->transfer_buffer=c;\
590 (a)->transfer_buffer_length=d;\
594 (a)->start_frame=-1;\
598#define FILL_CONTROL_URB_TO(a,aa,b,c,d,e,f,g,h) \
602 (a)->setup_packet=c;\
603 (a)->transfer_buffer=d;\
604 (a)->transfer_buffer_length=e;\
611#define FILL_BULK_URB_TO(a,aa,b,c,d,e,f,g) \
615 (a)->transfer_buffer=c;\
616 (a)->transfer_buffer_length=d;\
623typedef struct usb_operations
627 int (*get_frame_number) (
struct usb_device *usb_dev);
628 int (*submit_urb)(
URB_T *urb);
629 int (*unlink_urb)(
URB_T *urb);
633typedef struct usb_bus
641#define USB_MAXCHILDREN (4)
643typedef struct ep_info_t
648 uint8_t bEndpointAddress;
649 uint8_t bmAttributes;
651 short wMaxPacketSize;
655#define USB_SPEED_UNKNOWN 0
656#define USB_SPEED_LOW 1
657#define USB_SPEED_FULL 2
658#define USB_SPEED_HIGH 3
748#define PIPE_ISOCHRONOUS 0
749#define PIPE_INTERRUPT 1
750#define PIPE_CONTROL 2
753#define usb_packetid(pipe) (((pipe) & USB_DIR_IN) ? USB_PID_IN : USB_PID_OUT)
755#define usb_pipeout(pipe) ((((pipe) >> 7) & 1) ^ 1)
756#define usb_pipein(pipe) (((pipe) >> 7) & 1)
757#define usb_pipedevice(pipe) (((pipe) >> 8) & 0x7f)
758#define usb_pipe_endpdev(pipe) (((pipe) >> 8) & 0x7ff)
759#define usb_pipeendpoint(pipe) (((pipe) >> 15) & 0xf)
760#define usb_pipedata(pipe) (((pipe) >> 19) & 1)
761#define usb_pipeslow(pipe) (((pipe) >> 26) & 1)
762#define usb_pipetype(pipe) (((pipe) >> 30) & 3)
763#define usb_pipeisoc(pipe) (usb_pipetype((pipe)) == PIPE_ISOCHRONOUS)
764#define usb_pipeint(pipe) (usb_pipetype((pipe)) == PIPE_INTERRUPT)
765#define usb_pipecontrol(pipe) (usb_pipetype((pipe)) == PIPE_CONTROL)
766#define usb_pipebulk(pipe) (usb_pipetype((pipe)) == PIPE_BULK)
768#define PIPE_DEVEP_MASK 0x0007ff00
771#define usb_gettoggle(dev, ep, out) (((dev)->toggle[out] >> ep) & 1)
772#define usb_dotoggle(dev, ep, out) ((dev)->toggle[out] ^= (1 << ep))
773#define usb_settoggle(dev, ep, out, bit) ((dev)->toggle[out] = ((dev)->toggle[out] & ~(1 << ep)) | ((bit) << ep))
776#define usb_endpoint_out(ep_dir) (((ep_dir >> 7) & 1) ^ 1)
777#define usb_endpoint_halt(dev, ep, out) ((dev)->halted[out] |= (1 << (ep)))
778#define usb_endpoint_running(dev, ep, out) ((dev)->halted[out] &= ~(1 << (ep)))
779#define usb_endpoint_halted(dev, ep, out) ((dev)->halted[out] & (1 << (ep)))
781static __inline uint32_t __create_pipe(
USB_DEV_T *dev, uint32_t endpoint)
783 return (dev->devnum << 8) | (endpoint << 15) | (dev->slow << 26);
786static __inline uint32_t __default_pipe(
USB_DEV_T *dev)
788 return (dev->slow << 26);
792#define usb_sndctrlpipe(dev,endpoint) (0x80000000 | __create_pipe(dev,endpoint))
793#define usb_rcvctrlpipe(dev,endpoint) (0x80000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
794#define usb_sndisocpipe(dev,endpoint) (0x00000000 | __create_pipe(dev,endpoint))
795#define usb_rcvisocpipe(dev,endpoint) (0x00000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
796#define usb_sndbulkpipe(dev,endpoint) (0xC0000000 | __create_pipe(dev,endpoint))
797#define usb_rcvbulkpipe(dev,endpoint) (0xC0000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
798#define usb_sndintpipe(dev,endpoint) (0x40000000 | __create_pipe(dev,endpoint))
799#define usb_rcvintpipe(dev,endpoint) (0x40000000 | __create_pipe(dev,endpoint) | USB_DIR_IN)
800#define usb_snddefctrl(dev) (0x80000000 | __default_pipe(dev))
801#define usb_rcvdefctrl(dev) (0x80000000 | __default_pipe(dev) | USB_DIR_IN)
804extern USB_LIST_T usb_driver_list;
805extern USB_LIST_T usb_bus_list;
810extern USB_BUS_T g_ohci_bus;
825extern 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);
840extern void usbh_init_memory(
void);
841extern int usbh_init_ohci(
void);
842extern int usbh_init_hub_driver(
void);
843extern void ohci_irq(
void);
844extern void ohci_int_timer_do(
int);
845extern void usbh_mdelay(uint32_t msec);
847extern void usbh_connect_device(
USB_DEV_T *dev);
848extern void usbh_disconnect_device(
USB_DEV_T **pdev);
849extern int usbh_settle_new_device(
USB_DEV_T *dev);
851extern int usb_maxpacket(
USB_DEV_T *dev, uint32_t pipe,
int out);
854extern void usbh_free_device(
USB_DEV_T *dev);
856extern struct ohci_ed_t * ohci_alloc_ed(
void);
857extern void ohci_free_ed(
struct ohci_ed_t *ed_p);
858extern struct ohci_td_t * ohci_alloc_td(
USB_DEV_T *dev);
859extern void ohci_free_td(
struct ohci_td_t *td_p);
860extern void ohci_free_dev_td(
USB_DEV_T *dev);
861extern struct ohci_itd_t * ohci_alloc_idd(
void);
862extern void ohci_free_itd(
struct ohci_itd_t *itd_p);
863extern void usbh_free_dev_urbs(
USB_DEV_T *dev);
864extern int usbh_translate_string(
USB_DEV_T *dev,
int index,
char *buf,
int size);
870extern void usbh_dump_urb(
URB_T *purb);
871extern void usbh_print_usb_string(
USB_DEV_T *dev,
char *
id,
int index);
#define MAX_TD_PER_OHCI_URB
#define MAX_DRIVER_PER_DEV
int32_t USBH_RegisterDriver(USB_DRIVER_T *new_driver)
Register a device driver to USB Host Core driver.
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_GetDescriptor(USB_DEV_T *dev, uint8_t type, uint8_t index, void *buf, int size)
Get a descriptor from device.
int32_t USBH_Resume(void)
Resume USB Host controller and devices.
int32_t USBH_Close(void)
Disable USB Host controller function.
int32_t USBH_SubmitUrb(URB_T *urb)
Submit an URB to USB core for transfer data.
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]
URB_T * USBH_AllocUrb(void)
Allocate an URB from USB Core driver internal URB pool.
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.
void USBH_FreeUrb(URB_T *)
Free the URB allocated from USBH_AllocUrb()
USB_DRIVER_T * driver[MAX_DRIVER_PER_DEV]
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.
ISO_PACKET_DESCRIPTOR_T iso_frame_desc[8]
void(* complete)(struct urb_t *)
int32_t USBH_ClearHalt(USB_DEV_T *dev, int pipe)
Clear the halt state of an endpoint.
struct usb_device * parent
int32_t USBH_SetConfiguration(USB_DEV_T *dev, int configuration)
Select USB device configuration.
int USBH_ProcessHubEvents(void)
Processed USB hub device events. User application must invoke this routine in the main while loop....
HIDDEN_SYMBOLS struct iso_pkt_t ISO_PACKET_DESCRIPTOR_T
struct __attribute__((__packed__))
HIDDEN_SYMBOLS struct usb_device USB_DEV_T
USB Host core configuration file.