USB2.0协议学习笔记---USB工作过程(类的方法)
前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 。 也可以理解为端点构成接口,接口组成配置,配置组成设备。
USB设备的枚举过程
前面说过了,USB只是一种串行通信总线。也就是说USB是一种物理通信通道。但是实际中我们使用了各种各样的USB设备,如U盘,鼠标、键盘等。这些设备都是使用USB总线和主机(PC)进行通信的,但是主机却可以区分不同的设备,这里靠的就是,前面定义的描述符。当我们将USB设备接入主机后主机很快就能知道设备的属性并为其安装对应的驱动,其实在这之前,设备已经和主机进行了很多次数据交换了,这个过程就是枚举。开始了解枚举之前还有明白一个规则,每个USB设备都至少有一个端点即0,这个端点就是USB的控制端点,用来USB设备自己和主机主机间“协商”交换数据用。如端点地址 0x00表示控制输出端点地址,0x80表示控制输入地址。接下来看枚举过程:
- 首先当主机检测到设备插入后就会将USB设备复位,复位后的USB设备默认地址就是0,这样主机就可以用地址0作为设备地址进行通信了。
- 然后主机会向端点0发送获取设备描述符的建立过程,然后设备将在数据过程将设备描述符返回给主机,这里注意如果端点0的最大包长小于设备描述符,设备本应该分多次数据过程,但是主机只会读取第一次的数据,因此设备实际这个过程只需要一次数据过程即使一次无法将设备描述符全部传输。同时USB标准还规定端点0的最小包长至少是8,因为设备描述符的第八个字节就包含了端点0的最大包长,主机会根据这里的值,获取设备的端点0的最大包长。
- 然后主机会再一次对设备复位,然后发送给设备地址0一个设置地址的命令,地址包含在设置设备的建立过程中的数据包中。注意这个地址是由主机管理的(1~127)。设备收到这个命令后直接到状态过程,并在主机请求状态时返回一个长度为0 的状态给主机,如果主机回应了ACK给设备,设备在此之后就将启用这个地址。
- 然后主机使用新地址再次获取设备描述符,这次主机会多次读取设备描述符数据,直到读取完全部的设备描述符。
- 主机再获取配置描述符(设备返回配置描述符时需要将 配置描述符、接口描述符,类特殊描述符、端点描述符一起返回回去,而不能单独返回)。
- 然后是获取报告描述符(如果是HID设备会有这一步)。
- 这一部分不是必然的,设备会根据前面描述符提供的字符串索引获取字符串描述符,从而方便人们阅读设备的相关信息。
以上的这些过程都是使用的USB控制传输。
以上过程忽略了一个概念,就是USB标准请求,即获取描述符是怎么告诉设备的,也有一套标准通信规则如下表:

bRequest的命令码表

具体的请求命令帧组成,可以查阅USB标准文档。这里拿一个不完整的设备枚举过程展示一下设备的枚举过程,数据使用BusHound 软件抓包得到的。
//获取设备描述符
CTL 80 06 00 01 00 00 12 00
//设备返回设备描述符
IN 12 01 00 02 00 00 00 40
93 39 16 14 00 02 01 02 03 01
//先获取设备配置描述符的前9个字节 == 获取知配置描述符的总长度
CTL 80 06 00 02 00 00 09 00
//设备返回配置描述符的前9个字节 == 得知配置描述符的总长度为0x29(41个字节)
IN 09 02 29 00 01 01 00 c0 64
//获取全部配置描述符
CTL 80 06 00 02 00 00 29 00
//设备返回全部配置描述符其中还包括接口配置描述符和断点配置描述符(因为是HID设备还有一个HID设备配置描述符)
IN 09 02 29 00 01 01 00 c0 64 09 04 00 00 02 03 00 00 00 09 21
10 01 00 01 22 21 00 07 05 81 03 40
00 01 07 05 01 03 40 00 01
//设置配置值,配置描述符中有一个位置就是配置这个值的
CTL 00 09 01 00 00 00 00 00
//获取接口
CTL 21 0a 00 00 00 00 00 00
//获取HID设备配置描述符
CTL 81 06 00 22 00 00 61 00
//设备返回全部HID设备报告配置描述符
IN 05 8c 09 01 a1 01 09 03 15 00 26 00 ff 75 08 95 40 81
02 09 04 15 00 26 00 ff 75 08 95 40 91 02
c0
上面大概说了一下设备的枚举过程,如果以上过程完成了即---在电脑中可以看到一个USB设备了,接下来就是完成对应的用户数据传送过程的应用逻辑代码的实现了,这个根据不同的设备包括自定义设备,这一部分除非是一些标准设备,否则你可以做的很有个性化,只要收发双方约定一个统一的标准规则就可以。但是需要记住的是如果你要使用USB进行数据的收发,配置描述符中应该包含一个非0端点的配置,因为端点0是仅用于控制传输的。具体的实现可以详细参考《圈圈教你玩USB(第二版)》一书。
参考:《圈圈教你玩USB(第二版)》
22:17:11 2019-06-04
USB2.0协议学习笔记---USB工作过程(类的方法)的更多相关文章
- USB2.0协议学习笔记---USB数据包结构
USB包类型和传输过程 USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同 ...
- USB2.0协议学习笔记---基本概念
概念 USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...
- USB2.0协议学习笔记---描述符
USB设备描述符 字段名 长 度(字节) 地址偏移 含 义 bLenth 1 0 描述符长度 bDescriptorType 1 1 描述符类型 (这里为 1) ...
- 接口与协议学习笔记-USB协议_USB2.0_USB3.0不同版本(三)
USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔.USB协议版本有USB1.0.USB1.1.USB2.0.USB3.1等,USB2.0目 ...
- usb2.0 规范学习笔记
1.一个USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使 用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一 ...
- HTTP协议学习笔记(四)
HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...
- HTTP协议学习笔记(二)
HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...
- HTTP协议学习笔记(一)
HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...
- HTTP协议学习笔记(三)
HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...
随机推荐
- Git安装/VScode+Git+Github
Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...
- uni-app开发经验分享九: 组件传值
一.父组件向子组件传值 通过props来实现,子组件通过props来接收父组件传过来的值! 1.逻辑梳理 父组件中: 第一步:引入子组件: import sonShow from '../../com ...
- ovs-ofctl命令
用于监控和管理 OpenFlow 交换机. 1. 交换机管理命令 查看交换机信息: ovs-ofctl show s1 查看交换机流表: ovs-ofctl dump-tables s1 查看端口信 ...
- get uuid
https://wx2.qq.com/?&lang=zh_CN /** * 启动二维码登录 */ function doQrcodeLogin() { loginFactory.getUUID ...
- [Python]编码声明:是coding:utf-8还是coding=utf-8呢
PEP 263 -- Defining Python Source Code Encodings | Python.org https://www.python.org/dev/peps/pep-02 ...
- VS Code 使用教程详解
一.写在前面 1.为什么选择 \(VS\) \(code\) 一款非常好用的代码编辑器 标准化 \(Language\) \(Service\) \(Protocol\) 内置调试器和标准化 \(De ...
- CF912A
题意 你手里有 A 个黄水晶和 B 个蓝水晶,其中两个黄水晶可以造一个黄水晶球,三个蓝水晶可以造一个蓝水晶球,一黄一蓝两个水晶可以造一个绿水晶球. 现在你需要 x 个黄水晶球,y 个绿水晶球,z 个蓝 ...
- 通过模拟数据,使用js在前端实现模糊查询下拉框功能实例教程
所谓模糊查询就是通过关键字在数据中匹配到包含关键字的数据,而得出的查询结果.本实例教程讲解在前端文本框输入关键字,显示匹配的数据列表功能. 首先得准备一个文本框和显示数据列表的div元素,html代码 ...
- 谷粒商城为什么要选择后天管理用vue前后端分离,而商城页面选择Thymeleaf类?
1.最初使用jsp开发web项目 还记得刚学习Java的时候,自己开发一个web项目,那时候前后端分离还不流行,为了在页面中显示动态数据,最终的形式也就是以动态网页响应用户,Java一种技术jsp,J ...
- Pytest(16)随机执行测试用例pytest-random-order
前言 通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果. pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码 ...