USB枚举的详细流程

USB枚举过程详解 阅读详情

附一个很好的枚举过程的详细流程:

◆ 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态。
◆ 主机检测设备。
◆ 集线器使用中断通道将事件报告给主机。
◆ 主机发送Get_Port_Status(读端口状态)请求,以获取更多的设备信息。
◆ 集线器检测设备是低速运行还是高速运行,并将此信息送给主机,这是对Get_Port_Status请求的响应。
◆ 主机发送Set_Port_Feature(写端口状态)请求给集线器,要求它复位端口。
◆ 集线器对设备复位。
◆ 主机使用Chirp K信号来了解全速设备是否支持高速运行。
◆ 主机发送另一个Get_Port_Status请求,确定设备是否已经从复位状态退出。
◆ 设备此时处于缺省状态,且已准备好在零端点通过缺省通道响应主机控制传输。缺省地址为00h,设备能从总线获取高达100mA的电流。
◆ 主机发送Get_Descriptor(读设备描述符)报文,以便确定最大数据包大小。设备描述符的八个字节是bMaxPacketSize。
◆ 通过发送Set_Address(写地址)请求,主机分配地址,设备此时处于地址状态。
◆ 主机发送Get_Descriptor报文,以获取更多的设备信息。主机通过发送描述符响应设备请求,随后发送全部的次级描述符。
◆ 主机分配并加载设备驱动程序。
◆ 通过发送Set_Configuration(写配置)请求,主机的设备驱动程序选择一个有效配置,设备此时处于配置状态。
◆ 主机为复合设备接口分配驱动程序。
◆ 如果集线器检测到有过流现象,或者主机要求集线器关闭电源,则USB总线切断设备供电电源。在这种情况下,设备与主机无法通信,但设备处于连接状态。
◆ 如果在3毫秒内设备在总线上未见任何动作,则它将进入挂起状态,在挂起状态设备消耗的总线电能最少。

还有一个差不多,如下:

1)集线器检测新设备
主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)
(2)主机知道了新设备连接后
每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。
(3)集线器重新设置这个新设备
当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启(RESET)状态至少10ms。
(4)集线器在设备和主机之间建立一个信号通路
主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信。
(5)集线器检测设备速度
集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。

以下,需要USB的firmware进行干预
(6)获取最大数据包长度
PC向address 0发送USB协议规定的Get_Device_Descriptor命令,以取得却缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。
以下操作雷同,不同操作系统设定时延是不一样的,比如说win2k大概是几毫秒,如果没有反应就再发送一次命令,重复三次。
(7)主机分配一个新的地址给设备
主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地址。从此开始所有通信都使用这个新地址。
(8)主机向新地址重新发送Get_Device_Descriptor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。
(9)主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。
(10)主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。
(11)此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。
(12)根据Device_Descriptor和Device_Configuration应答,PC判断是否能够提供USB的Driver,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。但是Win98却不可以,所以在此时将会弹出对话框,索要USB的Driver。
(13)加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入“配置”状态,并可以和客户软件进行数据传输。
此时,常规的USB完成了其必须进行的配置和连接工作。查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。不过,USB协议还提供了一些用户可选的协议,设备如果不应答,也不会出错,但是会影响到系统的功能。

USB枚举过程分析

一、USB枚举过程分析

1、USB的插入检测

结合智林STM32板上的USB设备接口,分析一下插入检测控制:

wps_clip_image-13161.png

当12脚短接,Q1截止,Q2导通,D+上拉,windows就会认为USB接口有一个全速设备,马上复位总线,并开始枚举设备。

如果23脚短接,则Q1状态取决于USB-DISCONNECT(PD2)脚的状态。CPU复位后,GPIO引脚处于浮空输入状态。所以此时,Q1导通,Q2截止,主机检测不到设备。

在程序初始化了USB相关部分后,可以通过设置 PD2=0 低电平使Q1截止,Q2导通。则USB检测到设备,开始枚举过程。

所以要控制开发板作为USB设备工作,必须23短接。

2、枚举过程中,第一个来回的详细分析。

检测到设备,主机发总线复位。这个复位与USB上电复位和系统复位是不同的。这个是SIE根据总线状态通知用户的一种复位。设备产生复位中断,如何处理由设备固件程序决定。

主机发起第一个控制传输:

(1)主机SETUP包(发往地址0端点0)、主机数据包(请求设备描述符)、设备握手包ACK。

设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在端点0输入缓冲区准备好设备描述符。

(2)数据过程,主机先发一个IN令牌包、设备发一个数据包(这个数据已经准备好,SIE收到IN令牌后,直接送到总线上,用户此时不干预)、主机发ACK包。

此时SIE产生端点0数据输入中断,表明主机已经取走了设备所准备的数据,用户也可以在该中断处理程序中作自己的处理。

此时,主机只接受一次数据,最少8个字节。如果用户数据没有发完,又在控制端点输入缓冲区,准备了数据,主机也不理会。

(3)状态过程:主机发OUT包(通知设备要输出)、主机发0字节状态数据包(这个是0字节,表明自己收到设备描述符)、设备发握手ACK包。

此时设备不会产生端点0数据输出中断,此时没有数据。

3、枚举过程中,第二个来回:设置地址。

第一个来回成功以后,主机再次复位总线。进入地址设置控制传输阶段。

(1)主机SETUP包(发往地址0端点0)、主机数据包(请求设置地址)、设备握手包ACK。所以SETUP包后面都会跟一个表明主机SETUP目的的数据包,要么GET,要么SET。

设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在根据主机发来的地址写入自己的地址控制寄存器。

(2)数据过程,本次传输没有数据。

(3)状态过程:主机发IN包(通知设备要返回数据)、设备发0字节状态数据包(表明地址设置已经成功)、主机发握手ACK包(地址设置已经生效)。

此时设备不会产生端点0数据输入中断,此时没有数据。

3、枚举过程中,第三个来回:主机使用新地址获取完整的设备描述符。

主机采用新地址发起第一个控制传输:

(1)主机SETUP包(发往新的地址端点0)、主机数据包(请求设备描述符)、设备握手包ACK。

设备产生端点0数据输出中断,固件程序要根据数据包中的主机要求做好准备,这里是在端点0输入缓冲区准备好设备描述符。

(2)数据过程,主机先发一个IN令牌包、设备发一个数据包(这个数据已经准备好,SIE收到IN令牌后,直接送到总线上,用户此时不干预)、主机发ACK包。

此时SIE产生端点0数据输入中断,表明主机已经取走了设备所准备的数据,用户可以该中断处理程序中要做如下处理:如果一次没有将描述符送完,要再次将剩下的内容填充端点0输入缓冲区。

第二次数据传输:主机再发一个IN令牌包、设备发一个数据包、主机发ACK包。

此时SIE再次产生端点0数据输入中断,如果数据已经发完了。这里就不处理了。进入状态过程。

(3)状态过程:主机发OUT包(通知设备要输出)、主机发0字节状态数据包(表明自己收到设备描述符)、设备发握手ACK包。

接下来获取配置描述符、配置集合、字符串描述符、报告描述符的过程差不多,这里就不再叙述了。

二、USB设备固件程序要做些什么?

1、USB初始化

2、使能USB连接(在D+或D-线提供上拉),被主机检测。

3、接下来的工作

USB枚举过程及Linux下U盘识别流程 USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态和挂起状态(Suspend))。 USB枚举基本的流程为:用户把USB设备插入USB端口或给系统启动时设备上电 USB端口指的是主机下的根hub或主机下行端口上的hub端口。Hub给端口供电,连接着的设备处于上电状态。Hub检测它各个端口数据线上(D+/D-)的电压 在hub端,数据线D+和D-都 阅读详情

相关推荐

USB枚举全流程解析:从设备检测到配置完成

本文详细解析USB枚举的全过程,从设备物理连接到配置完成。涵盖设备检测、速度协商、描述符获取、地址分配等关键步骤,帮助开发者深入理解USB通信协议,解决设备识别和兼容性问题,提升调试效率。

echo99的专栏 847

usb驱动开发之USB协议枚举过程详解

本文把usb的枚举过程通过文字、程序和图形三种形式描述出来,并形成对照。 一  枚举过程之文字描述          •主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)    • 连接

亚亚图雷的专栏 5736

linux usb枚举分析2----(host软件流程)

linux usb host软件代码详细分析

weixin_43326869的博客 2004

USB的枚举过程

当USB device 插入,和 host 连接后,host 会对 device 进行枚举。 通过枚举:获取设备的描述符信息。(主机根据此信息,加载对应驱动,确定通信方式等等) 枚举过程如下: 1、usb host 检测到 usb device 插入后,发送总线复位信号,复位 device。 device 复位完成后,地址为0。 host 向 地址0 的 endpoint 0 发送数据,请求设备描述符。 device 收到主机请求后,发送 设备描述 给 host。 host 接收并确认 device 发来

engineer0的博客 4112

USB 枚举过程

枚举过程的详细介绍 1、USB主机检测到 USB设备插入后,就会先对设备复位。USB设备在总线复位后其地址为 0 ,这样主机就可以通过地址 0和那些刚刚插入的设备通信。 2、USB主机往地址为 0的设备的端点 0发送获取设备描述符的标准请求(这是一个控制传输的建立过程)。设备收到该请求后,会按照主机请求的参数,在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述......

tyustli 3926

第五篇 USB设备枚举过程(1)

总述 设备枚举的整个过程 USB设备枚举过程,可大致分为下面的几个阶段: 一、获取设备描述符 二、复位总线 三、设置地址阶段 四、再次获取设备描述符 五、获取配置描述符集合请求(第一次) 六、语言ID描述符和字符串描述符的请求 七、又获取了一次设备描述符 八、又再一次获取配置描述符 九、设置配置请求 十、设置接口请求 十一、重复两次请求产品字符串描述符 十二、Set_Idle请求 十三、获取报...

渣渣小码农的博客 1万+

USB2.0 枚举流程

描述符描述提供设备基本信息(VID/PID、USB版本等)提供一个或多个设备配置方案每个配置包含多个接口信息每个接口包含多个端点(输入/输出)提供字符串信息,如厂商名、产品名等。

m0_57249200的博客 1374

MTK zephyr平台:USB升级、枚举流程

本文分析了MediaTek平台预引导加载器(PL)阶段的USB升级流程

不秃头的程序猿Gabriel的博客 1571

USB3.0 枚举流程

USB3.0 枚举流程= USB2.0基础 + SuperSpeed链路训练 + BOS能力协商 + 更复杂描述符管理。如果你希望我提供抓包示例分析(比如USBView、Wireshark + usbmon)或Linux Gadget 层如何配合USB3.0完成枚举,我也可以详细讲解。是否需要?太好了!你既然正在基于 RK3588S 开发 USB3.0 设备通信系统(深度相机 + DToF 激光雷达),那我就结合Linux FunctionFS + USB3.0 枚举,再配合抓包工具分析。

m0_57249200的博客 2282

USB枚举详细过程剖析

从驱动开发网看到一篇《USB枚举详细过程分析》,依据自己的理解和经验对原文稍加改动。本文仅供参考,一些顺序并不是固定的。     本文描述的是Windows系统的USB枚举过程,但对嵌入式系统自行开发的USB主机驱动程序也有参考价值。     USB枚举详细过程剖析     1.主机集线器检测到新设备     主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)     2.主机发

STM32驱动WS2812B实现音乐频谱可视化系统

本文详细介绍了基于STM32驱动WS2812B灯带实现音乐频谱可视化系统的设计与实现。通过FFT算法实时分析音频信号,将频谱映射到炫彩灯光控制系统,结合PWM和DMA技术实现低延迟响应。系统支持多模式切换和动态亮度调节,适用于创意灯光秀和智能家居场景。

weixin_29171129的博客 301

usb枚举过程 enumeration 流程说明

先转载一篇关于usb enumeration不错的文章。 USB枚举过程 USB Enumeration     USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。USB总线拓扑结构见

阿戟哥哥的专栏 6733

基于卷积神经网络的人脸识别算法

摘要:近年来,随着科学技术的不断发展,人脸识别技术日渐成熟,使得人脸识别技术的使用率不断增大。例如:门禁、ATM机、公安系统以及新兴起的人机交互等领域,都应用到了人脸识别系统。在人脸识别研究领域中,深度学习扮演着重要的角色。由于深度学习的人脸识别技术凭借其识别率高、识别快等特点,逐渐成为整个领域的主流技术。在众多深度学习算法中,以卷积神经网络为代表的人脸识别系统得到了广泛应用,主要研究内容如下:首先,通过对经典损失函数进行研究,对比每种损失函数的特点,然后根据A-Softmax函数进行改进,借助Margin

yyq2263511327的博客 1万+

Linux USB基础之虚拟串口枚举流程(三)

Linux USB基础之虚拟串口枚举流程(三) 1 USB检测与枚举过程 1.1 USB插拔检测 USB集线器的每个下游端口的D+和D-上,分别接了一个15K的下拉电阻到低。当集线器的端口悬空(即没有设备插入)时,输入端就被此两个下拉电阻拉到低电平。在USB设备端,在D+或D-上接入1.5K的上拉电阻到3.3V的电源。1.5K的上拉电阻接在D+或D-上,由设备的速度决定。对于全速设备和高速设备,上...

枫潇潇 2734

CANoe VLAN配置的艺术:如何通过脚本自动化实现高效车载网络测试

本文深入探讨了CANoe VLAN配置的自动化实现,通过CAPL脚本与Python工具链的结合,提升车载网络测试效率。重点解析了硬件侧VLAN配置与软件侧VLAN配置的交互机制,并提供了实用的脚本开发示例和调试技巧,帮助工程师快速构建高效的自动化测试方案。

qqq44的博客 615

【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞

【代码】【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞。

weixin_41369892的博客 901

USB Device 基本枚举流程

参考文档 《Universal Serial Bus Specification Revision 2.0》April 27, 2000 参考文档 《STM32Cube USB 设备库 用户手册 UM1734》 1. USB基本状态 供电:设备连接到 USB 并由其供电,但还未接到复位请求。 默认:设备连接到 USB,由其供电并复位,但并未分配唯一地址。 地址:设备连接到 USB,由其供...

御风牧云的代码笔记 1378

开关电源EMI优化秘籍:三明治绕法如何让你的产品通过认证测试

本文深入解析了开关电源EMI优化中的三明治绕法,详细阐述了其通过改变绕组排布来减小初次级寄生电容、降低共模噪声的核心机理。文章提供了从绕制结构选择、绝缘安规处理到实测验证的全流程实战指南,帮助工程师有效利用这一工艺,提升产品通过CCC、CE等EMI认证测试的成功率。

tcp8optimizer的博客 705

usb枚举流程图

2012-12-05 17:55 25人阅读 评论(0) 收藏 举报 目录(?)[-] usb枚举过程流程图 1. usb枚举过程流程图

张亮校的专栏 1700

【软件逆向学习记录】x64dbg调试器入门2:主调试窗口功能及字符串搜索功能介绍

在x64dbg中, ​​CPU视图 是调试过程中最核心的界面,通常被称为​​主调试窗口​​或​​调试视图​​,总体分为四个区域,代码区(反汇编),数据区(内存窗口),寄存器区和堆栈区,详细位置如下图:示例数据代码区最左侧为内存地址,第二块区域为程序代码值,原始程序代码经编译和汇编后变为二进制机器码存储在计算机中,调试器将其展示为易于阅读的十六进制,第三块区域是机器码反汇编后的汇编代码,最右侧为代码的注释窗口,有一些原始的注释,也可以自己添加注释PS:汇编和反汇编解释。

tusikong的博客 2922

11.3 海岛微电网与工业园区的构网应用

海岛微电网与工业园区配电网是构网技术下沉应用的两大典型场景。海岛微电网以构网型储能为核心,解决孤岛系统稳定性问题,需具备黑启动、多能源协调和故障穿越能力;工业园区则侧重电能质量治理、并离网无缝切换和经济优化运行。两类场景均需解决多机并联稳定性、故障特性适配和分层协同控制等关键技术。构网型变流器的电压源构建能力、自适应控制策略及飞轮储能等特殊应用,为构建高可靠性、高经济性的分布式能源系统提供了创新解决方案。

技术工作者 1082

嵌入式开发中usb设备枚举流程

嵌入式开发中usb设备枚举流程

wojiaxiaohuang2014的博客 886

【异常】OpenClaw 上下文溢出问题(100% context used 309.9k/200k`)排查与解决

摘要:OpenClaw 运行出现"100% context used 309.9k/200k"报错,表示上下文窗口超出200k Token限制。解决方法包括:1) 重启服务或新建会话清空缓存;2) 修改配置文件提升context_window值;3) 长期优化如限制历史对话轮数、分批处理长文本。该问题通常由输入过长或多轮对话累积导致,需控制单次输入量在阈值内。

奶爸的编程之路,也就一周冷个三天 3235

USB协议处理和枚举流程

V4L2 pixel format 1. v4l2_pix_format定义 /* * V I D E O I M A G E F O R M A T */ struct v4l2_pix_format { __u32 width; __u32 height; __u32 pixelformat; enum v4l2_field field; __u32... 2013-01-18

tianshiyalin的专栏 2243

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

USB2.0枚举流程(以鼠标为例)——从零开始学习USB2.0协议(四)

文章摘要 本文介绍了USB 2.0设备的枚举流程和鼠标模拟实现。枚举流程包括设备连接、端口复位、设备描述符获取、地址分配等8个关键步骤,确保设备即插即用功能。第二部分详细描述了如何在FPGA开发板上实现模拟鼠标功能,包括构建设备描述符、配置描述符、字符描述符等关键数据结构,通过UART输入控制光标移动和按键操作。文章提供了完整的描述符构建代码示例,并解释了HID设备特有的描述符结构。

保持一颗永远好奇、勇于探索的心 1874

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

linux hub架构-usb具体的枚举流程

cl11010的专栏 1102

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: Qt中定义可点击标签
下一篇: USB基础知识
獠
獠
博客等级 码龄16年 43粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值