整个过程可以分为四个主要阶段:物理连接与识别、枚举与配置、驱动加载、数据传输。
阶段一:物理连接与检测
- 设备插入
- 用户将 USB 设备插入主机的 USB 端口(根集线器或下级集线器)。
- 电源提供与上电
- 主机通过 VBUS 电源线为设备提供 +5V 电压。设备开始上电。
- 根据 USB 规格,设备可以从总线获取最多 100mA(USB 2.0)或 150mA(USB 3.0)的电流,用于初始操作。
- 设备检测
- 主机通过持续监控 D+ 和 D- 数据线上的电压变化来检测设备。
- 过程:设备内部在 D+(全速/高速设备)或 D-(低速设备)线上有一个约 1.5kΩ 的上拉电阻。当设备插入后,该电阻将对应的数据线电压拉高。主机检测到这一变化,从而知道有设备插入。
- 速度识别:通过检测哪条数据线被拉高,主机可以初步判断设备的速度(低速或全速/高速)。高速设备首先以全速被识别,然后在后续握手过程中切换到高速模式。
阶段二:枚举
这是最核心的步骤。枚举是主机从设备那里获取所有必要信息(如设备类型、制造商、所需电源、通信协议等)的过程,并为其分配一个唯一的地址。
- 复位设备
- 主机向该端口发送一个复位信号。设备在收到复位后,进入默认状态,并准备响应地址 0 的通信。
- 读取设备描述符
- 主机向地址 0 发送请求,读取设备描述符的前 8 个字节。这 8 个字节包含了设备所需的最关键信息,特别是
bMaxPacketSize0(端点 0 的最大数据包大小),后续的通信将使用这个尺寸。
- 主机向地址 0 发送请求,读取设备描述符的前 8 个字节。这 8 个字节包含了设备所需的最关键信息,特别是
- 分配地址
- 主机为新设备分配一个唯一的(1-127)地址,并通过
Set Address请求发送给设备。设备之后的所有通信都将使用这个新地址。
- 主机为新设备分配一个唯一的(1-127)地址,并通过
- 读取完整设备信息
- 主机使用新分配的地址,再次读取完整的设备描述符(18 字节)。
- 主机接着读取配置描述符、接口描述符、端点描述符等。这些描述符详细说明了:
- 设备有多少种配置(通常为 1)。
- 每种配置下有多少个接口(例如,一个 USB 摄像头可能包含视频流接口和音频接口)。
- 每个接口有多少个端点(例如,控制端点、数据输入端点、数据输出端点)。
- 设备的类别(如 HID、大容量存储、音频等)。
- 加载并选择配置
- 主机根据所有收集到的描述符信息,选择一个合适的配置(通常是配置 1)。然后向设备发送
Set Configuration请求,激活该配置。 - 至此,设备已完成配置,处于就绪状态。
- 主机根据所有收集到的描述符信息,选择一个合适的配置(通常是配置 1)。然后向设备发送
阶段三:驱动加载
- 驱动匹配
- 主机根据枚举过程中获取的设备信息(主要是设备类、子类、协议以及 Vendor ID 和 Product ID)来寻找合适的设备驱动程序。
- 基于类:如果设备属于标准类别(如 HID、大容量存储),操作系统通常会使用内置的通用驱动程序。
- 基于厂商/产品 ID:对于特殊设备,操作系统会在已安装的驱动程序中查找匹配的 VID 和 PID。如果找不到,可能会提示用户安装驱动程序。
- 驱动加载与初始化
- 找到合适的驱动程序后,操作系统将其加载到内核(如果需要),并调用其初始化例程。驱动程序会识别到设备,并为其创建相应的设备节点(如在 Windows 中是设备对象,在 Linux 中是
/dev下的文件)。
- 找到合适的驱动程序后,操作系统将其加载到内核(如果需要),并调用其初始化例程。驱动程序会识别到设备,并为其创建相应的设备节点(如在 Windows 中是设备对象,在 Linux 中是
阶段四:正常工作与数据传输
- 应用程序访问
- 此时,设备已对系统和应用程序可见。用户或应用程序可以通过操作系统提供的 API(如
CreateFile,ReadFile在 Windows;open,read在 Linux)来访问设备。
- 此时,设备已对系统和应用程序可见。用户或应用程序可以通过操作系统提供的 API(如
- 数据传输
- 驱动程序处理应用程序的请求,将其转换为遵循 USB 协议的事务。
- 事务通过四种类型的传输实现:
- 控制传输:用于设备的枚举和配置,也可用于类特定请求。
- 中断传输:用于小批量、需保证延迟的数据(如键盘、鼠标)。
- 批量传输:用于大数据量、无时间要求的数据(如 U 盘、打印机)。
- 等时传输:用于有恒定速率、实时性要求的数据(如摄像头、音箱)。
- 主机控制器调度这些事务,通过 USB 总线将数据包发送到设备的特定端点上,完成应用程序所要求的功能。
USB 设备工作流程图
下图清晰地展示了上述流程:

总结
| 阶段 | 核心任务 | 主要通信对象 |
|---|---|---|
| 1. 连接检测 | 上电、识别设备存在与速度 | 主机控制器 & 集线器 |
| 2. 枚举 | 获取设备信息、分配地址、设置配置 | 主机 vs 设备的控制端点0 |
| 3. 驱动加载 | 匹配并加载驱动程序、创建设备接口 | 操作系统 & 驱动程序 |
| 4. 数据传输 | 处理应用请求,进行实际数据通信 | 驱动程序 vs 设备的所有端点 |
这个流程确保了 USB 设备即插即用(Plug-and-Play)的特性,使得用户无需关心复杂的硬件配置即可使用设备。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)