USB 主机驱动的整体结构:
USB 主机控制器有 34种规格:OHCI (Open Host Controller Interface)、UHCI(Universal Host ControllerInterface) 和 EHCI (Enhanced Host Controller Interface)。OHCI 驱动程序用来为非 PC 系统上以及带有 SiS 和 ALi 芯片组的 PC 主板上的 USB芯片提供支持。UHCI 驱动程序多用来为大多数其他 PC 主板(包括 Intel 和 Via)上的 USB 芯片提供支持。 EHCI 由 USB 2.0 规范所提出, 它兼容于 OHCI 和 UHCI。 UHCI的硬件线路比 OHCI 简单,所以成本较低,但需要较复杂的驱动程序,CPU 负荷稍重。XHCI,即可拓展主机控制器接口是Intel公司开发的一个USB主机控制器接口,它目前主要面向USB3.0,也支持USB 2.0及以下设备。
1.主机控制器驱动
在 Linux 内核中,用 usb_hcd 结构体描述 USB 主机控制器驱动,它包含 USB 主机控制器的“家务”信息、硬件资源、状态描述和用于操作主机控制器的 hc_driver等
usb_hcd结构体
1 struct usb_hcd
2 {
3 /* 管理“家务” */
4 struct usb_bus self;
5 const char *product_desc; /* 产品/厂商字符串 */
6 char irq_descr[24]; /* 驱动 + 总线 # */
7
8 struct timer_list rh_timer; /* 根 Hub 轮询 */
9 struct urb *status_urb; /* 目前的状态 urb */
10
11 /* 硬件信息/状态 */
12 const struct hc_driver *driver; /* 硬件特定的钩子函数 */
13
14 /* 需要维护的标志 */
15 unsigned long flags;
16 #define HCD_FLAG_HW_ACCESSIBLE 0x00000001
17 #define HCD_FLAG_SAW_IRQ 0x00000002
18
19 unsigned rh_registered: 1; /* 根 Hub 注册? */
20
21 /* 下一个标志的采用只是“权益之计”,当所有 HCDs 支持新的根 Hub 轮询机制后将
移除 */
22 unsigned uses_new_polling: 1;
23 unsigned poll_rh: 1; /* 轮询根 Hub 状态? */
24 unsigned poll_pending: 1; /* 状态已经改变? */
25
26 int irq; /* 被分配的 irq */
27 void _ _iomem *regs; /* 设备内存和 I/O */
28 u64 rsrc_start; /* 内存和 I/O 资源开始位置 */
29 u64 rsrc_len; /* 内存和 I/O 资源长度 */
30 unsigned power_budget; /* mA, 0 = 无限制 */