USB设备的枚举过程
Linux-USB-检测枚举-
USB设备检测的一般过程USB设备检测也是通过/proc目录下的USB文件系统进行的。
为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。
在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。
现在一般的USB桥接器模块有两种类型,UHCI和OHCI。
在决定插入那一个桥接器模块时,可以察看/proc/pci文件来决定。
打开此文件,您若发现USB节为I/O at 0xHHHH格式(例如出现I/O at 0xe000 [0xe01f]),HHHH为16进制数,则桥接器类型为UHCI。
若是它为32 bit memory at 0xHH000000形式(例如出现32 bit memory at 0xee000000),HH为16进制数,则桥接器类型为OHCI。
但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种模块,直到成功为止。
一般而言,UHCI类型的桥接器它的插入模块是uhci或usb-uhci(由内核版本决定);而对于OHCI类型的桥接器它的插入模块是ohci或usb-ohci。
您在正确的插入了桥接器模块之后,这时/proc文件系统下就会出现USB设备目录,不过这时这个目录是空的,没有任何文件。
这时您就必须挂接usbdevfs文件系统,然后通过此文件系统检测连接的设备。
在成功挂接usb文件系统之后,就会生成文件/proc/bus/usb/devices,/proc/bus/usb/drivers 和目录/proc/bus/usb/busNo。
挂接usbdevfs文件您可以通过如下操作实现:mount -t usbdevfs none /proc/bus/usb或在/etc/fstab上加入none /proc/bus/usb usbdevfs defaults 0 0然后通过/proc/bus/usb/devices文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。
USB枚举流程
设备握手包 数据包(上一步中的请求信息)8字节 设备ACK
CRC-5
设备握手包(空包) 无
01011010 00111100 10100101 00011110
5A 3C A5 1E
设备握手包 数据包(上一步中的请求信息)端点_New最大包长 数据包(上一步中的请求信息)端点_New最大包长 数据包(上一步中的请求信息)端点_New最大包长
7.获取字符串描述符
可选的数据过程 状态过程
SET包 → 数据包(设备请求-获取设备描述符)→ ← IN包 → ← 主机OUT包+空包 → 主机OUT包+空包 ← → SET包 → 数据包(包含配置地址) → ← 无 无 主机握手包 → SET包 → 数据包(设备请求-获取设备描述符)→ ← IN包-1 → ← IN包-2 → ← IN包-…N(多次IN包共发送18字节) → ← 主机握手包 → SET包 → 数据包(设备请求-获取配置描述符)→ ← IN包 → ← 主机握手包 → SET包 → 数据包(设备请求-获取字符串描述符) → ← IN包 → ← 主机握手包 →
2.获取设备描述符 (端点0)
可选的数据过程 状态过程
3.再次复位 建立过程 4.设置地址 可选的数据过程 状态过程 建立过程
可选的数据过程 5.再次获取设备描述 符(端点_New) 可选的数据过程 可选的数据过程 状态过程 建立过程 6.获取配置描述符 (/集合)
பைடு நூலகம்
可选的数据过程 状态过程 建立过程
枚举过程: 1.上电复位
phase 建立过程
description-host
Dir description-device
Data SYNC 00000001 00000001 00000001 00000001 PID 0101 0011 1010 0001 PID_bar 1010 1100 0101 1110 ADDR-7 Data0-N ADDR-7 ENDP-4 CRC-16 ENDP-4 CRC-5
USB设备的枚举过程
USB设备的枚举过程USB主机在检测到USB设备插入后,就要对设备进行枚举了。
为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。
调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。
在说枚举之前,先大概说一下USB的一种传输模式——控制传输。
这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输。
控制传输分为三个过程:①建立过程。
②可选的数据过程。
③状态过程。
建立(Setup)过程都是由USB主机发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。
如果是控制输入传输,那么数据过程就是输入数据;如果是控制输出传输,那么数据过程是输出数据。
如果在设置过程中,指定了数据长度为0,则没有数据过程。
数据过程之后是状态过程。
状态过程刚好与数据过程的数据传输方向相反:如果是控制输入传输,则状态过程是一个输出数据包;如果是控制输出传输,则状态过程是一个输入数据包。
状态阶段用来确认所有的数据都已经正确传输。
好了,下面我们来看看枚举的详细过程。
首先,USB主机检测到USB设备插入后,就会先对设备复位。
设备复位后,USB主机就会对地址为0的设备发送获取设备描述符的标准请求。
所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。
主机在建立阶段发出获取设备描述符的输入请求,设备收到该请求后,在数据过程将设备描述符返回给主机。
主机在成功获取到一个数据包的设备描述符后并且确认没有什么错误后(注意:有些USB 设备的端点0大小不足18字节(但至少具有8字节),而标准的设备描述有18字节,在这种情况下,USB设备只能暂时按最大包将部分设备描述符返回,而主机在成功获取到前面一部分描述符后,就不会再请求剩下的设备描述符部分,而是进入设置地址阶段),就会返回一个0长度的状态数据包给设备。
USB枚举过程 USB Enumeration
标准usB描述符描述符(Descriptor),是一个完整的数据结构,用于描述一个USB设备的所有属性。
USB协议将这些属性信息进行分类,定义了五种标准的描述符,按照等级由高到低依次为:设备描述符、配置描述符、接口描述符和端点描述符,而字符串描述符是可选的。
每一个描述符都是由一系列的字段组成,每个字段都是一连串的二进制数,表示相应的意义。
设备描述符给出了USB设备的通用信息,包括对设备及所有设备配置起全程作用的信息。
一个USB 设备只能有一个设备描述符,但可以含有一个或多个配置。
特别指出的是,缺省控制通道的数据包的长度(即USB设备端点0的长度)在设备描述符中得以说明,其它端点是在端点描述符中定义的。
USB设备的一个配置可以包含一个或多个接口,且每个接口都可以相互独立地工作。
所有的USB设备至少要支持一个配置描述符。
如果USB设备支持多个配置,则每个配置都需要相应的配置描述符。
配置描述符给出了USB设备的属性和能力等配置信息。
接口一般都是由一系列端点所组成的集合体,用于实现某种特定的USB数据传输功能。
某些USB设备类型,如HID设备,是在接口描述符中定义的,而不是在配置描述符中。
接口描述符不可直接用SetDescriptor和GetDescriptor命令来存取,是作为配置描述符的一部分被返回。
接口描述符给出了一个特定接口的属性信息。
如果一个结构包含有备用的描述符,则可以在设备配置后加以改变。
端点描述符用于描述接口所使用的非0端点的属性,包括输入/输出方向、端点号和包的大小。
端点描述符不可直接用SetDescriptor和GetDescriptor命令来存取,是作为配置描述符的一部分被返回。
0端点无描述符。
字符串描述符是一个可选的描述符,其编号对应于前四种类型描述符中内容为索引的字段。
标准usB设备请求命令USB定义了十一种标准的设备请求命令:Getstatus,ClearFeature,SetFeature,SetAddress,GetDeseriptor,SetDeseriptor,GetConfiguration,SetConfiguration,GetInterface,SetInterface,SynchFrame。
USB枚举过程
USB枚举过程USB EnumerationUSB架构中, hub负责检测设备的连接和断开,利用其中断IN端点(Interrupt IN Endpoint)来向主机(Host)报告。
在系统启动时,主机轮询它的根hub(Root Hub)的状态看是否有设备(包括子hub和子hub上的设备)连接。
USB总线拓扑结构见下图(最顶端为主机的Root Hub):USB总线拓扑结构(USB Bus Topology)一旦获悉有新设备连接上来,主机就会发送一系列的请求(Resqusts)给设备所挂载到的hub,再由hub建立起一条连接主机(Host)和设备(Device)之间的通信通道。
然后主机以控制传输(Control Transfer)的方式,通过端点0(Endpoint 0)对设备发送各种请求,设备收到主机发来的请求后回复相应的信息,进行枚举(Enumerate)操作。
所有的USB设备必须支持标准请求(StandardRequests),控制传输方式(Control Transfer)和端点0(Endpoint 0)。
从用户角度来看,枚举过程是自动完成并不可见的。
但很多初次使用的设备连接时,系统会弹出说新硬件检测到,设备安装成功,可以使用之类的消息提示框,而且有时还需要用户配合选择安装相关的驱动。
当枚举完成后,这个新添加的设备可在Windows的设备管理器里面看到,当用户删除这个设备/硬件时,系统把这个设备从设备管理器里删除。
对于一般的设备,固件(Firmware)内包含主机所要请求的信息,而有些设备则是完全由硬件来负责响应主机的请求。
在主机方面则是由操作系统而非应用程序负责处理相关枚举操作。
枚举步骤USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态和挂起状态(Suspend))。
实例讲解USB的枚举配置过程
实例讲解USB的枚举(配置)过程启动您的USB Monitor1、运行安装好后的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,表示此描述符的长度。
USB枚举过程
USB枚举过程主机对一个USB设备的识别是经过一个枚举的过程来完成的,主机的总线枚举器随时监控必要的设备状态变化。
总线枚举的过程如下:(1)设备连接。
USB设备经USB总线连接主机。
(2)设备上电。
USB设备可以自供电,也可以使用USB总线供电。
(3)主机检测到设备,发出复位。
主机通过检测设备在总线的上拉电阻检测到有新的设备连接,并获释设备是全速设备还是低速设备,然后向该端口发送一个复位信号。
(4)设备默认状态。
设备从总线上接收到一个复位信号后,才可以对总线的处理操作做出响应。
设备接收到复位信号后,就暂时使用默认地址(00H)来响应主机的命令。
(5)地址分配。
当主机接收到有设备对默认地址(00H)响应的时候,就分配给设备一个空闲的地址,以后设备就只对该地址进行响应。
(6)读取USB设备描述符。
主机读取USB设备描述符,确认USB设备的属性。
(7)设备配置。
主机依照读取的USB设备描述符来进行配置,如果设备所需的USB资源得以满足,就发送配置命令给USB设备,表示配置完毕。
(s)挂起。
如果使用总线供电,为了节省电源,当总线保持空闲状态超过3ms以后,设备驱动程序就会进入挂起状态,在挂起状态时,USB设备保留了包括其地址和配置信息在内的所有内部状态,设备的消耗电流不超过500uA。
USB设备的枚举过程的具体说明如下:USB总线驱动程序自动检测新插入的USB设备。
然后它读取设备内的设备描述符以查明插入的是何种设备,描述符中的厂商和产品标识以及其它描述符一同决定具体安装哪一个驱动程序。
配置管理器调用驱动程序的AddDvecie函数。
AddDvecie做以下工作:创建设备对象,把设备对象连接到驱动程序堆栈上,等等。
最后,配置管理器向驱动程序发送一个即插即用请求IRP_MN_START_DEVICE。
它通过调用一个名为StartDevice的辅助函数并传递一些参数,这些参数描述了赋予设备的经过转换。
usb协议 工作原理
usb协议工作原理USB(Universal Serial Bus)是一种通用串行总线协议,用于在计算机系统和外部设备之间传输数据和提供电力供应。
USB协议的工作原理是通过定义了一套规范,使得不同的设备能够通过USB接口与计算机进行连接和通信。
USB协议的具体工作原理如下:1. 物理连接:USB协议使用了一对差分信号线进行数据传输,其中D+和D-分别用于传输数据的正负信号。
USB接口还包括VCC线用于提供电力供应,以及地线用于连接设备的共地。
2. 握手协议:当设备插入USB接口时,计算机会发送一个复位信号给设备,设备收到复位信号后会进行初始化操作。
然后,计算机和设备之间会进行握手协议,以确定设备的功能和性能。
3. 枚举过程:在握手协议完成后,计算机会开始进行设备的枚举过程。
计算机会发送一个控制命令给设备,设备会返回一些基本信息,如设备的供应商ID、产品ID等。
通过这些信息,计算机可以确定设备的类型和功能。
4. 数据传输:一旦设备被枚举成功,计算机和设备之间就可以进行数据传输。
USB协议支持多种数据传输方式,包括控制传输、批量传输、中断传输和等时传输。
控制传输用于设备的配置和管理,批量传输用于大量数据的传输,中断传输用于实时性要求较高的数据传输,等时传输用于音视频等对实时性要求极高的数据传输。
5. 端点和管道:USB协议中定义了端点和管道的概念。
一个设备可以包含多个端点,每个端点有一个唯一的端点地址。
端点可以是输入端点(IN)用于从设备传输数据到计算机,也可以是输出端点(OUT)用于从计算机传输数据到设备。
管道则是连接计算机和设备之间的数据通道,用于实现数据传输。
6. 电力供应:USB接口不仅可以传输数据,还可以提供电力供应。
USB接口包含VCC线用于提供电源,设备可以通过接口从计算机获取所需的电力。
USB协议规定了不同设备的电力需求,计算机会根据设备的需求提供相应的电力。
总结起来,USB协议是一种通用的串行总线协议,通过定义了一套规范,使得不同的设备能够通过USB接口与计算机进行连接和通信。
USB设备枚举过程及代码设计
US B设备 枚 举过 程 及 代码 设 计
钱 豪
( 『 司济人 : 件 1 程 系 , 海 2 1 0 ’软 一 0 8 4)
摘 要 : B枚 举 程 序 是 US US B设 备 固件 程 序 的 基 础 和核 心 , 要 针 对 US 主 B设 备 驱 动 的 这 一 核 心 进行 了研 究 。使 用 L Cry e o US 总 线 B
c ug y Le o a htb Cr y whih c n c th t e bu rB,a dea e n l sso os’ nu e ai oc s o U S d v c sh sbe n ti d a ay i ft h t Se m r t l he on pr e st B e ie a e
_ _
s m e e m e ain ro ae ih t erw a O be r s v d aepr s n e o nu rto e r rc s sw t h i y t eole r e e t d.
Ke y wor :U S ds B;e m e ai nu rton;e num eai n cas nu eai n er r nu e ai o es r to ls;e m rto ro ;e m r t on pr c s
Th r c s n d sg o B En m e a i n e P o e sa d Co e De i n f rUS u rt o
QI AN o Ha
( p ’ n f ot r n e r g To  ̄i iesy S a g a 2 1 0 , ia De at to f eE  ̄n e n , n v ri , h n h i 0 8 4 Chn ) me S wa i Un t
mfc 枚举usb 描述符 -回复
mfc 枚举usb 描述符-回复MFC是一种用于开发Windows应用程序的编程框架,而枚举USB描述符是在MFC中的一个重要功能。
USB描述符是为了描述连接到计算机的USB设备的信息而设计的。
本文将详细介绍如何使用MFC枚举USB描述符的方法,以及如何一步一步解决问题。
在开始之前,我们需要了解USB描述符的基本知识。
USB描述符是一个标准的数据结构,用于描述USB设备的属性、功能和其他重要信息。
它包含了设备的供应商ID、产品ID、设备版本等信息。
通过枚举USB描述符,开发人员可以获取设备的相关信息,并做相应的操作。
第一步是创建一个MFC项目。
打开Visual Studio,选择创建新项目,然后选择MFC应用程序类型。
在项目向导中,选择一个适当的应用程序类型(比如对话框型应用程序),然后给项目命名并选择保存位置。
点击下一步,然后在下一个对话框中选择用于创建应用程序的MFC库。
点击完成,Visual Studio将为您生成一个基本的MFC项目。
第二步是添加用于枚举USB设备描述符的代码。
在MFC项目中,可以使用Windows API函数来访问设备的USB描述符。
首先,在项目的源文件(通常是.cpp文件)中包含Windows.h头文件,这样可以使用Windows API函数。
然后,添加一个按钮(或者其他控件)到对话框中,用来触发枚举USB设备描述符的功能。
第三步是编写用于枚举USB描述符的代码。
在按钮的Click事件处理函数中,添加以下代码:cppvoid CMyDialog::OnButtonEnumUSB(){枚举USB设备描述符的代码...}以下是枚举USB描述符的基本步骤:1. 使用Windows API函数SetupDiGetClassDevs获取一个用于保存设备信息的结构体(设备信息集合)。
cppHDEVINFO hDevInfo;hDevInfo = SetupDiGetClassDevs(NULL, NULL, NULL,DIGCF_PRESENT DIGCF_ALLCLASSES);2. 使用SetupDiEnumDeviceInfo函数遍历设备信息集合,获取每个设备的相关信息。
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)集线器检测新设备主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。
USB基本术语及简单枚举过程
A device capable of high-speed operation must reset successfully at full-speed when in an electrical environment that is operating at full-speed.
Set Address command is a standard USB command.
How to send a standard USB command under XHCI/EHCI/UHCI/OHCI environment.
Configured state
Get Configuration descriptor by get Configuration command. the host assigns a configuration value to the device. The device is now in the Configured state and all of the endpoints in this configuration have taken on their described characteristics. Set Configuration command is a standard USB command.
Alternate settings :an interface within a configuration may
have alternate settings that redefine the number or characteristics of the associated endpoints.
USB协议详解第30讲(USB枚举过程详解及抓包分析)
USB协议详解第30讲(USB枚举过程详解及抓包分析)USB(Universal Serial Bus)是一种用于连接计算机和外部设备的通信协议和接口标准。
USB枚举过程是指在设备连接到计算机上时,计算机通过与设备之间的通信来识别设备并建立通信。
USB枚举过程分为设备插入、USB设备识别和USB配置三个阶段:1.设备插入:当设备被插入计算机的USB接口时,计算机会感知到设备的插入,并触发枚举过程。
2. USB设备识别:计算机会发送一个特殊的reset信号给设备,以重置设备的状态。
然后计算机会发送一个设备描述符请求给设备,以获取设备的基本信息,如设备的供应商、产品ID等。
设备会回复一个设备描述符给计算机。
B配置:计算机会发送配置描述符请求给设备,以获取设备的详细配置信息。
设备会回复一个或多个配置描述符,以及相关的接口和端点信息。
然后计算机会选择一个合适的配置,并将其发送给设备。
设备收到配置信息后,会根据配置信息进行相应的初始化操作。
之后计算机会发送一些设备请求给设备,如获取设备状态、设置设备参数等。
在USB枚举过程中,计算机和设备之间的通信是基于USB传输层协议进行的。
USB传输层协议定义了几种不同类型的传输方式,如控制传输、批量传输、中断传输和等时传输。
在USB枚举过程中,主要使用控制传输。
USB枚举过程的抓包分析可以通过使用USB抓包工具,如Wireshark来进行。
通过抓包可以查看计算机和设备之间的通信过程,以及传输的数据包内容。
抓包可以帮助我们分析USB设备的插入和识别过程,以及在配置阶段的通信和数据传输。
抓包分析可以实现以下目的:1.查看设备的设备描述符和配置描述符,了解设备的供应商信息、产品信息和接口信息等。
2.分析计算机和设备之间的控制传输,了解计算机和设备之间的通信流程。
3.分析数据传输,查看数据包内容,了解数据的格式和结构。
4.分析设备和计算机之间的异常情况,如错误响应、超时等,帮助排除故障。
gd32 u盘枚举过程
gd32 u盘枚举过程GD32系列芯片是中国自主研发的一款高性能ARM Cortex-M 微控制器,支持USB设备接口功能。
当使用GD32系列芯片来进行USB传输时,需要进行U盘枚举过程,以便主机能够识别并与GD32芯片通信。
下面是GD32 U盘枚举过程的相关参考内容。
1. USB硬件连接准备:在进行U盘枚举之前,首先需要确认GD32芯片的相关硬件连接准备情况,包括连接到主机的USB接口,以及连接到U 盘存储器的SPI或SDIO接口。
确认连接正确无误后,接下来进行软件配置。
2. USB引脚配置:GD32芯片上有一些引脚是用于USB功能的,需要进行相应的引脚配置。
例如,设置引脚为USB全速模式、开启USB时钟、配置USB寄存器等。
这些操作可以通过GD32提供的软件库函数来完成。
3. USB初始化:在进行U盘枚举之前,需要对USB进行初始化,包括设定USB的传输速度、设置USB的工作模式等。
例如,可以通过调用GD32库函数usb_init函数来初始化USB。
4. 设备描述符设置:设备描述符是GD32芯片在U盘枚举过程中与主机进行通信所需的重要信息,包括设备的厂商ID、产品ID、设备类、接口等。
可以使用GD32库函数usb_set_device_descriptor函数来设置设备描述符的相关参数。
5. 配置描述符设置:配置描述符中包含了GD32芯片的配置信息,用于告知主机设备的配置和功能。
可以通过调用GD32库函数usb_set_configuration_descriptor函数来设置配置描述符的参数。
6. 接口描述符设置:接口描述符包含了GD32芯片的接口信息,用于告知主机设备的接口设置和功能。
可以使用GD32库函数usb_set_interface_descriptor函数来设置接口描述符的相关参数。
7. 端点描述符设置:端点描述符用于告知主机设备的数据传输设置和通信方式。
可以使用GD32库函数usb_set_endpoint_descriptor函数来设置端点描述符的参数。
gd32 u盘枚举过程
gd32 u盘枚举过程
GD32是一款基于ARM Cortex-M3和Cortex-M4内核的微控制器系列,它的U盘枚举过程与其他STM32系列微控制器类似。
下面是GD32 U盘枚举过程的一般流程:1. 配置USB系统时钟:首先需要配置系统时钟,确保USB时钟源的稳定和正确。
2. 配置GPIO引脚:将USB的D+和D-线与微控制器的GPIO 引脚相连,并将这些引脚配置为USB功能。
3. 初始化USB控制器:初始化USB 控制器,主要包括设置USB时钟分频器、配置USB工作模式(设备模式)、配置USB中断和DMA等参数。
4. 进行USB握手:在设备模式下,电脑主机会向设备发送“Reset”信号,设备收到信号后进行握手过程。
此时,设备会发送“Device Descriptor”给主机,主机会发送“Set Address”命令给设备。
5. 枚举过程:设备收到主机发送的“Set Address”命令后,会给设备分配一个地址。
然后设备需要进行一系列的枚举过程,包括发送“Configuration Descriptor”等,以告知主机设备的功能和接口等信息。
6. 配置端点:设备在枚举过程中,主机会发送一些命令来配置设备的端点(endpoint),即设备与主机之间的数据传输通道。
7. 数据传输:配置完端点后,设备和主机可以进行数据传输,包括发送设备状态信息、接收和发送数据等。
以上是一般的GD32 U盘枚举过程,具体的实现过程可能会因具体的GD32型号和开发环境而略有不同。
在具体的GD32开发平台上,通常会提供相应的USB库和例程,开发者可以基于这些库
和例程进行开发,简化U盘枚举过程的实现。
usb to uart 枚举过程
usb to uart 枚举过程题目:USB转UART枚举过程摘要:本文将逐步解释USB转UART的枚举过程。
首先,我们将介绍USB和UART 的概念和特点。
然后,我们将详细解释USB转UART设备的枚举过程,包括连接和通信中的每个步骤。
最后,我们将讨论一些常见的问题和解决方案。
第一部分:USB和UART的概述1. USB(Universal Serial Bus)是一种用于连接计算机和外部设备的通用接口标准。
它具有高速传输、热插拔和充电功能等特点,已广泛应用于电脑、手机等设备。
2. UART(Universal Asynchronous Receiver Transmitter)是一种异步串行通信接口,可以实现设备之间的数据传输。
它是计算机和外部设备之间通信的一种常用方式。
第二部分:USB转UART设备的枚举过程1. 连接设备:a. 将USB转UART设备插入计算机的USB插槽中。
b. 计算机检测到设备的插入,并为该设备分配一个唯一的地址。
c. 计算机发送一个设备描述符请求给该设备,以获取设备的基本信息。
2. 设备应答:a. 设备接收到计算机发送的设备描述符请求。
b. 设备回复一个设备描述符,其中包含设备的厂商ID、产品ID、设备版本号等信息。
c. 计算机将这些信息存储在系统的设备树中,以便之后与设备通信。
3. 配置设备:a. 计算机发送一个配置描述符请求给设备。
b. 设备回复一个配置描述符,其中包含有关设备如何配置的信息。
c. 计算机根据配置描述符的信息,为设备进行相应的配置。
4. 打开设备通道:a. 计算机发送一个打开设备通道的请求给设备。
b. 设备接受到请求后,打开一个数据通道,准备与计算机进行数据传输。
c. 计算机将该数据通道的句柄存储在系统中,以便之后与设备进行通信。
5. 数据传输:a. 计算机通过打开的设备通道,向设备发送数据。
b. 设备接收到数据后,进行相应的处理,并将处理结果返回给计算机。
USB枚举过程
USB枚举过程0. 枚举流程• 连接了设备的 HUB 在 HOST 查询其状态改变端点时返回对应的 bitmap,告知HOST 某个PORT状态发⽣了改变。
• 主机向 HUB 查询该PORT的状态,得知有设备连接,并知道了该设备的基本特性。
• 主机等待(⾄少 100mS)设备上电稳定,然后向 HUB 发送请求,复位并使能该PORT。
• HUB执⾏PORT复位操作,复位完成后该PORT就使能了。
现在设备进⼊到defalut状态,可以从Vbus获取不超过 100mA 的电流。
主机可以通过 0地址与其通讯。
• 主机通过0地址向该设备发送get_device_descriptor标准请求,获取设备的描述符。
• 主机再次向 HUB 发送请求,复位该PORT。
• 主机通过标准请求 set_address给设备分配地址。
• 主机通过新地址向设备发送get_device_descriptor标准请求,获取设备的描述符。
• 主机通过新地址向设备发送其他 get_configuration请求,获取设备的配置描述符。
• 根据配置信息,主机选择合适配置,通过 set_configuration请求对设备⽽进⾏配置。
这时设备⽅可正常使⽤。
1. GET_DESCRIPTOR总线复位及向默认地址0发送GET_DESCRIPTOR指令包,请求设备描述。
如(图⼀)所⽰:(图⼀)1)Index[4 - 5]:表⽰USB插⼊总线复位2)Index[7 - 8]:表⽰主机向默认地址发送GET_DESCRIPTOR指令包,详细信息也抓出来了,如(图⼆)所⽰:(图⼆)3)Index[15 - 17]:表⽰设备向主机发送设备描述数据Index[16]4)Index[18 - 19]:表⽰主机完成GET_DESCRIPTOR指令后,给设备发送⼀个空应答;2. SET_ADDRESS再次复位总线及向设备发送SET_ADDRESS指令包,设置设备地址。
实例讲解USB的枚举(配置)过程
实例讲解USB的枚举(配置)过程所需要工具•USB Monitor2.26•优盘一个网上大量介绍用bus hound作监控软件,我们为什么不选bus hound而选USB Monitor 呢,因为bus hound在WindowsXP环境不能监控USB枚举(配置)过程,它只有在Windows2000下才能实现这个功能。
不过用bus hound做除枚举以外的数据分析还是比较好用的。
USB Monitor的唯一缺点是找不到它的破解版,只能试用大约一个月的时间。
USB Monitor的安装下载USB Monitor2.26,安装一路next下去即可,安装完成后将会提示您重新启动系统。
启动您的USB Monitor1、运行安装好后的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监测到的数据进行分析了。
usb识别原理
usb识别原理
USB识别原理
USB(Universal Serial Bus,通用串行总线)是一种广泛使用的外部设备连接标准。
它可以连接计算机和各种设备,如打印机、摄像头、键盘、鼠标等。
USB识别原理基于插拔式技术,即用户可以在计算机运行时连接或拔除USB设备。
当用户将USB设备插入计算机的USB 端口时,计算机会根据一系列的识别步骤来确定设备类型,并为设备分配相应的驱动程序。
USB设备的识别过程如下:
1. 插入设备:用户将USB设备插入计算机的USB端口。
2. 电源供应:计算机通过USB端口为设备提供所需的电源供应。
3. 枚举过程:设备插入后,计算机会发送一个初始化信号,称为“设备已连接”信号,以通知每个被连接的设备。
4. 设备描述符检索:计算机通过发送一个控制命令来请求设备的描述符信息。
设备描述符包含了设备的基本信息,如设备类型、供应商ID、产品ID等。
5. 驱动程序加载:计算机会根据设备描述符的信息判断所需的驱动程序,并将驱动程序加载到操作系统中。
6. 驱动程序通信:计算机和设备驱动程序之间开始进行通信,以便于下一步的设备使用。
7. 设备使用:一旦驱动程序通信成功,计算机就可以开始使用USB设备进行相关的任务。
总结起来,USB设备的识别原理涉及到设备的插入、电源供应、枚举过程、设备描述符检索、驱动程序加载和通信等步骤。
通过这些步骤,计算机可以识别并正确使用连接的USB设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[原创] USB入门系列之六—— USB设备的枚举过程
USB主机在检测到USB设备插入后,就要对设备进行枚举了。
为什么要枚举呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。
调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。
在说枚举之前,先大概说一下USB的一种传输模式——控制传输。
这种传输在USB中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使用控制传输。
控制传输分为三个过程:①建立过程。
②可选的数据过程。
③状态过程。
建立(Setup)过程都是由USB主机发起,它开始于一个Setup令牌包,后面紧跟一个DATA0包。
如果是控制输入传输,那么数据过程就是输入数据;如果是控制输出传输,那么数据过程是输出数据。
如果在设置过程中,指定了数据长度为0,则没有数据过程。
数据过程之后是状态过程。
状态过程刚好与数据过程的数据传输方向相反:如果是控制输入传输,则状态过程是一个输出数据包;如果是控制输出传输,则状态过程是一个输入数据包。
状态阶段用来确认所有的数据都已经正确传输。
好了,下面我们来看看枚举的详细过程。
首先,USB主机检测到USB设备插入后,就会先对设备复位。
设备复位后,USB主机就会对地址为0的设备发送获取设备描述符的标准请求。
所有的USB设备在总线复位后其地址都为0,这样主机就可以跟那些刚刚插入的设备通过地址0通信。
主机在建立阶段发出获取设备描述符的输入请求,设备收到该请求后,在数据过程将设备描述符返回给主机。
主机在成功获取到一个数据包的设备描述符后并且确认没有什么错误后(注意:有些USB设备的端点0大小不足18字节(但至少具有8字节),而标准的设备描述有18字节,在这种情况下,USB设备只能暂时按最大包将部分设备描述符返回,而主机在成功获取到前面一部分描述符后,就不会再请求剩下的设备描述符部分,而是进入设置地址阶段),就会返回一个0长度的状态数据包给设备。
然后主机再对设备复位一下,接下来就会进入到设置地址阶段。
这时USB主机发出一个设置地址的请求(建立过程,设置地址无数据过程),地址包含在建立包中,具体的地址USB主机会负责管理,它会分配一个唯一的地址给新的设备。
USB设备在收到地址后,返回0长度的状态包,主机收到0长度的状态包之后,会返回一个ACK给设备。
设备在收到这个ACK之后,就可以启用新的地址了。
这样设备就分配到了一个唯一的设备地址,以后主机就通过它来进行访问该设备。
然后主机再次获取设备描述符,这次跟第一次可能有点不一样,这次需要获取完全部的18个字节的设备描述符。
当然,如果你的端点0缓冲大于18字节的话,那就跟第一次的情形一样了。
接下来,主机就会获取配置描述符。
配置描述符总共为9字节。
主机在获取到配置描述符后,根据里面的配置集合总长度,再获取配置集合。
配置集合包括配置描述符,接口描述符,端点描符等等。
如果有字符串描述符的话,还要获取字符串描述符。
另外HID设备还有HID描述符等。
使用BUS HOUND 以及通过串口返回信息,很容易看到具体的过程。
总之是主机请求什么,你的程序就响应什么。
下面这些数据是使用BUS HOUND抓的,这个是在WIN2000下抓到的,如果在WINXP下,就看不到设置地址之前的数据。
写了注释下面的部分就是主机和设备之间的数据通信,而其它的则是主机跟根集线器之间的通信数据。
Device Phase Data
Description Delta
------ ----- -------------------------------------------------- ---------------- ------------------
-----
14.1 DI 02
. 1.1.0 3.4sc
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 17us
00 ....
2.2.0 27us
14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATURE 4.1.0 110us
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 56us
14.0 DI 01 01 00
00 ....
5.2.0 14us
14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 7.1.0 109ms
14.1 DI 02
. 8.1.0 90ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 9.1.0 23us
14.0 DI 03 01 10
00 ....
9.2.0 22us
14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 10.1.0 8us
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 11.1.0 19ms
14.0 DI 03 01 00
00 ....
11.2.0 34us
/////////////第一次获取设备描述符请求//////////////////////
14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIPTOR 12.1.0 239us
/////////////第一次返回设备描述符//////////////////////////
/////////////由于该端点缓冲只有16字节,因此只读到16字节///////////
14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00
00 ........e.6!.... 12.2.0 67ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 13.1.0 49us
14.0 DI 03 01 00
00 ....
13.2.0 27us
14.0 CTL 23 03 04 00 01 00 00 00 SET FEATURE 14.1.0 24us
14.1 DI 02
. 15.1.0 112ms
14.0 CTL a3 00 00 00 01 00 04 00 GET STATUS 16.1.0 21us
00 ....
16.2.0 25us
14.0 CTL 23 01 14 00 01 00 00 00 CLEAR FEATURE 17.1.0 8us
////////////////设置地址,地址为2/////////////////////////////////
14.0 CTL 00 05 02 00 00 00 00 00 SET ADDRESS 18.1.0 19ms
///////////第二次获取设备描述符请求//////////////////////////////
14.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 19.1.0 40ms
////////////第二次返回了全部的18字节设备描述符//////////////////
14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00
00 ........e.6!.... 19.2.0 75ms
02
01 ..
////////////获取9字节的配置描述符/////////////////////////////
14.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 20.1.0 44us
////////////返回9字节的配置描述符/////////////////////////////
////////////可以看到配置描述符集合长度为0x20(即32)字节//////
14.0 DI 09 02 20 00 01 01 00
80 dd .. ...... 20.2.0
50ms
14.0 CTL a3 00 00 00 02 00 04 00 GET STATUS 21.1.0 214ms
14.0 DI 00 01 00
00 ....
21.2.0 34us
//////////再一次获取设备描述符//////////////////////////////
17.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR 22.1.0 3.8ms
/////////返回设备描述符////////////////////////////////
17.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00
00 ........e.6!.... 22.2.0 67ms
02
01 ..
//////////获取配置描述符///////////////////////
17.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR 23.1.0 28us
///////////返回配置描述符///////////////////////
17.0 DI 09 02 20 00 01 01 00。