一文读懂 USB 协议:大话通用串行总线,从历史、架构到端点通信(中)

1.USB 通信层次

USB 协议由多个层次组成,主要包括以下几个层次:

1280X1280 (4).PNG

其中,从底层到顶层分别为:

  • 应用层 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 芯片)来完成,对上层的应用程序和驱动程序是透明的

abde2b4c8d3a409bf1d6bdc0a79b31bf.jpg

这三个层次分工明确,共同构成了完整的 USB 通信系统:

  • 物理层提供基础的硬件接口
  • 协议层实现 USB 协议的数据传输
  • 应用层则针对不同设备类型实现具体的功能

这种分层设计使得 USB 系统具有良好的可扩展性和可移植性,新的设备只需要在应用层进行开发,而不需要修改底层的物理和逻辑实现。

ScreenShot_2026-06-12_104801_783.png

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)的过程,主要包括以下步骤:

  1. 主机检测到新的 USB 设备连接后,会查询设备的基本信息,如供应商 ID、产品 ID 等
  2. 设备会向主机提供一系列设备描述符(Device Descriptor),描述了自己的类型、功能、端点信息等
  3. 主机根据这些描述符信息,确认设备的类型,并选择合适的 USB 设备驱动程序
  4. 主机还会为设备分配地址,并与设备进行配置,使其进入工作状态
  5. 最后,应用程序可以通过调用操作系统的 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 设备的枚举流程,主机会根据设备当前的状态进行相应的操作和配置,直至设备完全初始化并准备就绪:

3805cb1d-bb21-464b-b7d2-d62c106ce642.png

需要注意的是,如果在任何状态下设备与主机失去连接,都会回到已断开(Detached)状态。这种状态转换机制确保了 USB 设备能够被安全地插拔和管理。

当我们将一个 USB 设备插入 PC 上的可用接口时,PC 机需要经过一系列的操作为设备分配地址,协商选择设备驱动, 对 USB 设备进行必要的配置。这一过程我们称之为枚举过程,具体如下:

  1. 设备连接检测
    1. 由于 USB 接头的热插拔设计,当插入一个 USB 插入到 HUB 的接口上时,就会改变 HUB 的连接状态。
    2. 在主机查询 HUB 时,由 HUB 告知状态改变标识着设备已经连接上了
    3. 此时主机就获知了新插入设备所在的端口
  2. 端口复位
    1. 主机至少等 100ms,待设备完全插入并且供电稳定后
    2. 主机向 HUB 发送启用和复位端口的指令,使设备进入 Default 状态
    3. 设备从 VBUS 引脚上获取不超过 100mA 的电流,用于完成基本的功能配置
    4. 主机可以通过默认地址 0 访问该设备
  3. 获取设备描述符
    1. 主机通过地址 0 访问设备与设备的端点 0 进行通信
    2. 获取设备描述符信息
  4. 选择配置
    1. 主机根据设备描述符信息,选择合适的配置
  5. 分配地址
    1. 主机为设备分配一个唯一的设备地址
  6. 加载驱动
    1. 主机根据设备信息,选择并加载合适的 USB 驱动程序
    2. 设备进入 Configured 状态
  7. 设置接口
    1. 主机对设备的各个接口进行初始化设置
  8. 设备就绪
    1. 至此,USB 设备的枚举过程完成,设备进入可用状态
posted @ 2026-09-01 19:01  FreakStudio  阅读(9)  评论(0)    收藏  举报