一文读懂 USB 协议:大话通用串行总线,从历史、架构到端点通信(中)
1.USB 通信层次
USB 协议由多个层次组成,主要包括以下几个层次:

其中,从底层到顶层分别为:
- 应用层 Function Layer:
- 这一层负责 USB 设备的应用功能实现
- 它定义了不同类型设备(如鼠标、键盘、扫描仪等)的具体功能和行为
- 把设备功能抽象为接口(Interface)。用户可以通过驱动或者客户软件(Client SW), 直接访问功能接口从而实现特定应用需求,提高了 USB 设备的可扩展性和可互操作性
- 不同的接口可以封装不同的设备功能,如键盘、鼠标、音频设备等。用户可以根据需要选择合适的接口进行访问和使用
- 协议层 USB Device Layer:
- 这一层负责 USB 设备的逻辑控制和数据传输,客户软件(Client SW)通过协议层把客户软件收发数据的请求和内容转换成为 USB 传输事务
- 它定义了 USB 设备的枚举、配置、端点管理等功能,以及不同传输类型(控制、批量、中断、同步)的实现
- 这一层提供了一个标准化的 USB 设备接口,屏蔽了底层物理细节
- USB 设备是由若干个端点(EndPoint)构成的,端点则是 USB 设备上通信逻辑的最小对象
- 每个端点可以用于不同的数据传输目的,如控制、中断、批量或等时传输,通常一个设备会有一个控制端点用于传输设备配置和状态信息,其他端点则用于数据的发送和接收
- 主机的驱动程序或用户程序会与这些端点建立逻辑管道(Pipe),通过管道来收发数据。这就形成了一个个独立的数据通道
- 物理层 USB Bus interface Layer:
- 这一层负责 USB 物理接口的实现,包括电气特性、连接器、信号传输等基本功能
- 它定义了 USB 总线的物理特性,是 USB 通信的基础
- 主机需要不断查询(轮询)USB 总线上连接的设备,发现新设备并进行枚举、配置等操作。同时还需要调度多个设备之间的数据传输,保证各设备能公平地访问总线
- 设备端则需要对总线上的数据包进行识别和筛选,将其路由到对应的端点上。不同类型的端点(控制、中断、批量、等时)有不同的传输特性要求
- 这些复杂的低层协议交互,都由操作系统的 USB 驱动和设备端的物理层处理模块(如 PHY 芯片)来完成,对上层的应用程序和驱动程序是透明的

这三个层次分工明确,共同构成了完整的 USB 通信系统:
- 物理层提供基础的硬件接口
- 协议层实现 USB 协议的数据传输
- 应用层则针对不同设备类型实现具体的功能
这种分层设计使得 USB 系统具有良好的可扩展性和可移植性,新的设备只需要在应用层进行开发,而不需要修改底层的物理和逻辑实现。

2.USB 通信端点和端点描述符
端点 Endpoint 是 USB 设备与主机通信的最基本单元。每一个逻辑上的 USB 设备由多个独立的端点组成:
- 每个端点在设备设计时就已经被分配了一个唯一的端点编号,无需在设备连接时与主机协商;
- 根据数据传输方向,端点分为输出端点(用于接收来自主机的数据)和输入端点(用于向主机发送数据),这种分类是从主机的角度来看的;
- 一个端点只能有单一的传输方向,在设备设计时就已经确定;
- 当 USB 设备连接时,会与主机协商获得一个地址。通过设备地址、端点编号和传输方向,就可以唯一标识一个端点用于通信。
USB 协议中端点具有四种传输方式:
- 批量(Bulk)传输:
- 异步传输方式
- 无时间限制
- 可以传输任意格式和长度的数据
- 用于传输不紧急但需要大带宽的数据
- 中断(Interrupt)传输:
- 异步传输方式
- 有时间限制
- 小数据量传输
- 用于传输需要及时响应的数据
- 控制(Control)传输:
- 异步传输方式
- 有时间限制
- 用于设备配置和状态查询等控制操作
- 同步(Isochronous)传输:
- 同步传输方式
- 有时间限制
- 不支持出错重传
- 用于传输对时间敏感但可以容忍丢包的数据,如音频和视频流
需要注意的是,每个 USB 设备都有一组默认的端点工作在控制传输方式下,用于传输配置和控制信息的。 它们就是端点编号为 0 的输出和输入端点。在 USB 设备刚插入,且尚未分配地址时,主机通过总线地址 0 只能访问端点 0。 此时,USB 设备的通信能力是有限的,只有当主机通过端点 0 获取了设备的描述符,完成枚举操作后,设备才可以正常的与主机通信。
每个端点都有不同的工作方式和限制,这些信息需要在设备枚举过程中告知主机。描述端点工作方式和限制的描述符我们称为端点描述符 Endpoint Descriptor,它记录了端点的以下关键信息::
- 端点编号
- 端点查询频率
- 传输方式(批量、中断、同步等)
- 最大数据包长度
通过端点描述符,主机可以了解每个端点的具体特性,从而正确地与之进行通信和数据交换。
3.USB 的枚举过程、描述符和 USB 设备状态
当 USB 设备插入主机时,需要经过一个枚举(Enumeration)的过程,主要包括以下步骤:
- 主机检测到新的 USB 设备连接后,会查询设备的基本信息,如供应商 ID、产品 ID 等
- 设备会向主机提供一系列设备描述符(Device Descriptor),描述了自己的类型、功能、端点信息等
- 主机根据这些描述符信息,确认设备的类型,并选择合适的 USB 设备驱动程序
- 主机还会为设备分配地址,并与设备进行配置,使其进入工作状态
- 最后,应用程序可以通过调用操作系统的 USB 驱动接口,访问设备提供的功能
每个 USB 设备都只有一个设备描述符(Device Descriptor),该描述符定义了设备所用的 USB 版本号、设备类(class)代码、 设备子类(subclass)代码、协议(protocol)代码、厂商信息、可能的配置数量等信息。一个 USB 设备可以有多种配置, 但同一时间只能使用一种。
USB 设备的每一种配置都对应着一个配置描述符 Configuration Descriptor,其中定义了设备的供电方式、支持的接口数量等信息。一个 USB 设备可以支持多个接口,具有多个接口的 USB 设备可以分为两种:
- USB 复合设备 Compound Device:
- 一个物理上的 USB 设备包含多个功能接口(Interface)
- 每个接口都可以独立使用,比如音频设备包含音频控制、音频流和 MIDI 流等接口
- 主机操作系统会将每个接口当作一个独立的逻辑设备来管理和访问
- 复合设备需要提供完整的描述符信息,包括每个接口的描述符
- USB 组合设备 Composite Device:
- 多个物理上独立的 USB 设备(如键盘和鼠标)组合在一起,作为一个整体设备连接到主机
- 主机操作系统会将整个组合设备当作一个单一的逻辑设备来管理
- 组合设备的描述符信息也是整体性的,无法将其拆分为独立的接口
- 组合设备的各个物理设备之间通常是相关联的,共享某些硬件资源
以常见的 USB 复合设备-USB 音频设备为例,通常包含以下几个接口:
- 音频控制接口 - 用于音频设备的配置和控制
- 音频流接口 - 用于传输 PCM 音频数据
- MIDI 流接口 - 用于传输 MIDI 协议的音乐数据
在 USB 设备中,使用接口描述符 Interface Descriptor 描述接口信息,包括以下类型:
- 接口类型(Class)、子类型(SubClass)和协议(Protocol)
- 用于标识接口的功能类型,如 HID、音频、视频等
- 接口使用的端点信息
- 描述了接口所使用的端点数量、端点类型(控制、中断、批量、等时)等。
- 接口编号和设置
- 接口编号用于标识接口的唯一性
- 接口设置描述了接口的不同工作配置
需要注意的是,一个接口可能涉及到多个端点,而每个端点则有一个端点描述符。
上面我们提到了接口的类型与子类型,实际上,为了方便管理和访问不同种类的 USB 设备,USB 协议定义了一系列设备类(Class)和子类(SubClass),主要的 USB 设备类型有以下几种:
- 人机交互设备(Human Interface Device, HID)
- 包括鼠标、键盘、手柄等输入设备
- 使用简单、标准的 HID 协议进行数据交互
- 大容量存储设备(Mass Storage Class, MSC)
- 包括 U 盘、移动硬盘等存储设备
- 使用大容量存储设备协议进行数据传输
- 通信设备(Communication Device Class, CDC)
- 包括 USB 串口、调制解调器等通信设备
- 使用通信设备协议进行数据交换
- 音频设备(Audio Class)
- 包括 USB 麦克风、扬声器等音频设备
- 使用音频设备协议进行数据传输
- 视频设备(Video Class)
- 包括 USB 摄像头、视频捕捉设备
- 使用视频设备协议进行数据传输
- 打印设备(Printer Class)
- 包括 USB 打印机
- 使用打印机设备协议进行数据交换
- 智能卡设备(Smart Card Class)
- 包括 USB 智能卡读卡器
- 使用智能卡设备协议进行数据传输
这些类的划分体现在设备描述符和接口描述符的 class、subclass、protocol 相关的字段上,主要是接口描述符:
- 设备类(Class)
- 用于标识设备的大类型,如 HID(人机交互)、CDC(通信设备)、Mass Storage(大容量存储)等
- 子类(SubClass)
- 用于进一步细分设备的类型,如 HID 类下的鼠标、键盘、手柄等
- 协议(Protocol)
- 描述设备支持的具体协议,如 HID 类下的 USB HID、CDC 类下的串口协议等
主机根据这些设备类型信息,以及设备描述符中提到的厂商信息选择驱动。
USB 协议中规定 USB 设备具有六种工作状态:
- 未配置状态(Unconfigured):这是 USB 设备刚刚连接到主机时的初始状态。在这个状态下,设备还没有被分配地址,也不能进行任何通信
- 地址状态(Address State):在设备被识别并分配了一个唯一的地址后,它就进入了地址状态。在这个状态下,设备可以使用分配给它的地址与主机进行通信
- 配置状态(Configured State):当设备发送一个配置请求到主机,并且主机接受了这个请求后,设备就进入了配置状态。在这个状态下,设备已经完成了所有的配置过程,包括设置端点、获取描述符等,并可以开始与主机进行数据传输
- 挂起状态(Suspended State):当设备在一段时间内没有数据传输时,它会自动进入挂起状态以节省电能。在这个状态下,设备的电源会被关闭,除非有中断事件发生,否则设备会一直保持挂起状态
- 默认状态(Default State):指设备已经供电了,并且复位结束,但还没有分配地址,主机可以通过默认地址 0 来访问该设备,并分配地址
- 供电状态(Powered State):指设备已经连接上了,并且设备接收到来自 USB 总线的电源供电
这些状态转换过程对应着 USB 设备的枚举流程,主机会根据设备当前的状态进行相应的操作和配置,直至设备完全初始化并准备就绪:

需要注意的是,如果在任何状态下设备与主机失去连接,都会回到已断开(Detached)状态。这种状态转换机制确保了 USB 设备能够被安全地插拔和管理。
当我们将一个 USB 设备插入 PC 上的可用接口时,PC 机需要经过一系列的操作为设备分配地址,协商选择设备驱动, 对 USB 设备进行必要的配置。这一过程我们称之为枚举过程,具体如下:
- 设备连接检测
- 由于 USB 接头的热插拔设计,当插入一个 USB 插入到 HUB 的接口上时,就会改变 HUB 的连接状态。
- 在主机查询 HUB 时,由 HUB 告知状态改变标识着设备已经连接上了
- 此时主机就获知了新插入设备所在的端口
- 端口复位
- 主机至少等 100ms,待设备完全插入并且供电稳定后
- 主机向 HUB 发送启用和复位端口的指令,使设备进入 Default 状态
- 设备从 VBUS 引脚上获取不超过 100mA 的电流,用于完成基本的功能配置
- 主机可以通过默认地址 0 访问该设备
- 获取设备描述符
- 主机通过地址 0 访问设备与设备的端点 0 进行通信
- 获取设备描述符信息
- 选择配置
- 主机根据设备描述符信息,选择合适的配置
- 分配地址
- 主机为设备分配一个唯一的设备地址
- 加载驱动
- 主机根据设备信息,选择并加载合适的 USB 驱动程序
- 设备进入 Configured 状态
- 设置接口
- 主机对设备的各个接口进行初始化设置
- 设备就绪
- 至此,USB 设备的枚举过程完成,设备进入可用状态

* **应用层 Function Layer:**
* 这一层负责 USB 设备的应用功能实现
* 它定义了不同类型设备(如鼠标、键盘、扫描仪等)的具体功能和行为
* 把设备功能抽象为接口(Interface)。用户可以通过驱动或者客户软件(Client SW), 直接访问功能接口从而实现特定应用需求,提高了 USB 设备的可扩展性和可互操作性
* 不同的接口可以封装不同的设备功能,如键盘、鼠标、音频设备等。用户可以根据需要选择合适的接口进行访问和使用
浙公网安备 33010602011771号