USB设备导论
USB(通用串行总线)设备是一种广泛使用的接口设备,支持即插即用和热插拔功能。
USB硬件接口类型
常见的USB设备应用
存储设备:
输入设备:
音频设备:
网络设备:
通信设备:
多媒体设备:
扩展和集线器:
电源设备:
USB虚拟设备:
USB知识框架
USB分析仪、调试方法、抓包分析
USB协议基础、USB总线电平标准、总线状态、信号
USB描述符
USB传输、中断、事务
USB包,
USB硬件设计、热插拔
USB基本原理介绍
从接入到使用
USB设备分为两类:主机(Host)和从机(Device)。
同一USB网络中,只能存在一个主机。USB OTG允许设备在主机和从机之间切换角色。
比如:音箱作为USB主机时,可以读取U盘音乐;作为USB从机时,接受电脑的USB音频输入。
USB拔插: 主机通过检测USB D+/D- 的电平变化感知从机的接入或者拔出
- 主机端D+/D-下拉15KΩ电阻到GND(0V),从机端D+/D-上拉1.5KΩ电阻到3.3V。
- 当从机接入主机时,D+/D-上的电压变为3V,双方通过电平变化就可以发现USB的拔插事件
- USB拔插事件会触发主机的中断(或回调),执行从机的加载、释放过程。
USB枚举: 主机通过获取设备的描述符集合来识别USB设备
- USB连接后,主机通过访问描述符集合来识别从机并配置从机
- 每个USB设备都必须有遵循相应格式的描述符集合介绍自身的功能和用途,包含设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符、其它特殊描述符等。
USB使用: 主机以轮询的方式发数据,从机以中断的方式接收数据
- USB的数据传输过程描述以及主机端为主
USB通信构建过程概述
主机访问指定USB设备: 主机为所有从机分配唯一的设备地址,通过地址访问从机
- 主机给所有已连接的设备分配地址,并确保不会重复(Addr1-AddrN)
- 对刚接入没分配地址的从机,主机使用默认地址
Addr0
与其通信,握手后分配新地址
主机访问指定USB设备的指定功能: 主机通过(设备地址,设备端点)
访问指定从机的指定接口/功能。
- 用端点(Endpoint,EP)区分USB从机的不同功能(如一个从机同时具有HID、CDC等复合功能,通过端点区分,避免冲突)
- 端点具有唯一性,其和从机的功能用途一一对应,主机按照端点的属性构建专用的端点通道进行通信;端点还标识了特定用途的数据传输方向
- 初次接入时,主从双方通过
(Addr0, EP0)
进行通信
主从双方构建读/写通信过程: 主机用默认端点0(EP0)创建通道枚举从机,根据描述符集中的其他端点创建对应通道访问其他功能
- 从机必须支持默认控制端点EP0,用于处理设备的配置和状态令牌,此外用其它端点来处理数据传输,如:批量(Bulk)、中断(Interrupt)、等时(Isochronous)或控制(Control)类型的端点。
- 初接入时,主机通过
(Addr0, EP0)
访问从机,创建EP0的端点通道,枚举并分配地址 - 而后主机使用
(Addr1, EP0)
重新枚举从机;根据从机提供的信息(端点、属性)创建相应的数据通道,定义通道读写方式。
主从双方通信过程: 一次完整的通信分为三个过程:请求过程(令牌包)、数据过程(数据包)和状态过程(握手包),没有数据要传输时,则跳过数据过程。每一次帧轮询周期,有以下三种通信过程情况:
- 主机发送令牌包(Token)开始请求过程,从机数据输入至主机,主机发送状态过程至从机
- 主机发送令牌包(Token)开始请求过程,主机数据输出至从机,从机回复状态过程至主机
- 主机发送令牌包(Token)开始请求过程,无数据传输,从机回复状态过程至主机
USB主从详细通信过程
在USB通信中,每个USB数据包开始之前,会发送前导码和同步码,确保接收方能够正确地同步并准备接收随后的数据。
每秒被分为1000个帧(Frame),主机在每帧开始前,会向所有从机广播帧起始令牌包(SOF包)
通知所有从机,主机的USB总线正常工作
使得从机可以同步主机的时序
USB高速设备主机将帧进一步等分为8个微帧,同一帧内,8个微帧的帧号都等于当前SOF包的帧号。
PID (Packet Identifier) 字段是每个包中的重要部分,用于标识数据包的类型和状态,通常位于数据包的头部,设计考虑了错误检测,其中高四位是低四位的二进制补码。
以下为SOF包结构:
1 |
|
请求过程
主机广播SOF包之后,会发送带有地址和端点信息的令牌包(Token) 来指定要访问的从机,分别有:建立令牌包(SETUP)、输出令牌包(OUT)、输入令牌包(IN)。
这三种令牌包统称为请求包,结构如下:
1 |
|
主机可以通过请求包指定要访问的从机,发起请求过程,配置从机或指示从机准备发送/接收数据。在枚举过程中,主机使用SETUP包请求从机的信息。枚举成功后,主机使用IN包请求输入数据,OUT包请求输出数据。
枚举时,在SETUP包的后面会紧跟一个8B长度的请求(Request),用于描述主机的具体意图,结构如下:
1 |
|
数据过程
请求的bmRequestType字段中,Direction标志位声明了数据要传输的方向。
当请求为输出(Data OUT,Direction = 1)时,从机接收不超过wLength字段中声明长度的数据,并根据请求的内容解析接收到的数据;当请求为输入时(Data IN,Direction = 0)时,从机根据请求的内容发送对应的数据(不超过wLength中声明的长度)。
数据包(Data Packets)的结构如下:
1 |
|
在USB全速设备中,数据包以DATA0、DATA1的PID交替发送。当接收方连续收到两个PID相同的DATA包时,就知道丢包了。DATA2与MDATA是USB高速设备所使用的PID
状态过程
1 |
|
通信异常
当从机还没准备好时主机请求数据;从机收到未知请求;端点通信数据量溢出;主机不应发送的请求;或没有数据要发送等情况时,本轮通信会直接进入状态过程,从机发送NYET/ERR/STALL/NAK包。
当数据传输出错时,数据的发送方停止发送数据,直到本次通信超时。
USB通信过程小结
USB的帧结构允许主机在同一帧内与多个从机进行通信。
每个USB帧以一个SOF(Start Of Frame)包开始,它标志着一个新的帧周期的开始,帧周期通常是1毫秒。
在一个帧内,主机可以与多个从机进行通信,通过令牌包(Token Packet)来发起数据传输。
指定 地址、端点
从机属性(USB描述符)
描述符集描述了从机的所有功能细节,包含唯一的设备描述符,至少一个配置描述符和接口描述符,每个接口描述符至少包含一个端点描述符,此外还有其他可选的特殊描述符进行补充。
USB描述符是用来描述USB设备特性的数据结构:
设备描述符(Device Descriptor)
描述整个USB设备的基本信息,如设备类型、版本号、制造商和产品信息等。
配置描述符(Configuration Descriptor)
描述设备的一个配置,包括设备如何被配置和使用的信息。一个配置描述符可以包含多个接口描述符。
接口描述符(Interface Descriptor)
描述设备的一个功能接口,如音频接口或HID接口。一个接口描述符可以包含多个端点描述符。
端点描述符(Endpoint Descriptor)
描述数据传输的端点,包括端点的地址、类型(如控制、批量、中断或同步流)和最大数据包大小等。
端点0通常用于控制传输,其他端点用于数据传输。
枚举的详细过程
USB设备接入后,主机复位从机,使用<addr0, EP0>构建端点通道(Pipe)请求设备描述符,从机发送完整的设备描述符或只发送前8B内容(当EP0最大包长度只有8B);
主机分配唯一的设备地址并发送Set Address请求,收到应答后再次复位从机;
主机再次请求完整的设备描述符,当一次请求不足以获取完整的描述符,主机会请求多次;
主机请求完整的配置描述符;
根据设备描述符和配置描述符中声明的字符串描述符索引号,请求所有字符串描述符;
(可选)主机请求限定符描述符,当描述符中声明了支持更高速的USB协议时,主机复位从机,用新的USB协议重新枚举从机,当获取描述符失败时,认为从机不支持此功能,按原协议重新枚举并跳过此步骤;
根据配置描述符中声明的集合长度,请求配置集合。其中配置集合包括配置描述符、接口描述符、端点描述符以及特殊类描述符。当从机包含多个配置描述符集合时,会多次请求。
主机请求选择配置(Set Configuration);
主机选择接口,请求接口空闲状态(Set Idle),此时接口生效。根据接口描述符,可能会请求其他的特殊描述符(一般这些描述符是对接口描述符的补充描述)。如果从机包含多个接口,此步骤会重复多次;
主机知道USB设备的类型、通信方式和工作方式后,采用恰当的对策轮询USB设备。在Windows平台,主机完成枚举后会给从机派发相应的驱动(符合官方支持的设备标准)或者不派发驱动(找不到对应驱动,需要手动安装)。
USB设备类别与业务应用
PD快充协议
用到专用标识快充的 引脚
HID设备
人机交互设备,最早起源于USB,后面也扩展到 蓝牙、Wi-Fi等领域概念中
UAC
SPK、MIC
CDC
//apps/soundbox/task
app-USB设备事件 》 从机事件 》 cdc处理
疑惑解答及扩展思考
USB2.0接口皆只有Vcc、GND、D+、D-四个引脚,为何有低速、全速、高速之分?
低速(Low-Speed):1.5 Mbps(兆比特每秒)
全速(Full-Speed):12 Mbps
高速(High-Speed):480 Mbps
多种因素,包括硬件成本、功耗、散热、应用需求、向后兼容性、技术复杂性等。
如键盘、鼠标等,仅用低速或全速设备即可;而USB闪存、U盘等,则需要全速/高速设备。
端点与描述符的区别与联系?
端点是USB设备中用于数据传输的实际逻辑通道。
描述符则是用来描述端点以及其他USB设备特性的数据结构。
USB描述符在USB通信的不同阶段都会被用到,如:
在设备枚举时,读取设备描述符;
配置设置时,通过读取配置描述符,并进行配置;
读取接口描述符,例如HID接口、UAC接口,可以激活或禁用特定接口;
端点配置,根据端点描述符配置数据传输;在数据传输过程中,主机使用端点描述符中提供的信息来控制数据的发送和接收。
雷电接口与USB接口的区别、联系?
USB:由多家公司合作开发,包括英特尔、微软、IBM等,目的是创建一个通用的接口标准
雷电接口:由英特尔和苹果公司合作开发,旨在提供一种高速数据传输接口
雷电接口:可以兼容USB设备,但提供了额外的功能和更高的性能。
USB接口的端点数受到什么限制?
为什么有些USB设备端点数有限?