首页 > 其他分享 >USB 鼠标的实现

USB 鼠标的实现

时间:2024-10-10 13:00:02浏览次数:7  
标签:表示 00 01 USB 实现 配置 描述符 鼠标

目录

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

前言

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

参考:

5 USB 标准请求

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

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 小节)

标签:表示,00,01,USB,实现,配置,描述符,鼠标
From: https://www.cnblogs.com/luyaocf/p/18455015

相关文章

  • USB 概述及协议基础
    《圈圈教你学USB》第1章学习笔记1USB是什么?1)USB(UniversalSerialBus,通用串行总线)2USB的特点1)USB协议版本与速度:来源:https://www.usbzh.com/article/detail-199.html2)开发USB常用网站:https://www.usb.org3USB的拓扑结构USB是主从结构,主机为Hos......
  • 百度公共IM系统的Andriod端IM SDK组件架构设计与技术实现
    本文由百度技术团队分享,引用自百度Geek说,原题“百度AndroidIMSDK组件能力建设及应用”,本文进行了排版和内容优化。1、引言移动互联网时代,随着社交媒体、移动支付、线上购物等行业的快速发展,对即时通讯功能的需求不断增加。对于各APP而言,接入IMSDK(即时通讯软件开发工具包)能......
  • 搭建Redis哨兵集群并使用RedisTemplate实现读写分离
    一、理论相关通过上篇博客:搭建Redis“主-从-从”模式集群并使用RedisTemplate实现读写分离,我们已经搭建好了Redis“主-从-从”模式集群并且实现读写分离,这里会出现几个问题:如果主库宕机了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就会涉及到三个......
  • 基于C语言编程实现发票四要素查验-医疗票真伪查验API
    发票四要素查验是指通过发票代码、发票号码、开票日期和校验码/金额这四个关键信息来验证发票的真实性。这些要素是每张发票独有的,伪造者很难复制出完全一样的发票。而发票查验接口、医疗票真伪查验API正是基于这一原理,为用户提供了一种便捷、高效的查验方式。首先,发票查......
  • 【免费可视化仪表盘】轻松实现静态/动态数据可视化图表—积木仪表盘
    在当今信息爆炸的时代,如何从海量数据中快速提取关键信息,实现高效决策,成为了企业和个人面临的重大挑战。而积木仪表盘,就如同一位智慧的导航者,为你轻松开启数据可视化的精彩之旅。代码下载https://github.com/jeecgboot/JimuReport技术文档官方网站:http://jimureport.co......
  • tp6发送邮件功能如何实现?tp6的使用教程?
    tp6发送邮件有哪些技巧?tp6发送邮件步骤与设置指南?tp6(ThinkPHP6)作为一款流行的PHP框架,提供了强大的邮件发送功能,使得开发者能够轻松实现这一需求。AokSend将详细介绍如何在tp6中实现邮件发送功能。tp6发送邮件:模板管理在实际应用中,邮件内容通常需要根据不同的场景进行定制......
  • 关于set实现结构体自动去重原理的推论
    转自本人博客,原文链接先说结论在每个操作均为log复杂度的前提下,set无法在判断顺序和重复关键字不同时完成对结构体元素的去重。  首先我们先看这段结构体定义,目的是先按num相等进行去重,再按key降序排列。structnode{intnum;intkey;booloperator<(con......
  • 【精品毕设推荐】基于微信小程序的电影订票系统设计与实现
    点击下载原文及代码,可辅助在本地配置运行......
  • SSM网上订餐系统设计与实现7vu2e 线上下单
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表系统内容;用户,菜品信息,菜品类型开题报告内容一、研究背景与意义随着互联网的快速发展,传统的餐饮模式已难以满足现代社会的快节奏需求。在线订餐系统作为互联......
  • .NET 实现的交互式 OA 系统
    前言近期,我们在后台收到了粉丝们的留言,需要一个高效办公自动化(OA)系统。为了回应大家的期待,今天我们推荐一款既灵活又强大的OA系统解决方案,帮助提升日常办公效率和团队协作水平。在日常工作中,我们经常遇到各种表单。传统的系统开发中,多一个录入界面就意味着要设计一个新的输入......