2024年2月19日发(作者:)
USB HID设备开发简介与实例分析
目录
USB简介 ................................................................................................................................... 2
USB通信机制与设备介绍 ....................................................................................................... 3
2.1 USB通信机制 ............................................................................................................... 3
2.2 USB设备及枚举 ........................................................................................................... 4
HID设备 .................................................................................................................................... 5
3.1 HID设备简介 ................................................................................................................ 5
3.2 HID设备报表描述符 .................................................................................................... 6
3.3 HID设备的访问 ............................................................................................................ 7
总线数据分析软件 ................................................................................................................... 8
4.1 Bus Hound ..................................................................................................................... 8
4.2 USBlyzer ...................................................................................................................... 10
实例分析 ................................................................................................................................. 10
USB简介
USB是通用串行总线(Universal Serial Bus)的缩写,已有20多年历史。主要是为了简化PC与外设的连接,增加易用性。
USB具有即插即用特性,即热插拔。如下图的标准USB接口,电源与地线会突出,在连接时电源与地先接通,然后中间两根信号线再接通,这样防止烧坏芯片。
常见的USB接口:
随着智能手机的兴起,Micro-B型USB接口大量使用,并随之产生了Type-C接口,该接口不分正反面随意插拔,传输速度有明显提升,如下图。
USB协议类型:
随着外设的发展,对接口速度要求越来越高,从USB产生到现在已经经历了5个版本,如下表。
USB通信机制与设备介绍
2.1 USB通信机制
USB是主从结构的系统。主机叫Host,从机叫Device。
通常主机具有一个或多个USB主控制器(host controller)和根集线器(root hub),USB集线器可以对原有的USB接口在数量上进行扩展,但不能扩展出更多的带宽。
USB是主从结构,所有的通信都由主机发起。在USB设备连接主机时,主机能检测到接口电平的变化,进而识别出插入的是什么速度类型的设备。
USB有四种传输类型:
控制传输:USB设备接入主机时,通过控制传输获取设备描述符进行设备识别
批量传输:传输大量数据,如打印机和扫描仪
中断传输:数据少量但实时性高,如鼠标和键盘
等时传输:数据的建立、传送和接收是连续且实时的,对传输延迟非常敏感,如语音传输
控制传输:
在设备的枚举过程中使用控制传输(Control Transaction),分为三个阶段:建立过程,
可选的数据过程及状态过程。
建立过程(SETUP)是由USB主机发起的,开始发一个SETUP令牌包,后面跟一个DATA0数据包,接着就是数据过程;如果控制读传输,那么数据过程就是输入数据,如果控制写传输,那么数据过程就是输出数据。如果在建立过程中指定数据长度为0,则没有数据过程,因此称为可选的数据过程。接着就是状态过程,跟数据过程的传输方向相反,如果是控制读传输,则状态过程是一个输出数据包,如果是控制写传输,则状态过程是一个输入数据包。状态过程是用来确认所有的数据是否都正确传输。
2.2 USB设备及枚举
一个USB设备只有一个设备描述符,设备描述符中决定了该设备有多少种配置,每种配置都有一个配置描述符;在每个配置描述符中又定义了多少接口,每个接口都有一个接口描述符,在接口描述符里又定义了该接口有多少个端点,每个端点有一个端点描述符,端点描述符中定义了端点的大小、类型等。USB的描述符之间的关系是一层一层的。
主机获取描述符时,首先获取设备描述符,接着再获取配置描述符,然后根据配置集合的长度,将配置描述符、接口描述符、特殊描述符、端点描述符一次性读回。字符串描述符(非必需)是单独获取的。
USB设备描述符示例:(定义设备类型,VID,PID,数据包大小等)
主机枚举出的设备描述符如下(USBlyzer抓包软件):
每个USB设备有一个设备地址,USB主机依靠该设备地址访问USB设备。每个设备分
出一些端点,如EP0、EP1.。。等,有了设备地址和端点地址,USB主机就能准确地对端点发送和读取数据了。
USB设备的枚举过程:
USB设备一插入USB主机接口后,主机就加载合适的驱动。
➢ USB主机检测到USB设备插入后,会先对设备进行复位。USB设备在总线复位后其设备地址为0,主机通过地址0和跟接入的设备通信。USB主机往地址为0的设备的端点0(EP0)发送获取设备描述符的标准请求(standard request)(建立过程)。设备收到该请求后,会按照主机请求的参数,将设备描述符返回给主机(数据过程)。主机在成功获取到一个数据包的设备描述符并确认无误后,就会返回一个0长度的确认数据包(状态过程)。 控制读传输
➢ 主机对设备又一次复位,进入到设置地址阶段。USB主机往地址为0的设备的端点0发出设置地址的请求(控制传输的建立过程),新的设备地址包含在建立过程的数据包中。设备地址由USB主机负责管理和分配,USB设备在收到这个建立过程后,就直接进入到状态过程,设备等待主机请求状态返回(一个输入令牌包),设备收到输入令牌包后,设备就返回0长度的状态数据包。如果主机确认该状态数据包已正确收到,就发送答应包ACK给设备,设备在收到这个ACK后 就启用新的设备地址了。以后主机就通过这个新分配的设备地址来访问USB设备。 控制写传输
➢ 主机再次获取设备描述符,使用新的设备地址,获取全部18字节设备描述符
➢ 主机获取配置描述符,获取配置集合
HID设备
3.1 HID设备简介
HID(Human Interface Device, 人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,如键盘鼠标和游戏杆等。HID设备成本较低。另外HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。由于Windows系统内置HID设备驱动程序,因此HID设备接入到Windows系统时,不需要额外安装驱动。
HID设备的内部描述符结构如下:
在接口描述符中,包含了HID描述符,HID描述符中包含报表描述符和可选的实体描述符。
HID设备连接到主机后,主机通过发送Get_Descriptor请求读取HID描述符和报表描述符。
交换的数据储存在称为报表(Report)的结构内,主机通过控制传输和中断传输请求报表来传送和接收数据。HID设备必须有一个中断输入端点来传送数据到主机,中断输出端点则不是必需的。
3.2 HID设备报表描述符
报表描述符(Report Descriptor)是HID设备中的一个描述符。
HID设备是通过报表来给传送数据的,报表有输入报表、输出报表和特征报表三种。输入报表是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据返回给电脑等;输出报表是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等;特征报表是非标准输入输出设备使用的报表,可以在任何方向传递。
报表是一个数据包,里面包含的是所要传送的数据。输入报表是通过中断输入端点输入的,而输出报表有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报表描述符,是描述一个报表以及报表里面的数据是用来干什么用的。通过它,USB
主机可以分析出报表里面的数据所表示的意思。它通过控制输入端点0返回,主机使用获取报表描述符命令来获取报表描述符,注意这个请求发送到接口的,而不是到设备。一个报表描述符可以描述多个报表,不同的报表通过报表ID来识别,报表ID在报表最前面,即第一
个字节。当报表描述符中没有规定报表ID时,报表中就没有ID字段,开始就是数据。
下图为USBlyzer获取的HID报表描述符,包含了输入、输出和特征三种报表。
关于报表描述符,详细参考HID Usage Tables Version 1.12文档。
3.3 HID设备的访问
在HID设备枚举成功后,主机可以对HID设备发起访问,访问通过Set_Report或Get_Report两种方式,Set_Report是主机用来传递数据到设备(输出报表或特征报表可使用),Get_Report是主机用来从设备获取数据(输入报表或特征报表可使用)。
如主机发送64字节数据到HID设备,使用Set_Report控制传输(21 09 00 03 00 00 40
00),其后再接64字节数据。
总线数据分析软件
4.1 Bus Hound
设置要抓包的USB设备(一般勾选自动选择插入的设备)
设备树
自动选择新插入的USB设备
切换到Capture界面中查看原始数据:
4.2 USBlyzer
是一款分析能力更强的USB总线抓包工具。
设置自动捕捉热插拔设备:
原始数据区
设备列表
数据分析区
设备属性
实例分析
单片机固件升级:
主芯片为SONix SN32F247,内置USB控制器及收发器,全速2.0接口,支持7个端点,EP0~EP6,7个端点可共享512字节RAM。此外,该芯片内置Bootloader,进入该模式下可
开始USB固件升级。
其中EP0使用固定的64字节RAM,用来控制传输,实现主机获取各种描述符,由于HID设备只需要接收主机发送的升级包,不需要上传数据,因此不使用中断输入管道。
HID设备报表描述符:
/*********************************************************************/
HID_UsagePage(HID_USAGE_PAGE_CONSUMER),
HID_Usage(HID_USAGE_PAGE_UNDEFINED),
HID_LogicalMin(0x80),
// usage page (consumer)
// usage (consumer control)
// logical minimum (-128)
// logical maximum (+127)
// report count (64)
// report size (8)
HID_LogicalMax(0x7F),
HID_ReportCount(64),
HID_ReportSize(8),
HID_Feature(HID_Data|HID_Variable|HID_Absolute),// feature (data, variable, absolute)
//以上定义了64字节,最小-128,最大127,用来接收升级包,每次64字节
/*********************************************************************/
根据USB通信协议,在HID设备接入PC后,首先设备被枚举,当主机发起请求设备描述符(Get Descriptor)时,会触发设备的 EP0 SETUP事件中断,在中断处理时上传设备描述符,同样地上传配置描述符、接口描述符、端点描述符,这些属于USB设备的标准请求。
在主机与设备通信握手时,主要工作由内置的USB控制器处理了,用户只需要在产生应答(ACK)或总线忙(NAK)时清除相应的中断标志即可。 其余的中断事件有:复位ResetEvent、挂起SuspendEvent、恢复ResumeEvent、EP0端点建立通信EP0SetupEvent、 EP0端点接收数据EP0OUTEvent、EP0端点发送数据EP0INEvent。
HID设备枚举成功后,主机可以发送升级的固件包,将固件包按64字节大小分块,一次传输64字节(Set Report控制传输)。
由于DF60主芯片内部只有8KB SRAM,不能一次性存储整个固件包,因此每接收完16块数据(16*64字节=1024字节)后写入到Flash中,分多次将整个包写入到Flash,完成后设置PC指针指向Flash中的第一条需要执行的地址。新的固件包开始执行。
整个流程如下图所示:
设备接入PC枚举完成主机升级软件将固件包按64字节分块主机启动控制传输发送64字节N固件包传送完?Y主机发送指令执行新的固件包升级结束
参考文档:
【1】Universal Serial Bus Specification Revision 2.0
【2】Device Class Definition for Human Interface Devices(HID) Version 1.11
【3】HID Usage Tables Version 1.12
【4】圈圈教你玩USB
【5】SN32F240/230/220 Series USER’S MANUAL


发布评论