Linux USB驱动

USB协议

USB协议+Host协议+OTG协议。USB树形拓扑结构(ch4.1.1),最多7层,第七层只有functions,不能有hub。一条USB总线有且只有一个USB host,一个Root hub。USB设备分两类,hub和functions。Compound Device表示一个Hub上接多个设备组成的一个USB设备组。Composite Device表示一个具有多个复用功能的USB设备。USB主机控制器是真正的硬件。通常挂载在PCI总线(如台式机)或者platform总线(如手机)上。USB机械性能(ch5)。USB电气性能(ch6)。四大描述符(ch9.5)。启动流程(ch9.1,ch9.2)。

数据流传输(ch5)。端点分零端点和非零端点。零端点作为默认的控制方法,主要用于初始化。传输分Control/Bulk/Interrupt/Isochronous。

数据包(ch8)。四种:Token,Data,Handshake,Special。Token令牌包只能主机到设备,分IN/OUT/SOF/SETUP。SETUP实现主机向设备发送请求(ch9.3,ch9.4)。

Linux USB系统

HCD是USB主机控制器的驱动,USB core是USB driver与HCD之间的接口。USB driver不能直接访问HCD。USB core注册了USB总线,USB文件系统,USB Hub以及usb_generic_driver等。所有的USB设备都要绑定到usb_generic_driver上,让设备进入configured状态。usb_driver真正的含义是USB接口驱动。URB封装了USB协议描述的packet。

usb_control_msg() / usb_bulk_msg() / usb_interrupt_msg()

usb_control_msg() => usb_internal_control_msg() => usb_start_wait_urb() => usb_submit_urb() => usb_hcd_submit_urb => hcd->driver->urb_enqueue()

Linux USB系统启动

系统启动时USB初始化主要工作如下。

1. PCI总线或platform总线匹配(probe)USB HCD设备与USB HCD驱动。

2. 匹配成功后,执行该驱动的probe函数,注册USB总线和中断,注册Root hub设备。

3. USB总线匹配(probe)Root hub设备和Root hub驱动。

4. 匹配成功后,执行Root hub的probe函数,遍历设备,匹配驱动。

Linux USB热插拔

1. 当物理上插入USB设备时,触发USB主机控制器的中断回调函数,该函数会调用hub的中断回调函数。

2. Hub的中断回调函数遍历设备,匹配驱动。

HCD的中断处理过程(xhci_irq)

1. 读取状态

hub_port_status()

hub_port_connect_change()

choose_address() --> 分配地址

hub_port_init() --> 获取设备描述符

usb_new_device() --> USB设备已经进入configured状态,执行接口驱动匹配,如果成功则开始加载接口驱动。

Linux USB数据传输

一个传输(控制/批量/中断/等时)由多个事务(IN/OUT/SETUP)组成,一个事务由多个包组成。

一个USB设备可以有多个Interface,每个Inferface对应一个功能(鼠标/键盘/麦克风等)。

你可能感兴趣的:(Linux)