USB 鼠标的实现

news/2024/10/10 13:07:35

目录
  • 前言
  • 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.ryyt.cn/news/69765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

USB 概述及协议基础

《圈圈教你学 USB》第 1 章学习笔记1 USB 是什么?1)USB(Universal Serial Bus,通用串行总线)2 USB 的特点1)USB 协议版本与速度:来源:https://www.usbzh.com/article/detail-199.html2)开发 USB 常用网站: https://www.usb.org3 USB 的拓扑结构USB 是主从结构,主机为…

AI云平台介绍

AI云平台是基于云计算基础设施,集成机器学习、深度学习、自然语言处理、计算机视觉等先进AI技术,通过云端服务的形式,向用户提供数据预处理、模型训练、模型部署、预测推理等一系列AI开发与应用服务的平台。AI云平台是基于云计算基础设施,集成机器学习、深度学习、自然语言…

无人直播自动化回复客户咨询

我们插件是根据页面元素变动进行自动化操作的,想要实现网页版自动化,必须了解html以及dom结构,还有xpath定位方法。 各大直播后台页面结构不一样,所以要进行兼容处理,我们一个插件支持以下直播或客服平台 唯一客服浏览器插件 十年开发经验程序员,离职全心创业中,历时三年…

【日记】生巧好好吃!(701 字)

正文今天才发现昨天寒露。不过昨天很冷,今天倒挺暖和,太阳很好。下午上班,觉得这么好的太阳不做点什么很亏,于是转身回去拿了被子。晚上下班去收,被子上面落的全是桂花。那时候天色已暗,天边有一种低沉但通透的蓝。一般这种时候温度都很低了。秋天真的到了啊……主管买的…

UE4.26 Emissive Decal(发光贴花)模拟Light Function

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!主要是想用Emissive Decal(发光贴花)来模拟出SpotLight的Light Function效果。 原因是SpotLight的Light Function依赖于阴影,而SpotL…

APP上架大陆应用商店记录

重点自己的手机APP想要上架到国内的应用市场必须要进行ICP备案 部分平台需要电子软著信息 大部分应用商店上架需要准备好合规的隐私政策电子软著 其中包含【APP电子版权认证证书】、【计算机软件著作权登记证书】两个证书 最便捷的方式是找专业人士带跑流程,根据时长分为不同的…

搭建Redis哨兵集群并使用RedisTemplate实现读写分离

一、理论相关通过上篇博客:搭建Redis“主-从-从”模式集群并使用 RedisTemplate 实现读写分离,我们已经搭建好了Redis“主-从-从”模式集群并且实现读写分离,这里会出现几个问题:如果主库宕机了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就…

唯一客服浏览器插件: 视频号直播自动回复与循环发送话术-自动化插件

唯一客服浏览器插件 gofly.v1kf.com 我们在做视频号直播的时候,会有这种自动回复咨询问题的功能唯一客服浏览器插件现在就支持,在视频号直播后台,自动化回复用户问题,以及循环发送我们的介绍话术 十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》…