(请保留-> 作者: 罗冰 https://blog.youkuaiyun.com/luobing4365)
YIE002USB开发板之制作HID设备-USB标准描述符
从软件的角度,制作USB HID设备,需要理解的知识包括几大块:
1) USB协议的基本架构和软件架构;
2) USB描述符,包括标准描述符和类描述符;
3) USB命令,包括标准命令和类命令。
当然,如果能从字节序上(比如USB包的构成)了解USB通信的过程,对理解整个USB协议的构成也很有好处。但在编程中,不需要理解到这个地步。大部分介绍USB协议的书籍,以及USB规范中,都很详细地描述了这些过程,非常建议读一读。
在前一篇中,已经简要地概述了USB协议的基本架构和软件架构。本篇主要介绍USB描述符中的标准描述符,这是所有USB设备都要支持的描述符。
1 USB描述符概述
为了方便USB主机对USB设备进行管理,USB-IF对USB设备的功能采用了分层结构,包括设备层、配置层、接口层和端点层。图1给出了一个复合设备的例子,展示了USB设备的分层结构。

图1 USB设备的功能分层结构
这四层的作用分别为:
- 设备层。说明USB设备的主要类型特征(如设备类别、接口、端点等属性),保障设备枚举过程的正常进行。
- 配置层。选择不同的失败配置满足USB主机对设备功能的选择,可选择复式的设备接口功能,如图1展示的选择鼠标、键盘和游戏杆的复合功能。
- 接口层。将具体功能分类,不同的功能对用不同的操作方式。
- 端点层。针对特定的设备功能,选择不同的端点,提供不同的数据管道,与USB主机进行数据通讯。
为了描述USB设备的这些特征,USB规范定义了相应结构的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符等。表1给出了USB1.1下各种USB描述符的类型值。
表1 USB1.1的描述符类型值
| 类型 | 描述符 | 描述符值 |
|---|---|---|
| 标准描述符 | 设备描述符(Device Descriptor) | 0x01 |
| 配置描述符(Configuration Descriptor) | 0x02 | |
| 字符串描述符(String Descriptor) | 0x03 | |
| 接口描述符(Interface Descriptor) | 0x04 | |
| 端点描述符(Endpoint Descriptor) | 0x05 | |
| 类描述符 | 集线器类描述符(hub descriptor) | 0x29 |
| 人机接口类描述符(HID) | 0x21 | |
| 厂商自定义 | 0xFF |
其他版本的USB规范,还定义了其他类型的描述符,比如USB 2.0中的设备限定描述符(Device_Qualifier)、USB 3.2中的二进制设备对象存储描述符(Binary Device Object Store,简称BOS)等。这些内容在博客中不会涉及,可在USB-IF的官网下载相关的USB规范文档了解。
下面对标准描述符进行详细介绍。
2 USB标准描述符
不管哪种USB设备,都必须提供标准描述符,用于告知主机设备本身的属性。以下介绍的内容,会比较枯燥,建议使用Bus Hound或USB逻辑分析仪等工具,去抓取USB设备的识别和通信包,实际体会这些描述符的用法。
如图2,抓取的是自制的USB HID设备信息。设备描述符中,含有自定义的厂商ID和产品ID,分别为0x8765和0x4321。
<

最低0.47元/天 解锁文章
3749





