当前位置: 首页 > article >正文

USB 鼠标的实现

文章目录

    • 前言
    • 5 USB 标准请求
      • 5.1 USB 标准设备请求的结构
      • 5.2 GET_DESCRIPTOR 请求
      • 5.3 SET_ADDRESS 请求
      • 5.4 SET_CONFIGURATION 请求
    • 6 设备描述符的实现
    • 9 配置描述符集合的结构
      • 9.1 配置描述符结构
      • 9.2 接口描述符的结构
      • 9.3 端点描述符的结构
      • 9.4 HID 描述符的结构
      • 9.5 [示例:描述符]
    • 11 字符串及语言 ID 请求的实现
    • 13 报告描述符的结构及实现

《圈圈教你学 USB》第 3 章学习笔记

前言

说明:本文章节顺序按照 《圈圈教你学USB》 一书的学习顺序来组织,其中跳过了硬件代码相关的章节。

参考:

  • 1)《圈圈教你学USB》2009 年第 1 版

  • 2)B 站 沁恒微电子《USB技术应用与开发》:https://www.bilibili.com/video/BV1d5411J74M

  • 3)USB 官网(直接搜索 usb 或 hid):

    • 《USB 2.0 Specification》:https://www.usb.org/document-library/usb-20-specification
    • 《Device Class Definition for HID 1.11》:https://www.usb.org/document-library/device-class-definition-hid-111

5 USB 标准请求

USB 协议定义了一个 8 字节的标准设备请求,主要用在设备的枚举过程中,是在控制传输的SETUP(建立)过程中,通过默认控制端点 0 发出的。

  • 可参考:https://www.usbzh.com/article/detail-417.html

5.1 USB 标准设备请求的结构

1)标准设备请求的结构:

2)标准设备请求:

3)bRequest 请求代码如下表:

4)描述符类型(Descriptor Types)如下表:

上述内容除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.3 小节

5.2 GET_DESCRIPTOR 请求

示例:80 06 00 01 00 00 40 00
来源:https://www.bilibili.com/video/BV1d5411J74M 第三讲的 06:31 处。

80    表示请求输入,即设备到主机
06    表示 GET_DESCRIPTOR,获取描述符
00 01 低字节 00 表示索引号为 0;高字节 01 表示请求的描述符类型为 1,即设备描述符
00 00 wIndex 域只在获取字符串描述符时有用,表示字符串的语言 ID 号,除此外值为 0
40 00 应该为 0x0040,表示请求的设备描述符长度为 0x40,即 64 个字节

5.3 SET_ADDRESS 请求

示例:00 05 0B 00 00 00 00 00
来源:同上。

00    表示请求输出,即输出待设置的地址 
05    表示 SET_ADDRESS
0B 00 表示设置地址为 000B
00 00 未使用
00 00 无数据

设备收到设置地址请求时,直接进入状态过程,等待主机读取 0 长度的状态数据包。
主机成功读取状态数据包且用 ACK 响应后,设置启用新地址。

5.4 SET_CONFIGURATION 请求

示例:00 09 01 00 00 00 00 00
来源:视频 12:36 处

00    表示请求输出,即设置配置
09    表示 SET_CONFIGURATION 
01 00 0x0001,表示选中配置编号为 1 的配置。
00 00 
00 00 

6 设备描述符的实现

设备描述符的结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.1 小节)

示例:当我们请求设备描述符时,设备返回的数据为:12 01 10 01 00 00 00 08 3C 41 07 21 15 01 01 02 00 01
来源:视频 08:01 处

12    表示描述符长度为 0x12,即 18 个字节
01    表示描述符类型为 01
10 01 表示 USB 协议版本为 USB 1.1,如 0x0200 为 USB2.0
00    
00 
00 
08    端点 0 最大包长为 8,可取值为 8,16,32,64
3C 41 表示厂商 ID 为 0x413C
07 21 表示产品 ID 为 0x2107
15 01 表示设备版本号为 1.15
01    
02
00    
01    表示设备有多少种配置

关于厂商 ID:
需要向 USB 申请,我们可以去 https://www.usb.org/developers 查看,去 “Valid USB Vendor ID Numbers” 里下载一个文档,根据上述厂商 ID 来查询该设备的生产商。

9 配置描述符集合的结构

每个 USB 设备至少有一个配置描述符。设备描述符中指明该设备有多少种配置。

9.1 配置描述符结构

配置描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.3 小节)

bmAttributes 可取值为:

bit7:    保留,设置为 1
bit6:    0,设备由总线供电;1,设备自供电。
bit5:    是否支持远程唤醒
bit[4:0]:保留,设置为 0

示例:配置描述符集合(视频 12:28 处)

# 获取配置描述符 9 个字节(解析见 GET_DESCRIPTOR 请求)
80 06 00 02 00 00 09 00

# 设备返回的配置描述符
09    表示描述符长度为 9
02    表示描述符类型,配置描述符为 0x02
22 00 表示配置描述符集合总长度为 0x0022,即 34 字节
01    表示该配置支持的接口数为 1(功能单一设备只有一个接口,而复合设备有多个接口,如音频设备)
01    表示配置的值,每个配置的标识(设置配置时,如果匹配该配置值,则表示选中该配置)
00    表示字符串索引值,0 表示没有字符串
A0    表示设备属性。
32    表示设备需要从总线获取的最大电流量,单位 2mA。这里表示 0x32*2=100mA

9.2 接口描述符的结构

接口描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.5 小节)

9.3 端点描述符的结构

端点描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.6 小节)

bEndpointAddress 说明:

bit7:    传输方向。1,输入;0,输出;
bit[6:4]:保留
bit[3:0]:端点号

bmAttributes 说明:

bit[7:6]:保留。
bit[5:4]:等时传输时表示用途。0,数据端点;1,反馈端点;2,数据端点;3,保留。其它传输时保留。
bit[3:2]:等时传输时表示同步类型。0,无同步;1,异步;2,适配;3,同步。其它传输时保留
bit[1:0]:传输类型。0,控制传输;1,等时传输;2,批量传输;3,中断传输。

9.4 HID 描述符的结构

HID 描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.1 小节)

关于 bDescriptorType:表示 HID 描述符类型时为 0x21;表示下级描述符类型时,0x22 表示报告描述符,0x23 表示物理描述符。

9.5 [示例:描述符]

示例:配置描述符(视频 12:32 处)

# 获取配置描述符 34 个字节(解析见 GET_DESCRIPTOR 请求)
80 06 00 02 00 00 22 00

# 设备返回
# (1)配置描述符
09    表示描述符长度为 9
02    表示描述符类型,配置描述符为 0x02
22 00 表示配置描述符集合总长度为 0x0022,即 34 字节
01    表示该配置支持的接口数为 1(功能单一设备只有一个接口,而复合设备有多个接口,如音频设备)
01    表示配置的值,每个配置的标识(设置配置时,如果匹配该配置值,则表示选中该配置)
00    表示字符串索引值,0 表示没有字符串
A0    表示设备属性。
32    表示设备需要从总线获取的最大电流量,单位 2mA。这里表示 0x32*2=100mA

# (2)接口描述符
09    长度
04    类型,0x04 表示接口描述符
00    接口编号,从 0 开始
00    接口备用编号
01    接口使用的端点数(不包括端点 0)
03    接口使用的类
01    接口使用的子类
01    接口使用协议
00    接口字符串索引

# (3)HID 描述符
09    长度
21    类型,0x21 表示 HID 描述符
10 01 HID 协议版本,1.1
00    国家代码
01    下级描述符数量为 1
22    下级描述符类型为 “报告描述符”
41 00 下级描述符长度为 65 个字节 

# (3)端点描述符
07    长度
05    类型,0x05 表示端点描述符
81    端点地址。表示输入且端点号为 1
03    端点属性。表示中断传输
08 00 端点支持的最大包长,这里为 0x0008
0A    端点查询时间

11 字符串及语言 ID 请求的实现

USB 协议中,字符串描述符是可选的。描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《USB_20.pdf》 第 9.6.7 小节)

13 报告描述符的结构及实现

报告描述符结构:(除《圈圈教你学USB》外的可查询出处:USB 2.0 协议规范 《Device Class Definition for HID 1.11》 第 6.2.2 小节)


http://www.kler.cn/news/341756.html

相关文章:

  • Windows系统安装Docker
  • nacos源码修改持久化到postgreSQL数据库
  • minio集群部署
  • 计算机毕业设计 基于Python的老年人健康预警系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • LinuxO(1)调度算法
  • 基于补全学习的时空数据自适应模型演化系统ComS2T
  • 简单认识 redis -数据类型命令
  • 鸿蒙开发(NEXT/API 12)【硬件(获取智慧出行连接状态)】车载系统
  • 数据库表操作
  • Unity3d动画插件DoTween使用指南
  • JeeSite 权限分配
  • 【ROS】机器人系统仿真-URDF集成Rviz基本流程
  • python全栈开发是什么?
  • mac配置python出现DataDirError: Valid PROJ data directory not found错误的解决
  • 机器学习:神经网络与深度学习的原理、应用场景及优缺点
  • C++模版SFIANE应用踩的一个小坑
  • 复杂项目管理难?试试用WBS分解法,结构化细分你工作
  • 【Webpack--020】Babel辅助代码块引入
  • 系统架构设计师③:数据块系统
  • redistemplate实现点赞相关功能