本文主要介绍了USB设备在计算机网络中的操作,包括主机与设备之间的通信流程,特别是设备枚举过程和USB设备驱动架构的理解。
在USB设备的管理中,主机(Host)首先通过发送`get_port_status`请求来确认设备是否已从重置状态中恢复。当Hub移除重置信号,设备进入默认状态,其USB寄存器处于重置状态,准备响应端点0上的控制传输,使用默认地址00H与主机通信。主机随后会向Hub发送`set_port_feature`请求来重置连接端口,这一过程中会检测到特殊的信号状态——Chirp k和Chirp J,这两个状态是DC差分电压的表现,分别在D+和D-线上体现正位。
USB枚举过程主要包括以下步骤:
1. 主机执行Hub reset设备的操作,但USB规范并未定义此具体动作。
2. 设备重置后,主机开始获取设备描述符,这是了解设备功能的关键步骤。
3. 主机通过`Set_Address`命令为设备分配一个唯一的地址。
4. 通过设备描述符,主机能了解设备的能力和配置信息,但这还不能使设备进入Configured状态。设备驱动程序在此过程中的作用是匹配并管理设备,枚举成功后,主机调用`device_add()`将设备添加到总线链表,并寻找适合的驱动程序。
USB设备、配置、接口、设置及端点的关系可以概括如下:
- 一个USB设备可包含一个或多个配置。
- 每个配置有多个USB接口。
- 每个接口又可以有多个设置。
- 每个设置下有多个USB端点。
- 端点描述符定义了数据的输入/输出方向,传输类型(控制、批量、中断、等时)等信息。
USB设备驱动架构在Linux内核版本2.6.35.3中,当USB设备插入时,会经历一系列处理过程,包括识别设备、解析配置、初始化接口和端点,最后匹配并加载相应的驱动程序。 urb(USB请求块)列表在设备的每个端点中,用于存储数据传输请求,当Host Controller Driver(HCD)接收到urb,会将其添加到端点的urb队列中,以便进行数据的收发操作。
USB设备的运作涉及到主机与设备间的复杂交互,包括枚举过程中的信号检测、地址分配、配置解析等,同时理解USB设备的层次结构和驱动架构对于有效管理和利用USB设备至关重要。