USB-HID学习笔记

张开发
2026/4/17 16:18:42 15 分钟阅读

分享文章

USB-HID学习笔记
USB的概念性知识USB的特点USB2.0 有高速、全速和低速三种工作速度高速是480Mbit/s全速是12Mbit/s 低速是1.5Mbit/s。USB传输距离短开发、调式难度大http://www.usb.org/http://group.ednchina.com/93/USB是一种主从结构系统主机叫HOST从机叫Device设备。USB的数据交换只能发生在主机与设备之间所有的数据传输都是由主机主动发起的设备只是被动的负责应答在USB OTG中一个设备可以在从机与主机之间切换这样就实现了设备与设备之间的连接。USB OTG增加了一种MINI USB接头比普通的USB4线多出一条ID标识线来表明是主机还是设备。PC上有多个USB主控制器和多个USB口每个控制器下有一个跟集线器USB集线器将一个USB口扩展为多个USB口USB1.1最多为4层USB2.0最多为6层。理论上一个USB主控器最多可接入127个设备协议规定USB设备具有一个7bit的地址0~127.USB传输过程USB主控器发出命令和数据通过跟集线器→USB设备USB设备返回信息→上一层集线器经历每层集线器→USB主控制器→CPU。USB的电气特性标准USB连接线使用4芯电缆5V电源线Vbus差分数据线D-差分数据线D地GND。USB OTG增加了一种MINI USB接头比普通的USB4线多出一条ID标识线。在USB的低速和全速模式下采用的是电压传输模式在高速模式下采用电流传输模式。传输速度是指总线上每秒传输的位数实际速率要低因为USB有甚多的协议开销。当数据为0时电平翻转数据为1时电平不翻转。VBUS电源线SBU22.0设备可悬空CC1发电段配置上拉电阻受电段下拉。DN、DP差分数据线。有设备D或者D-接一个1.5k的上拉电阻D高速D-低俗HUB集线器:没有设备D、D-接入15k的下拉电阻。USB的描述符USB1.1定义的标准描述符设备描述符Device Descriptor、配置描述符Configuration Descriptor、接口描述符Interface Descriptor、端点描述符Endpoint Descriptor、字符串描述符String Descriptor。USB2.0协议新增两个描述符高速High-Speed480Mbps设备限定描述符Device Qualifier Descriptor、其他速度配置描述符Other Speed Configuration Descriptor。特殊的描述符类特殊描述符HID描述符和音频接口描述符、厂商自定义描述符。一个USB设备只有一个设备描述符设备描述符设备使用的USB协议版本号、设备类型、厂商ID、产品PID、版本号等配置描述符接口数、接口所使用的类、子类、协议等端点描述符端点号及方向、端点的传输类型、最大包长度、查询间隔等字符串描述符提供人们阅读的信息不必需设备限定描述符用于描述设备在不同速度下的通用特性如高速 / 全速仅在设备支持多速度时存在主机枚举时先读取此描述符再获取对应速度的配置描述符。其他速度配置描述符与当前配置描述符一一对应存储设备在非当前速度下的配置信息比如设备当前工作在高速模式此描述符则存储全速模式的配置参数。设备{配置{ 配置{ }配置{接口{ }接口{ }接口{端点{ }端点{ }端点{ }}}}。设备→配置→接口→端点。如果一个设备的各种描述符成功返回代表着成功一大半。描述符不能出现错误否则无法正常工作USB设备的枚举过程枚举就是从设备读取各种描述符信息。得知设备是什么类型的设备USB传输模式控制传输建立过程都由主机发送、可选的数据过程及状态过程。建立过程起始于SETUP令牌包→DATA0数据包→数据过程读传输输入数据写传输输出数据数据长度为0没有数据过程→状态过程读传输输出数据包写传输输入数据包状态过程用来确认数据是否正确传输完成。复位与获取设备描述符0 地址阶段设置地址主机分配一个唯一的 7 位设备地址给该设备。设备收到新地址必须等待主机发送ACK令牌包才能启用新地址再次获取设备描述符主机切换新地址发送建立过程获取配置描述符HID设备报告描述符USB是串行总线数据是一位一位进行传输的LSB在前最先出来的是最低位数据传输方向从设备到主机称为输入主机到从设备成为输出。USB总线传输数据以包为单位不同类型的包包含不同类型的域包都以同步域开始由一个包标识符PID和包结束符EOP来结束这个包同步域开始传输数据用来同步数据时钟同步域→标识符PID→结束符EOPPID标识一个包的类型一共8位其中USB协议使用的只有4位0~3另外4位是0~3的取反用来校验PID。PID 类型PID 名称PID[3:0]说明令牌类 (Token)OUT0001B通知设备将要执行输出传输主机 → 设备IN1001B通知设备将要执行输入传输设备 → 主机SOF0101B帧起始包用于同步 USB 总线时序全速每 1ms、高速每 125μs 发送一次SETUP1101B通知设备启动控制传输用于设备枚举、配置等核心流程数据类 (Data)DATA00011B基础数据包与 DATA1 交替保证传输可靠性DATA11011B基础数据包与 DATA0 交替用于传输同步DATA2*0111B高速 / 等时传输专用数据包MDATA*1111B多字节 / 等时传输专用数据包握手类 (Handshake)ACK0010B确认数据接收成功NAK1010B不确认设备暂时无法发送 / 接收数据STALL1110B挂起设备端点错误 / 不支持当前请求特殊类 (Special)NYET*0110B未准备好高速设备批量传输专用用于流量控制PRE1100B前导令牌包用于低速 / 全速设备在高速总线上的兼容通信ERR*1100B错误握手包高速 / 分裂事务专用用于错误通知SPLIT*1000B分裂事务令牌包用于高速主机与低速 / 全速设备通信PING*0100BPING 测试令牌包用于批量传输流量控制避免 NAK 风暴—0000B保留未使用EOP大约为2个数据低位SE0SE0D、D-都保持低电平状态4种包令牌包用来启动USB传输主机发送一个令牌包来通知那个设备响应输出令牌包OUT用来通知设备将要输出一个数据包输入令牌包IN用来通知设备返回一个数据包建立令牌包SETUP只用在控制传输中用来通知设备将要输出一个数据包设备必须要接收帧起始包SOF以广播形式发送所有的USB设备都可以接到到SOF包令牌包类型字段 1字段 2字段 3字段 4字段 5字段 6SOF 令牌包同步域8 位包标识 PID11 位帧号5 位 CRC5 校验EOPOUT/IN/SETUP 令牌包同步域8 位包标识 PID7 位地址域4 位端点域5 位 CRC5 校验EOP同步域用于收发端时钟同步帧号USB帧编号用于时间同步数据包传输数据USB数据包同步域8 位包标识 PID字节 0字节 N16 位 CRC16 校验EOP8位标识PID标识数据包类型DATA0/DATA1/DATA2/DATA_M用于传输同步、重传控制自带 4 位取反校验用在当握手包出错时纠错。数据域0~1024 字节字节 0~ 字节 N承载实际传输的有效业务数据长度由 USB 传输类型控制 / 批量 / 中断 / 等时决定16位CRC16校验仅对数据域内容做完整性校验不包含PID。握手包用来表示一个传输是否被对方确认握手包同步域包标识PIDEOP握手包有ACK、NAK、STALL、NYET。ACK主机 / 设备正确接收数据且有足够空间容纳数据NAK仅设备无数据需要返回或数据正确接收但无足够空间容纳STALL仅设备无法执行请求或端点已挂起错误状态)NYET仅设备USB2.0 高速本次数据成功接收但无足够空间接收下一次数据特殊包特殊场合使用的包特殊包类型横向结构字段核心用途 / 适用场景PRE(前缀令牌包)同步域 8 位包标识 PID EOP通知集线器打开低速端口仅全速模式使用以全速模式发送ERR(错误握手包)同步域 8 位包标识 PID EOPUSB2.0 新增在高速分裂事务中表示错误使用SPLIT(高速分裂令牌包)同步域 8 位包标识 PID 附加控制域 EOPUSB2.0 新增高速事务分包实现高速设备与全速 / 低速设备的交互PING(探测令牌包)同步域 8 位包标识 PID 7位地址域4位端点域 EOPUSB2.0 新增仅批量 / 控制传输输出事务不发数据仅收 ACK/NAK 判断空间如何处理数据包USB 数据包处理由接口芯片自动化完成软件仅需配置芯片操作端点读写数据。依据芯片标志判断传输状态成功 / 失败 / 忙。无需关注 CRC、位填充、握手等底层协议细节。USB的4种传输类型USB定义了数据在总线上传输的基本单位是包但是我们不能随意的使用包来传输数据必须按照一定的关系把这些不同的包组织成事务transaction才能传输USB事务令牌包、数据包、握手包令牌包启动一个事务由主机发送数据包传送数据方向由令牌包来指定握手包通常由数据接收者发送当数据接收正确后发送握手包或者没准备接受发送NAK批量传输使用批量事务传输数据一次批量事务有三个阶段令牌包阶段、数据包阶段、握手包阶段。每个阶段都是一个独立的包。批量传输分为批量读批量输入事务和批量写批量输出事务批量传输通常用在数据量大、对数据的实时性不高的场合。例如USB打印机、扫描仪大容量存储设备等。批量输出事务主机先发出一个OUT令牌包携带目标设备地址、端点号发起数据传输请求再发送DATA 数据包DATA0/DATA1由数据切换位决定承载实际业务数据主机切换为接收模式等待设备响应设备校验数据后根据状态返回对应握手包。由主机完全主导设备被动响应批量输入事务主机发送IN 令牌包携带目标设备地址、端点号主动请求设备返回数据主机切换为接收模式等待设备发送数据设备校验地址 / 端点无误后组装并发送DATA 数据包DATA0/DATA1由数据切换位决定设备发送数据后等待主机响应主机校验数据后根据状态返回对应握手包。在批量输入事务中主机检测到设备发送NCK或者STALL之后主机不作回应USB协议规定主机禁止使用NAK设备等待超时进入下一轮。USB2.0新增PING令牌机制特性细节说明核心目的解决 USB 1.1 中 IN 事务无缓冲区反馈导致的带宽浪费包结构仅含同步域 PIDEOP无数据域结构与 IN 令牌包一致工作流程主机先发 PING 包试探 → 设备返回 ACK/NAK/STALL → 确认有空间后再发 IN 包获取数据适用场景仅 USB 2.0 高速环境用于批量 / 控制传输的输入事务提升总线利用率平时无数据传输时总线处于空闲状态。当需要传输一次事务时主机发送一个令牌包可以是OUT令牌包IN令牌包或者是PING令牌包。如果设备解码令牌包出错时总线直接进入空闲状态一次正确批量输入事务发送主体包类型主机发送IN 令牌包同步域IN PID7 位地址4 位端点号5 位 CRC5 校验EOP设备返回DATA0 数据包同步域DATA0 PID字节 0字节 116 位 CRC16 校验EOP主机应答ACK 握手包同步域ACK PIDEOPDATA0和DATA1交替一次批量输出事务发送主体包类型主机发送OUT 令牌包同步域OUT PID7 位地址4 位端点号5 位 CRC5 校验EOP主机发送DATA0 数据包同步域DATA0 PID字节 0字节 116 位 CRC16 校验EOP设备应答ACK 握手包同步域ACK PIDEOP中断传输周期传输、是一种保证查询频率的传输主机保证在不大于某个时间间隔内安排一次传输主机按端点描述符的查询间隔轮询固定频率中断传输用在数据量不大对时间要求较严格的设备中例如人机接口设备HID中的鼠标、键盘等中断传输还可以用来不断地检测某个状态当条件满足后在使用批量传输来传送大量的数据。无PING、NYET中断事务流程等时传输周期传输、用在数据量大、实时性要求高的场合对数据延迟很敏感例如音频或者视频设备对少量数据错可以容忍但是不能停顿。当数据错误时并不进行重传操作因此等时传输没有应答包。控制传输分为三过程建立过程、可选的数据过程、状态过程建立过程使用一个建立事务建立事务是一个输出数据的过程数据包类型仅支持DATA0数据包仅允许ACK应答出错无响应。数据过程是可选的一个控制传输可能没有数据过程如果有一个数据过程可以包含一笔或者多笔数据事务。在数据传输过程中所有的数据事务必须是同一个传输方向的输入传输或者输出传输一旦传输方向发生改变就会认为进入到了下一个过程。状态过程是一笔批量事务要保证数据传输过程的数据完整性设备枚举过程中各种描述符的获取以及设置地址、设置配置等都是通过控制传输来实现的。阶段必要性核心作用事务类型数据包规则数据方向建立过程Setup Stage强制必须有发送控制请求如设置地址、获取描述符等SETUP 事务输出仅用DATA0包主机→设备输出数据过程Data Stage可选可无传输控制请求对应的业务数据批量输入 / 输出事务首包用DATA1之后 DATA0/DATA1 交替方向全程统一控制读设备→主机输入控制写主机→设备输出状态过程Status Stage强制必须有确认传输完成状态反馈批量事务仅用DATA1包与数据阶段方向相反控制写输入 IN控制读输出 OUT端点类型域传输类型的关系一个具体的端点只能工作在一种传输模式下。通常我们把工作在什么模式下的端点就叫做什么端点。例如控制端点、批量端点等。 端点 0 是每个 USB 设备都必须具备的默认控制端点它一上电就存在并且可用。设备的各种描述符以及主机发送的一些命令都是通过端点 0 传输的。其他端点是可选的需要根据具体的设备来决定。非 0 端点只有在 Set Config 之后才能使用。每个 USB 端点的端点描述符中会明确规定该端点支持的最大数据包长。主机向该端点发送数据时单次发送的数据包长度绝对不能超过该端点的最大包长限制否则会导致传输错误。传输类型低速模式 (Low-Speed)全速模式 (Full-Speed)高速模式 (High-Speed)核心适用场景控制传输固定为8 字节可在8/16/32/64 字节中选择固定为64 字节设备枚举、配置、状态控制所有 USB 设备必须支持等时传输❌ 不支持最大上限1023 字节最大上限1024 字节实时低延迟数据音频、视频流中断传输最大上限8 字节最大上限64 字节最大上限1024 字节小数据量、低延迟交互鼠标、键盘、HID 设备批量传输❌ 不支持可在8/16/32/64 字节中选择固定为512 字节大容量非实时数据U 盘、打印机、存储设备在USB中采用的是D、D-两条线的电位差重复发送规律的电平来进行时钟的同步反向不归零编码遇见0有电平的跳变遇1没有电平的跳变。波形有跳变代表着传输的是0波形无变化代表传输的是1。要是发送很多1发送方在发送6个1之后必须要插入1位填充。所有传输都是bit0先传输LSB事务→包→域→bitD12芯片读取流程拉低片选A0地址线用于选择命令还是数据WR-N写信号上升沿稳定才可写入RD-N读选通信号拉低有效拉高结束读信号写命令A0设置命令状态将写信号拉低发送的数据拉高写信号写完后将总线设置输入状态避免总线冲突USB识别分为电气识别和协议识别电气识别主要是识别设备是高速、全速还是低速设备协议识别就是区分USB设备属于哪种USB的Class比如CDC设备MSC设备、HID设备

更多文章