USB协议详解第30讲(USB枚举过程详解及抓包分析)

news/2024/10/30 14:29:32/文章来源:https://www.cnblogs.com/linhaostudy/p/18515762

当USB设备连接到或从USB中移除时,主机使用总线枚举过程来识别和管理接入的设备。当USB设备连接到一个已经被上电的端口,采取以下顺序行动:

1.设备上电

用户把USB设备插入USB端口(主机下的根hub或主机下行端口上的hub端口)或系统启动时设备上电。此时,USB设备处于加电状态,它所连接的端口是无效的。

2.Hub检测电压变化,报告主机

hub会实时监测端口的电平变化,一旦HUB检测到端口有电压变化,hub将利用自己的中断端点将信息反馈给主控制器,告诉主机有设备连接。

3.主机了解连接设备

如果有连接/断开事件发生,那么主机会发送一个 Get_Port_Status请求给hub以了解此次状态改变的确切含义。Get_Port_Status等请求属于所有hub都要求支持的hub类标准请求,hub相关的标准我们暂时不研究,大家知道这一点就好。

4.主机检测所插入的设备是全速还是低速

hub通过检测USB总线空闲时的差分线的高低电压来判断所连接设备的速度类型,当host发来Get_Port_Status请求时,hub就可以将此设备的速度类型信息回复给host。USB 2.0规范要求速度检测要先于复位(Reset)操作。

根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。如下图。

5.主机通过hub复位设备

主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。然后主机控制器就向hub发出一个 Set_Port_Feature请求让hub复位刚才设备插上的端口。hub通过驱动数据线到复位状态(D+和D-全为低电平 ),并持续至少10ms。当然,hub不会把这样的复位信号发送给其他已有设备连接的端口,所以其他连在该hub上的设备自然看不到复位信号,不会受影响。hub集线器具体电路实现原理大家可以进行搜索查看。

6. 主机进一步检测全速设备是否是支持高速模式

因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。同样的,从设备的角度来看,如果是一个高速设备,在刚连接到hub时或上电只能用全速模式运行。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作

7.通过Hub建立主机和设备之间的信息通道

主机不停地向hub发送Get_Port_Status请求,以查询设备是否复位成功。Hub返回的报告信息中有专门的一位用来标志设备的复位状态。当hub撤销了复位信号,设备就处于默认/空闲状态(Default state),准备接收主机发来的请求。设备和主机之间的通信通过控制传输管道,默认管道为地址0、端点0。此时,设备能从总线上得到的最大电流是100mA此后主机就可以通过默认控制管道和设备进行控制传输。

8.主机获取默认控制管道的最大数据包长度

默认管道其实连接到设备一端其实就是端点0。主机此时发送的请求是默认地址0,端点0,虽然所有未分配地址的设备都是通过地址0来获取主机发来的请求,但由于枚举过程不是多个设备并行处理,而是一次枚举一个设备的方式进行,所以不会发生多个设备同时响应主机发来的请求。

主机会发送Get_Descriptor获取设备描述符,设备描述符的第8字节代表设备端点0的最大包大小,只有知道端点0 的最大包长度,才知道一次控制传输要从设备请求多少字节数据。

9.主机请求hub再次复位设备

Get_Descriptor获取设备描述符请求成功,系统会要求hub对设备进行再一次的复位操作(USB规范里面可没这要求),再次复位的目的是使设备进入一个确定的状态。

10.主机给设备分配一个新地址

主机控制器通过Set_Address请求向设备分配一个唯一的地址。在完成这次传输之后,设备进入地址状态,之后就启用新地址与主机通信。这个地址对于设备来说是终生制的,设备在,地址在;设备消失(被拔出,复位,系统重启),地址被收回。同一个设备当再次被枚举后得到的地址不一定是上次那个了。

11.主机获取并解析设备描述符信息

主机发送Get_Descriptor请求读取设备描述符,这次主机发送Get_Descriptor请求使用新地址,它会解析设备描述符的每一项内容。设备描述符内信息包括端点0的最大包长度、设备所支持的配置个数、设备类型、VID、 PID、字符串索引等信息。如下图所示。

12.主机获取字符串描述符

根据如果有字符串描述符,主机会获取语言ID描述符和字符串描述符。

13.主机获取标准配置描述符

主机发送Get_Descriptor_Configuration请求并解析标准配置描述符,标准配置描述符内信息包括配置描述符集合长度、接口数、设备属性、设备所需电流。如下图所示。

14.主机获取配置描述符集合

配置描述符集合包括标准配置描述符、接口描述符、端点描述符,如果是HID设备还会包括HID描述符,主机会根据上面得到的标准配置描述符的wTotalLength,发送了一个Get_Descriptor_Configuration请求获取到配置描述集合并解析所有描述符,从而知道设备到底是什么样的设备。

15.主机为设备挂载驱动并选择一个配置

主机通过解析描述符后对设备有了足够的了解,会选择一个最合适的驱动给设备,现在就将控制权交到设备驱动了。对于复合设备,通常应该是不同的接口配置给不同的驱动。

主机发送Set_Configuration请求来正式确定选择设备的哪个配置作为工作配置(对于大多数设备来说,一般只有一个配置被定义)。至此,设备处于配置状态(Configured)。

16.USB枚举抓包图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824144.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ccs的介绍,安装和使用入门

第一章:ccs的介绍,下载和安装 01:ccs介绍 工欲善其事必先利其器,如果你正在打算学习DSP,那么需要准备以下三个东西: 1) DSP开发板,当然任何具有DSP最小系统的板子都是可以的; 2) 仿真器,仿真器用来将程序烧写到DSP中,同时具备在线仿真调试的功能; 3) 编译环境CCS…

2024-10-29

多表查询 内连接外连接子查询

多租户系统的核心概念模型

大家好,我是汤师爷~ 让我们深入探讨一下多租户系统的概念模型。概念模型是多租户系统的"骨架",帮助我们理解系统各部分的组织和运作方式。 多租户的核心概念模型租户:通常指一个企业客户,不同租户之间的数据和行为是相互隔离的。 用户:某个租户内的具体使用者,…

【笔记】【Android】Activity的Task模式

【笔记】【Android】Activity的Task模式 笔记系列,内容是从网络搜索的结果,不一定是正确的理解。 如果存在谬误,欢迎大家指正。 Task 一个应用可能会包含多个Activity,管理这些Activity顺序的容器,就是Task。当Activity1拉起Activity2时,Task会将Activity2压栈,将显示Ac…

USB协议详解第28讲(USB硬件设计和热拔插原理)

1.USB引脚接线定义 对于四线制的USB,即USB1.0、USB1.1和USB2.0,USB硬件接口有4根接线,如下图。引脚 名称 电缆颜色 描述1 VBUS Red +5 V,电源2 D− White Data −,数据线3 D+ Green Data +,数据线4 GND Black Ground,接地2.低速USB设备硬件设计原理 低速设备端在*D-*上集…

HarmonyOS:应用性能优化实践

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18515687➤如果链接不是为敢技术的博客园…

ARM和X86架构

原文链接:https://zhuanlan.zhihu.com/p/21266987 CPU的这两大架构:ARM和X86。 要了解X86和ARM,就得先了解复杂指令集(CISC)和精简指令集(RISC) 从CPU发明到现在,有非常多种架构,从我们熟悉的X86,ARM,到不太熟悉的MIPS,IA64,它们之间的差距都非常大。但是如果从最基…

HarmonyOS:自由流转介绍

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18515669➤如果链接不是为敢技术的博客园…

manim边学边做--通用二维坐标系

Manim的Axes对象是通用的坐标系对象,之前几篇介绍的数轴和各种坐标平面都是继承Axes对象。 Axes对象的主要作用在于创建和管理二维坐标轴,以满足我们制作数学动画时的各种需求。 具体来说,Axes对象可以帮助我们:定义坐标系:定义一个明确的坐标系,通过设置x轴和y轴的范围、…

SHCTF week1-3

SHCTF week1-3最后一周没时间做了,开摆了. 1zflask robots.txt文件泄露加任意命令执行 import os import flask from flask import Flask, request, send_from_directory, send_fileapp = Flask(__name__)@app.route(/api) def api():cmd = request.args.get(SSHCTFF, ls /)res…

网络流的认识

# 网络流的认识 ## 什么是流网络 网络(`network`)是指一个特殊的有向图 $G = (V,E)$,其与一般有向图的不同之处在于有**容量和源汇点**,不考虑反向边。 其中,我们有以下变量来方便表示: - $S$:源点 - $T$:汇点 - $c(u,v)$:表示从 $u$ 到 $v$ 这条有向边的**容量**为 $…

CF370

废话370:纪念盗笔青春提交记录几个脑残错误后文会提到 3.题目: 黄黄绿蓝蓝( 幸好 370 不是“红红红红红” | “黑黑黑黑黑” ) 算法: 是没有滴 贪心,前缀和 正题 CF370A Rook, Bishop and King 签到数学题 车可以两步到达任意点 ,只需判断出发点与目标点是否在同行 | 同…