USB开发基础--实例讲解USB的枚举(配置)过程

USB枚举过程详解 阅读详情

在阅读本言之前建议您先看看百合电子工作室(www.baiheee.com)的另两篇文章: USB开发基础--了解USB的通讯过程和USB开发基础--USB命令(请求)和USB描述符。

所需要工具

  网上大量介绍用bus hound作监控软件,我们为什么不选bus hound而选USB Monitor呢,因为bus hound在WindowsXP环境不能监控USB枚举(配置)过程,它只有在Windows2000下才能实现这个功能。不过用bus hound做除枚举以外的数据分析还是比较好用的。USB Monitor的唯一缺点是找不到它的破解版,只能试用大约一个月的时间。

USB Monitor的安装

  下载USB Monitor2.26, 安装一路next下去即可,安装完成后将会提示您重新启动系统。

启动您的USB Monitor

1、运行安装好后的USB Monitor,点击“File”→“New Session”

 2、在弹出的对话框中点“下一步”

3、在“Monitoring Session Type”对话框中选择“USB Monitor”后点下一步

4、在“Configurating the USB Monitor”对话框中提示您选择哪一个USB设备需要监视,如果这时您还没有将任何USB设备插入主,将显示如下界面,我们怎么知道应该选择哪一项呢?请看第5步﹍

5、将您需要监控的USB设备插入主机USB端口,这时将会在某在项后面多出一些内容,如下图所示,我这里选择“USB Mass Storage”。小技巧:当我们要监控我们自己开发的设备时,可以先用一个优盘插入其中一个USB端口,在此步中选择我们插入的优盘,在实际监测过程中将我们开发的USB设备插入这个USB插口即可。

 6、在“Configure Data Processing”对话框中选择“Request View”并点下一步

7、弹出您的优盘,然后在USB Monitor主界面里点“Edit”->“Clear View”,如下图所示

8、插入您的优盘,记得一定要插在同一USB插口哟!此时USB Monitor会检测许多的数据流,我们切换到Complete标签,如下图所示:

 

 分析USB设备的枚举过程

  通过以上的操作后,我们现在可以对USB Monitor监测到的数据进行分析了。

1、按“Ctrl + F”,查找第一个“Descriptor Request”,从这里开始是对我们有用的信息。

2、对USB Monitor显示的数据结构进行分析:

①序列号,可理解为一个上行或下行数据流标号,无实际意义
②命令类型,括号里的“Down”代表输出数据,即主机到设备
③命令数据流,出现“Setup Packet”后面,十六进制
④对命令数据的简单分析
⑤传输类型,括号里的UP代表输入数据,即设备到主机
⑥设备返回的数据流,十六进制
⑦对命令(请求)数据的详略分析(其中对“Request”的分析应该有BUG,0x6应为Get_Descriptor,而USB Monitor解释为Get_Configuration)

以上没有看到对上行数据(设备返回的数据)的分析,我们只要将鼠标停留在设备返回数据流处(上图所示标记⑥),就会弹出对上行数据的分析画面,如下图所示:

3、枚举过程分析

1)、主机第一次发出请求描述符命令,数据流为:80 06 00 02 00 00 09 00,bRequest的值为0x06,代表Get_Descriptor命令,但为什么描述符呢?wValue的高字节表示了描述符的类型,此处wValue的值为0x0100,所以高字节为0x01,代表设备描述符(见《USB开发基础--USB命令(请求)和USB描述符》中表5);设备返回的数据为:12 01 00 02 00 00 00 40 51 09 0E 16 00 02 01 02 03 01,bLenght的值为0x12,表示此描述符的长度。bDecriptorType的值为0x01,代表设备描述符。bcdUSB的值为0x0200,代表USB协议的版本号,此处2.0版,如果为0x0110则表示1.1版。bDeviceClass和bDeviceSubClass都为0,表示设备类别由接口描述符指定。bDevicePortocol的值为0,但并不代表它不支持USB定义的标准设备类协议,因为此时可由接口描述符指明设备支持的协议。bMaxPacketSize0的值为0x40,表示端点0的数据包最大长度为64字节。iManufacturer、iProduct和iSerialNumber的分别为0x01、0x02和0x03,表示字符串索引,在主机读取字符串的命令中将以这几个值来填充wIndex字段。


        请求设备描述符的数据流

2)、主机再次发出请求描述符指令,数据流为:80 06 00 02 00 00 09 00,wValue的高字节为0x02表示配置描述符,表示请求配置描述符,wLength的值为0x0009,表示要求返回的数据长度为9个字节。这次设备返回的数据只有9个字节:09 02 20 00 01 01 00 80 32,第一位数为bLeng域,其值为0x09,代表此描述符的长度。bDecriptorType的值为0x02,表示配置描述符。wTotalLength的值为0x0020,表示包括此配置描述符、接口描述符、端点描述符和设备类及厂商定义的描述符的总长为32个字节。bNumInterfaces的值为0x01,表示该配置支持1个接口。MaxPower的值为0x32,表示总线耗电量为50×2=100mA。


        第一次请求配置描述符的数据流

3)、主机第一次请求设备的配置描述符后得知包括配置描述符、接口描述符、端点描述符等在内的描述总长为32个字节后,这此主机再次发出请求配置描述指令,这次命令与上一个命令只有wLength字段的值不一样,这次wLength的值为0x20,表示要求设备返回32个字节,正好和上次命令中设备返回的wTotalLength信息一致。设备返回的数据流为如下图所示,USB Monitor已经将配置描述符、接口描述符、和端点描述符用不同的背景色区分开来,鼠标停留在不同的区域将弹出对此描述符的具体分析。第一个描述符的数据为:09 02 20 00 01 01 00 80 32,和上一次请求配置描述符得到的数据一模一样,这里不再分析。第二个描述符的数据为:09 04 00 00 02 08 06 50 00,bLength为0x09表示此描述符为9个字节,bDescriptorType的值为0x04表示接口描述符,bInterfaceNumber为0x00表示此配置接口的索引值。bNumEndpoint的值为0x02表示此接口端点数为两个。bInterfaceClass的值为0x08表示大数据存储类(见《USB开发基础--USB命令(请求)和USB描述符》中表11),bInterfaceSubClass的值为0x06,其含义因bInterfaceClass的不同而不同,由于此处bInterfaceClass的值指定了此设备属大数据存储类,所以需要查看大数据存储类(Mass storage class device)相关协议标准,经查询得知bInterfaceSubClass为0x06时代表传输协议工业标准为SCSI。bInterfaceProtocol的值为0x50,大数据存储类协议规定其含义为通讯方式为批量传输(Bulk-only)。


        第二次请求配置描述符的数据流

4)、在请求完配置描述符后,主机发出请求字符串描述符指令。请求字符描述符分两大步,每大步又分两小步,两大步为:先请求字符串描述符语言ID(此时wIndex的值设为零),再请求UNICODE编码的字符串描述符。不管是请求语言ID还是UNICODE编码的字符串描述符,都要分成两小步:先请求设备返回相应字符串描述符的前两个字节,第一个字节代表了此字符串描述符的长度,主机根据这个长度再次请求相应字符串描述符,这次得到整个字符串描述符。

首先取得语言ID的前两个字节,数据流为:80 06 00 03 00 00 02 00,wValue的高字节为0x03,表示字符串描述符。wIndex的值为0x0000,表示读取语言ID。wLength为0x0002要求设备返回2个字节数据。设备返回的数据为04 03,第一个字节为0x04表示语言ID字符串描述符长度为4个字节。

5)、主机根据上次读取的语言ID字符串描述符长再次读取此描述符,这次读出全部语言ID描述符。主机发出的数据流为:80 06 00 03 00 00 04 00,其中wValue的高字节为0x03,表示字符串描述符,wIndex的值为0x00,表示读取语言ID。wLength为0x0004要求设备返回4个字节数据。设备返回的数据流为:04 03 09 04,bLength的值为0x04表示此描述符长度为4个字节,bDescriptorType的值为0x03表示字符串描述符。wLANGUID的值为0x0409,表示英语。

 

6)、读取完字符串描述符支持的语言ID后将读取UNICODE编码的字符串描述符,同读取语言ID一样,主机同样会分两步读取。主机发出的命令数据流为:80 06 03 03 09 04 02 00,wValue的高字节为0x03,表示字符串描述符,低字节为0x03,表示读取索引为3的字符串描述符(在第1步读取的设备描述中iSerialNumber字符串的索引为3,所以这里实际读取的是设备序列号)。wIndex的值为0x0409,表示语言ID。wLength的值为0x0002,表示要求设备返回此描述符的前两个字节。设备返回的数据流为:32 03,第一个字节的值为0x32表示此字符串描述符的长度为50个字节。

7)、在取得UNICODE字符串描述符的长度后,主机根据这个长度读取整个UNICODE字符串描述符。主机发出的命令数据流为:80 06 03 03 09 04 32 00,wValue的高字节为0x03,表示字符串描述符,低字节为0x03表示读取索引为3的字符串描述符。wIndex的值为0x0409表示语言ID。wLength的值为0x0032,表示要求设备返回50个字节的数据。设备返回的数据从第三个字节开始为Unicode编码的字符串,这里返回的字符串是:20070620000000005918B19E

 

8)、在读取完字符串描述符后,主机发出Set_Configuration选择配置索引以激活这个设备的一个配置,然后设备对这一命令作出回应。(不知为何USB Monitor对这此命令的数据流没有显示出来)

9)、主机发出Set_Interface指令激活设备的某个接口,然后设备对此指令作出回应。

 10)、以上为所有USB设备枚举过程中都会经历的过程,后续的配置过程将根据不同的设备分类(见《USB开发基础--USB命令(请求)和USB描述符》中表6)而有所不同。下图所示为此实验所用优盘的后续配置过程的一部分。对于具体设备类相关协议规定的枚举过程就不作分析了,请大家参考相关设备类协议。

 

温馨提示:

  百合电子工作室有一个关于USB开发方面的开源项目-Easy USB 51 Programer,整个开发过程写得非常详细,不防参考一下,您还可以进入她的论坛参与此项目的讨论。

安卓设备的USB-HID通讯例程的开发 (3) 安卓设备的USB-HID通讯例程的开发(3) - 深入学习controlTransfer()方法 本博文系JGB联合商务组的原创作品,引用请标明出处 USB通讯中的三大主要事务(SETUP事务, IN事务, OUT事务)中的SETUP事务(安卓系统称之为控制事务,意思一样)可由控制传输方法即controlTransfer()方法完成,它是UsbDeviceConnection实例的一个方法,开发安卓系统的USB-HID通讯时绕不开此方法,理应深入学习之。 任何试图抛开HID设备的C代码而去单独理解控制传输c 阅读详情

相关推荐

STM32CubeMX配置USB CDC虚拟串口:操作指南

详解如何使用STM32CubeMX快速配置USB CDC实现虚拟串口功能,涵盖关键步骤与常见问题。掌握虚拟串口的生成与通信调试,提升嵌入式开发效率。

weixin_42499004的博客 1328

图文描述 USB 设备枚举过程

关注+星标公众号,不错过精彩内容转自 |漫谈嵌入式USB是我们常见的一种接口,为了设别设备,就需要进行一系列“验证”,确保后续的安全通信。关于USB枚举也是一个复杂的过程。USB 设备状态切换 前面介绍了USB 设备的状态如下:AttachedPoweredDefaultAddressConfiguredSuspended设备插入后,先进入【attached】 状态,然后hub 端口配置进入【p...

strongerHuang 2020

图解说明USB协议层次结构中的识别障碍

深入图解USB协议层次结构,揭示电脑无法识别usb设备的常见障碍,从物理层到协议握手失败,逐一剖析连接异常的关键节点,帮助快速定位问题根源。

weixin_42124497的博客 873

实例讲解USB的枚举(配置)过程

所需要工具 USB Monitor2.26优盘一个   网上大量介绍用bus hound作监控软件,我们为什么不选bus hound而选USB Monitor呢,因为bus hound在WindowsXP环境不能监控USB枚举(配置)过程,它只有在Windows2000下才能实现这个功能。不过用bus hound做除枚举以外的数据分析还是比较好用的。USB Monitor的唯一缺点

csaji777的专栏 1008

USB2.0新手指南:主机与设备通信流程图解说明

深入解析USB2.0主机与设备之间的通信流程,通过图解方式清晰展示数据传输各阶段的关键步骤,帮助新手快速掌握usb2.0协议核心机制与实际应用要点。

weixin_36431145的博客 976

USB具体通讯过程(含枚举过程)

前言    现在刚开始接触USB的开发,零零散散学习了一些USB基础知识,但是却得不到连贯。在这个学习过程中首先困惑的就是USB通讯过程究竟是什么样子的,我觉得做一下简单的了解后记录下来,首先从USB整体结构基础来入手直到整个通讯过程。可能有理解不到位的地方,望各位能够指正,我会及时改正。一、USB系统的结构    USB系统是由三个逻辑层组成:功能层、USB设备层和USB总线接口层。并且每一层都...

go_str的博客 4万+

USB开发基础--USB Monitor2.26 实例讲解USB的枚举(配置)过程

原文地址::http://skyman2000.blog.163.com/blog/static/4370967520124811644373/ 相关文章 1、usb monitor使用方法 ----http://blog.chinaunix.net/uid-9672747-id-3424202.html 2、用USB Monitor监视USB枚举(配置、识别)过程(USB枚举过程分

xqhrs232的专栏 3861

linux usb枚举过程分析

插入一个 USB设备的处理机制总体计: 1. 中断定时查询: 2. 总体架构设计: 3. 解析各个部分:中断定时查询: Hub层处理 usb枚举 当守护程序第一次运行或usb port上状态发生变化,守护进程被唤醒都会运行hub_events函数,这个函数在usb系统中处理核心位置,usb的枚举过程就是由它完成。usb具体的枚举流程: hub_events函数sta

viewsky11的专栏 1万+

依据HID例程来分析STM32F107的USB的实现过程

看到很多坛友发布一些关于USB的资料,但是很多都不是基于例程来分析的,最近在搞USB这块的程序,在这里记录一下,自己学习USB的过程,同时也写出来分享给大家,希望能给大家在USB学习方面提供一些帮助。我使用的硬件是金龙107开发板,主芯片STM32F107VCT6,该芯片支持USB从机以及主机,支持OTG功能,例程是基于ST官网的例程,做了一些简单的修改,后面我会把完整的工程上传上来。首先发一些关...

爬行的菜鸟的博客 2731

usb枚举过程总结

USB枚举的主要目的是让主机识别并配置连接的USB设备。通过这个过程,主机可以确定设备的类型、功能和所需的资源,从而为设备加载合适的驱动程序,确保设备能够正常工作。如果枚举失败,设备可能无法被主机识别或正确配置,导致无法正常使用。黄毛入厂打螺丝——枚举:进厂-——插入检测人事面试——枚举过程给她自己的身份证明,五道口毕业证之类的,基本信息了解后,开始安排工位——给定新地址,一切都安排好了,就可以正常的打螺丝了——设备与主机正常通信。

qq_62782055的博客 1732

USB学习笔记——USB通信过程与枚举过程

在网上看到一篇文章就是讲这个的,仔细阅读后获得了很多感触,整理总结如下。 一、USB接口 在USB的集线器端D-,D+都接了下拉电阻,而USB设备端的D-,D+接了上拉电阻,所以当USB设备插入时可以根据集线器端D-,D+上的电压变化来判断是否有USB设备接入。 检测到有设备接入后,可以根据D-,D+来判断USB设备的工作模式,是低速还是全速或者高速。所以D-,D+这两根线很重要。 二、 USB数据传输过程 主机与USB设备相互传输数据具体过程如下: 1、客户软件首先将传输的数据放入缓冲

weixin_46199479的博客 5263

USB枚举过程

USB枚举过程 1. 枚举是什么? 枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。 USB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机...

ll148305879的博客 1万+

USB 枚举过程

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

tyustli 3926

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

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

亚亚图雷的专栏 5736

STM32F103C8 USB HID应用实战指南及资源包

本实例旨在实现一个基本的USB HID设备,该设备能够通过USB接口与计算机通信,并实现简单的人机交互。我们将使用STM32CubeMX工具来配置STM32F103C8的USB外设,并使用STM32CubeIDE进行项目的构建和调试。HID(Human Interface Device)类是一种为计算机输入设备定义通信协议的标准,广泛应用于键盘、鼠标、游戏控制器等设备。HID协议允许设备向主机发送输入数据,例如按键、移动和按钮的按下/释放等信息。

weixin_42462474的博客 850

USB枚举详细过程剖析

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

实例讲解USB的枚举过程

https://www.cnblogs.com/ljf181275034/articles/2942642.html (实例讲解USB的枚举(配置)过程) 结合自己用BUShound抓的数据(下图),发现几乎完全一致。 中间涉及到一个USB Mass Storage协议,可以参考这个: https://blog.youkuaiyun.com/melvda/article/details/38370437 和这个: https://www.cnblogs.com/shangdawei/archive/2013/06/1

qq_42043347的博客 2043

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参

本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。

weixin_26802933的博客 487
上一篇: usb hid gadget调试
下一篇: USB开发基础--USB命令(请求)和USB描述符
wdsfup
博客等级 码龄20年 31粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值