USB 开发基础--USB 命令(请求)和USB 描述符
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.分析设备和计算机之间的异常情况,如错误响应、超时等,帮助排除故障。
usb标准请求命令
usb标准请求命令USB标准请求命令。
USB标准请求命令(Standard Request)是USB设备与主机之间进行通信的重要方式之一。
在USB通信协议中,设备可以通过发送请求命令向主机请求特定的操作,比如获取设备描述信息、设置设备参数等。
本文将对USB标准请求命令进行详细介绍,包括其格式、常见的请求类型以及具体的应用场景。
USB标准请求命令的格式。
USB标准请求命令由8个字节组成,其中包括以下几个字段:1. bmRequestType:请求类型字段,占据1个字节。
该字段包括以下几个部分:D7,数据传输方向,0表示主机到设备,1表示设备到主机。
D6~D5,请求类型,00表示标准请求,01表示类请求,10表示厂商请求。
D4~D0,接口号,用于指定设备的接口。
2. bRequest,请求码字段,占据1个字节。
该字段用于指定具体的请求操作,比如获取设备描述信息、设置设备地址等。
3. wValue,值字段,占据2个字节。
该字段用于传递请求操作的参数,具体含义由请求码决定。
4. wIndex,索引字段,占据2个字节。
该字段用于指定操作对象的索引,比如接口号、端点号等。
5. wLength,长度字段,占据2个字节。
该字段用于指定数据传输的长度。
常见的请求类型。
USB标准请求命令中,常见的请求类型包括以下几种:1. GET_DESCRIPTOR,获取设备描述信息。
设备可以通过该请求向主机获取设备的描述信息,比如设备的类别、厂商信息、产品信息等。
2. SET_ADDRESS,设置设备地址。
在设备初始化阶段,设备需要通过该请求向主机申请一个地址,以便主机能够识别该设备。
3. SET_CONFIGURATION,设置设备配置。
设备可以通过该请求通知主机其支持的配置,并请求主机进行配置。
4. GET_STATUS,获取设备状态。
设备可以通过该请求向主机获取设备的状态信息,比如连接状态、工作状态等。
5. SET_INTERFACE,设置设备接口。
usb描述符含义
usb描述符含义USB描述符是一种定义了USB设备能力和特征的数据结构。
它通过描述设备的不同方面,例如设备的配置、接口和端点规范,为计算机系统提供了与USB设备进行通信的方法。
每个USB设备都包含一个或多个描述符,这些描述符以二进制形式存储在设备的固件中。
USB描述符的含义可以从以下几个方面来解释。
首先,设备描述符是USB设备的一个重要组成部分。
它包含了设备的厂商和产品ID、USB规范版本号、设备类别、设备能力以及设备的供电要求等信息。
通过读取设备描述符,计算机系统可以识别并与USB设备进行通信。
其次,配置描述符描述了设备的配置信息。
它包含了配置的唯一标识符、供电要求、接口数目以及所需的带宽等信息。
计算机系统在与USB设备进行通信时,会根据配置描述符来分配资源并设置设备的工作模式。
接口描述符提供了关于设备接口的详细信息。
它包含了接口类别、子类别、协议以及与接口关联的端点数目等信息。
通过读取接口描述符,计算机系统可以了解设备接口的功能和特性。
最后,端点描述符描述了设备端点的特性。
端点是USB设备和计算机系统之间进行数据传输的通道。
端点描述符包含了端点的类型、方向、最大数据包长度以及传输速率等信息。
计算机系统通过读取端点描述符,了解设备端点的能力和规范,以便进行数据的传输和控制。
总之,USB描述符作为USB设备的重要组成部分,提供了与计算机系统进行通信和操作的必要信息。
通过解读这些描述符,计算机系统可以有效地管理和控制USB设备,实现数据传输和设备控制的功能。
usb描述符含义
usb描述符含义
USB(Universal Serial Bus)描述符是在USB设备和主机之间进行通信时使用的数据结构。
USB 描述符包含有关USB设备或设备的某个接口的信息,例如设备的厂商ID、产品ID、设备类别、端点信息等。
USB描述符通常由设备在被连接到主机时发送给主机。
以下是常见的USB描述符及其含义:
1. 设备描述符(Device Descriptor):
-包含设备的基本信息,如USB规范版本、设备类别、厂商ID、产品ID、设备版本号等。
2. 配置描述符(Configuration Descriptor):
-描述设备的一个或多个配置,每个配置可能包含一个或多个接口。
3. 接口描述符(Interface Descriptor):
-描述一个配置中的一个接口,包括接口的数量、接口的类别、子类别和协议。
4. 端点描述符(Endpoint Descriptor):
-描述接口上的每个端点(endpoint),包括端点的地址、传输类型(控制、批量、等等)、最大数据包大小等信息。
5. 字符串描述符(String Descriptor):
-包含设备的可读字符串信息,例如制造商名称、产品名称等。
这些描述符是通过设备的控制端点(Control Endpoint)进行交互的,控制端点使用标准的USB控制请求(Control Requests)来获取有关设备和接口的信息。
USB描述符是为了让主机能够正确地配置和与USB设备进行通信而设计的,它们提供了有关设备和接口的重要信息,以确保设备与主机之间的兼容性。
USB设备请求和描述符整理
USB 设备请求和描述符整理一.标准USB 设备请求请求名 请求号 功能GetStatus 00H 读取设备、接口或端点的状态 ClearFeature 01H 清除或禁止设备、接口或端点的某些特性 SetFeature 03H 设置或使能设备、接口或端点的某些特性SetAddress 05H 分配设备地址 GetDescriptor 06H 读取指定描述符SetDescriptor 07H 更新已有的描述符或添加新的描述符GetConfiguration 08H 读取USB 设备当前的配置值 SetConfiguration 09H 为USB 设备选择一个合适的配置 GetInterface 0AH 读取指定接口的当前可替换设置值 SetInterface 0BH 为指定接口选择一个合适的可替换设置SynchFrame0CH读取同步端点所指定的帧序号1. GetStatus 请求 bmRequestTypebRequest wValue wIndex wLength 数据阶段 80H 0000H 设备状态 81H 接口号 接口状态 82H00H0000H端点号0002H端点状态bmRequestType 为请求属性,每位定义如下(以下每个请求不再重复说明):D7:传输方向0=主机至设备;1=设备至主机 D6..5:种类 0=标准;1=类; 2=厂商;3=保留 D4..0:接受者 0=设备;1=接口 ; 2=端点;3=其他 4..31 保留bRequest 指明请求号,GetStatus 的请求号为00H 。
wValue 定义为0。
wIndex 字段的“接口”和“端点”取值分别对应USB 接口描述符的bInterfaceNumber 字段值和端点描述符的bEndpointAddress 字段值。
wLength 指明返回数据包的长度。
数据阶段:对于设备状态,返回两个字节中只有D0和D1位有效。
USB学习
1
位图
供电模式的选择
8
MaxPower
1
mA
设备从总线提取的最大电流
字段名称
说明
bLength
0x09
bDescriptorType
0x02
wTotalLength
返回的所有描述符(配置、接口和端点)的数据大小总和
bNumInterfaces
bConfigurationValue
数码相机控制器
影像设备类
USB Camera Controller
扫描仪控制器
影像设备类
视频控制器
影像设备类
USBVedio Controller
调制解调器
USB通信设备
USB Modern
USB-USB桥
通过USB实现PC互连
USB to USB bridge
字段名称
说明
bLength
0x12
bDescriptorType
U盘
Usb flash controller
ICSI, ALI,ALCOR
IDE控制器
移动硬盘
并口桥
USB转并口芯片
Usb to parallel bridge
串口桥
USB转串口芯片
Usb to serial bridge
读卡器
智能卡设备类
Usb smart card
ALI,ALCOR
音频控制器
音频设备类
设置(SETUP)
1101
启动一个方向为通过控制传输管道进行的数据传输,并且包含了设备地址和端点信号
数据包
数据0(DATA0)
0011
偶数据包
图解USB协议之三 USB标准描述符
欢迎访问avatar的电子博客:EET站点:/BLOG_zhou36_301.HTM EDN站点:/avatar/
1 协议 协议码:bInterfaceClass 和
bInterfaceSubClass 域的值而定.如果一个
接口支持设备类相关的请求此域的值指出了设备
类说明中所定义的协议.
8 iInterface
1 索引 描述此接口的字串描述符的索引值。
4、标准端点描述符
偏移量
域
0
bLength
1
bDescriptorType
欢迎访问avatar的电子博客:EET站点:/BLOG_zhou36_301.HTM EDN站点:/avatar/
Avatar 的邮箱:avatar_1210@
图解 USB 协议之三 USB 标准描述符
下面对 USB 标准描述符进行说明。
一、USB 标准描述符
1、标准设备描述符
偏移量
域
0 bLength
大小 1
值 数字
描述 描述符的大小=12H
1 bDecriptorType 2 bcdUSB
4 bDeviceClass
1 常量 设备描述符类型=01H
2 BCD 码 此设备与描述符兼容的 USB 设备说明版本号(BCD 码)
2 … 2
值 N+2 常量
数字 … 数字
描述 描述符的大小 字串描述符类型=03H
语言标识(LANGID)码 0
… 语言标识(LANGID)码 X
6、UNICODE 字串描述符
欢迎访问avatar的电子博客:EET站点:/BLOG_zhou36_301.HTM EDN站点:/avatar/
STM32USB设备描述符、配置描述符、端点描述符含义
STM32USB设备描述符、配置描述符、端点描述符含义查了⼀整天的资料,⾃⼰把不懂的全部试了⼀遍⼀下是程序以及注释/* USB设备描述符*/const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] ={0x12, /*bLength 描述符的长度*/USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType 描述符的类型(设备描述符为0x01)*/0x00, /*bcdUSB USB协议的版本*/0x02,0x00, /*bDeviceClass 类代码*/0x00, /*bDeviceSubClass ⼦类代码*/0x00, /*bDeviceProtocol 设备所使⽤的协议*/0x40, /*bMaxPacketSize 端点0的最⼤包长*//*idVendor ⼚商ID*/LOBYTE(USB_VID),HIBYTE(USB_VID),/*idProduct 设备ID*/LOBYTE(USB_PID),HIBYTE(USB_PID),0x00, /*bcdDevice rel 设备版本号*/0x02,1, /*描述⽣产⼚家的字符串描述符的索引*/2, /*描述产品的字符串描述符的索引*/3, /*产品序列号的字符串描述符的索引*/0x01/*bNumConfigurations 可能的配置数*/}; /* CustomHID_DeviceDescriptor *//* USB配置描述符 *//* All Descriptor s (Configuration, Interface, Endpoint, Class, Vendor */const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] ={//以下为配置描述符0x09, /* bLength: 端点描述符长度*/USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: 描述符类型(配置描述符为0x02) */LOBYTE(CUSTOMHID_SIZ_CONFIG_DESC),/* wTotalLength: 配置描述符集合总长度 */HIBYTE(CUSTOMHID_SIZ_CONFIG_DESC),0x01, /* bNumInterfaces: 该配置所⽀持的接⼝数*/0x01, /* bConfigurationValue: 该配置的值*/0x00, /* iConfiguration: 描述配置的字符串描述符的索引*/0xA0, /* bmAttributes:该设备的属性(总线供电,⽀持远程唤醒)bit 4 ... 0: 保留(必须为0)bit 5: 1表⽰⽀持远程唤醒bit 6: 1表⽰设备是⾃供电 0表⽰是总线供电bit 7: 保留(必须为1) */0xC8, /* MaxPower 设备所需要的电流(单位为2mA)400 mA*///以下为接⼝描述符0x09, /* bLength: 接⼝描述符长度*/USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: 描述符类型(接⼝描述符为0x04)*/0x00, /* bInterfaceNumber: 该接⼝编号(从0开始) */0x00, /* bAlternateSetting: 该接⼝的备⽤编号 */0x02, /* bNumEndpoints 该接⼝所使⽤的端点数*/0x03, /* bInterfaceClass: 该接⼝所使⽤的类*/0x00, /* bInterfaceSubClass : 该接⼝所使⽤的⼦类 */0x00, /* nInterfaceProtocol : 该接⼝所使⽤的协议 0 =⽆,1 =键盘,2 =⿏标*/0, /* iInterface: 描述该接⼝的字符串描述符的索引 *///以下为HID描述符0x09, /* bLength: HID描述符长度 */HID_DESCRIPTOR_TYPE, /* bDescriptorType: 描述符类型(接⼝描述符为0x21) */0x10, /* bcdHID: HID 协议版本号 */0x01,0x00, /* bCountryCode: 国家代码 (美式键盘代码为0x21)*/0x01, /* bNumDescriptors:下级描述符的数量*/0x22, /* bDescriptorType 下级描述符的类型*/LOBYTE(CUSTOMHID_SIZ_REPORT_DESC),/* wItemLength: 下级描述符的长度*/HIBYTE(CUSTOMHID_SIZ_REPORT_DESC),//以下为端点描述符/******************** Descriptor of Custom HID endpoints ******************/0x07, /* bLength:端点描述符长度 */USB_ENDPOINT_DESCRIPTOR_TYPE, /* 描述符类型(端点描述符为0x05)*/0x81, /* bEndpointAddress:端点地址bit 3 ... 0:端点号bit 6 ... 4:保留(设置为0)bit 7:0(OUT),1(IN)*/0x03, /* bmAttributes: 端点属性bit 1 ... 0:表⽰该端点的传输类型0 控制传输1 等时传输2 批量传输3 中断传输bit 7 ... 2:如果该端点是⾮等时传输则bit 7 ~ 2 保留(设置为0)如果该端点是等时传输bit 3 ... 2:表⽰同步类型0 ⽆同步1 异步2 适配3 同步bit 5 ... 4:表⽰⽤途0 数据端点1 反馈端点2 暗含反馈的数据端点3 保留bit 7 ... 6:保留*/0x40, /* wMaxPacketSize: 该端点⽀持的最⼤包长度 */0x00,0x0A, /* bInterval:端⼝的查询时间*///以下为输出端点1描述符0x07, /*bLength:端点描述符⼤⼩ */USB_ENDPOINT_DESCRIPTOR_TYPE, /* 端点描述符类型*/0x01, /* bEndpointAddress:端点地址bit 3 ... 0:端点号bit 6 ... 4:保留bit 7:0(OUT),1(IN)*/0x03, /* bmAttributes: 中断端点 */0x40, /* wMaxPacketSize: 最多64个字节 */0x00,0x0A, /* bInterval: 轮询间隔(20毫秒)*/};。
USB设备键值表描述符说明
3.1 USB鼠标发送的数据结构USB鼠标发送的数据为4字节,在第1字节中,bit0为左键(1为按下,0为未按下),bit1为右键(1为按下,0为未按下),bit3为中键(1为按下,0为未按下),剩余五位为0,这是为了凑够1字节而填充一些数据。
第2字节表示鼠标移动的X轴,是有符号的,正值表示鼠标向正半轴移动的相对距离,负值表示鼠标向负半轴移动的相对距离。
第3字节表示鼠标移动的Y轴,是有符号的,正值表示鼠标向正半轴移动的相对距离,负值表示鼠标向负半轴移动的相对距离。
第4字节表示滚轮移动的位移,是有符号的,正值表示滚轮向上移动的相对距离,负值表示滚轮向下移动的相对距离。
3.2 USB键盘发送和接收的数据结构USB键盘发送的数据为8字节,第1字节中的8位分别代表8个特殊按键:左Shift、左Ctrl、左Windows、左Alt、右Shift、右Ctrl、右Windows、右Alt;第2字节为0,该字节为保留字节,留给OEM使用;最后6个字节表示剩余的普通按键(键值表见下一节),也就是说标准USB键盘一次最多按下6个按键。
USB键盘接收的数据为1字节,是用来点亮键盘上的LED灯的控制信号,该字节的前5位依次表示数字键盘灯、大写锁定灯、滚动锁定灯以及日语、韩语的语种切换灯。
该字节的后3位为保留字节,和前面5位凑成1字节。
3.2 USB键盘的键值#define KEY_NULL 0x00#define KEY_A 0x04 //A#define KEY_B 0x05 //B#define KEY_C 0x06 //C#define KEY_D 0x07 //D#define KEY_E 0x08 //E#define KEY_F 0x09 //F#define KEY_G 0x0A //G#define KEY_H 0x0B //H#define KEY_I 0x0C //I#define KEY_J 0x0D //J#define KEY_K 0x0E //K#define KEY_L 0x0F //L#define KEY_M 0x10 //M#define KEY_N 0x11 //N#define KEY_O 0x12 //O#define KEY_P 0x13 //P#define KEY_Q 0x14 //Q#define KEY_R 0x15 //R#define KEY_S 0x16 //S#define KEY_T 0x17 //T#define KEY_U 0x18 //U#define KEY_V 0x19 //V#define KEY_W 0x1A //W#define KEY_X 0x1B //X#define KEY_Y 0x1C //Y#define KEY_Z 0x1D //Z#define KEY_1 0x1E //1 !#define KEY_2 0x1F //2 @#define KEY_3 0x20 //3 ##define KEY_4 0x21 //4#define KEY_5 0x22 //5#define KEY_6 0x23 //6#define KEY_7 0x24 //7#define KEY_8 0x25 //8#define KEY_9 0x26 //9#define KEY_0 0x27 //0#define KEY_ENTER 0x28#define KEY_ESC 0x29#define KEY_BACKSPACE 0x2A#define KEY_TAB 0x2B#define KEY_SPACE 0x2C#define KEY_SUB 0x2D // - and _ #define KEY_EQUAL 0x2E // = and + #define KEY_LEFT_BRACKET 0x2F // [ and { #define KEY_RIGHT_BRACKET 0x30 // ] and } #define KEY_VERTICAL_LINE 0x31 // "\" and | #define KEY_WAVE 0x32 // ` and ~#define KEY_SEMICOLON 0x33 // ; and : #define KEY_QUOTE 0x34 // ' and " #define KEY_THROW 0x35 // ~ and ` #define KEY_COMMA 0x36 // , and < #define KEY_DOT 0x37 // . and > #define KEY_QUESTION 0x38 // / and ? #define KEY_CAPS_LOCK 0x39#define KEY_F1 0x3A#define KEY_F2 0x3B#define KEY_F3 0x3C#define KEY_F4 0x3D#define KEY_F5 0x3E#define KEY_F6 0x3F#define KEY_F7 0x40#define KEY_F8 0x41#define KEY_F9 0x42#define KEY_F10 0x43#define KEY_F11 0x44#define KEY_F12 0x45#define KEY_PRT_SCR 0x46#define KEY_SCOLL_LOCK 0x47#define KEY_PAUSE 0x48#define KEY_INS 0x49#define KEY_HOME 0x4A#define KEY_PAGEUP 0x4B#define KEY_DEL 0x4C#define KEY_END 0x4D#define KEY_PAGEDOWN 0x4E#define KEY_RIGHT_ARROW 0x4F#define KEY_LEFT_ARROW 0x50#define KEY_DOWN_ARROW 0x51#define KEY_UP_ARROW 0x52#define KEY_PAD_NUMLOCK 0x53#define KEY_LCTRL0xE0//左ctrl0x01#define KEY_LALT0xE2//左Alt0x04#define KEY_LSHFIT0xE1//左Shift0x02#define KEY_LWIN0xE3//左windows0x08#define KEY_RWIN0xE7//右windows0x80#define KEY_RSHIFT0xE5//右Shift0x20。
usb识别为未知设备设备描述符请求失败的解决方法
usb识别为未知设备设备描述符请求失败的解决方法当我们将USB设备连接到计算机时,通常会自动识别并安装驱动程序。
然而,有时候我们可能会遇到USB设备被识别为未知设备,设备描述符请求失败的问题。
这个问题可能出现在Windows、Mac或Linux系统中。
在本文中,我将介绍一些可能的解决方法来解决USB设备被识别为未知设备的问题。
1.检查USB连接和设备首先,要确保USB设备的连接良好。
可以尝试重新插拔设备,或者用不同的USB端口进行尝试。
有时候,USB接口可能损坏或松动导致设备无法正常工作。
另外,如果使用的是USB扩展坞、集线器或分线器,也可以尝试直接连接到计算机来排除这些设备可能引起的问题。
2.更新驱动程序设备描述符请求失败的原因可能是由于计算机没有正确的驱动程序来识别USB设备。
因此,尝试更新设备的驱动程序是解决问题的第一步。
可以通过以下步骤来更新驱动程序。
a.打开“设备管理器”b.在设备管理器中找到未知设备,通常可以在“通用串行总线控制器”或“其他设备”下找到。
c.鼠标右键点击未知设备并选择“属性”d.在属性窗口中,点击“驱动程序”选项卡e.选择“更新驱动程序”以自动搜索可用的驱动程序,或者选择“浏览计算机以查找驱动程序”以手动选择和安装驱动f.如果驱动程序已经是最新的,那么可以尝试卸载设备并重新启动计算机,让系统重新安装驱动程序。
3.禁用电源管理功能电源管理功能可能会导致USB设备无法正常工作。
尝试禁用电源管理功能可以解决USB设备被识别为未知设备的问题。
a.打开“设备管理器”b.在设备管理器中找到未知设备c.鼠标右键点击未知设备并选择“属性”d.在属性窗口中,点击“电源管理”选项卡e.取消勾选“允许计算机关闭此设备以节省电源”选项f.点击“确定”保存更改,并重新启动计算机。
4.清除USB驱动程序缓存USB驱动程序缓存可能会导致设备描述符请求失败的问题。
清除USB驱动程序缓存可以解决这个问题。
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。
mfc 枚举usb 描述符 -回复
mfc 枚举usb 描述符-回复标题:MFC框架下枚举USB描述符的详细步骤在现代计算机系统中,USB(Universal Serial Bus)设备的广泛应用使得开发者需要掌握如何与其进行有效的通信。
其中,理解并枚举USB描述符是关键的一步。
本文将以MFC(Microsoft Foundation Classes)框架为背景,详细介绍如何枚举USB描述符。
一、USB描述符概述USB描述符是USB设备向主机提供自身信息的数据结构,包括设备描述符、配置描述符、接口描述符、端点描述符等。
这些描述符包含了设备的各种属性,如设备类型、供应商ID、产品ID、设备版本、配置数量、接口数量、端点数量和类型等。
二、MFC环境下的USB通信基础在MFC环境下进行USB通信,我们需要使用到Windows SDK提供的USB API。
主要涉及到的API函数包括CreateFile()、DeviceIoControl()、CloseHandle()等。
1. CreateFile():用于打开一个USB设备,返回一个设备句柄。
2. DeviceIoControl():用于向USB设备发送控制请求,获取或设置设备状态。
3. CloseHandle():用于关闭已经打开的USB设备。
三、枚举USB设备在枚举USB设备之前,我们需要首先获取所有连接到系统的USB设备的列表。
这可以通过调用SetupDiGetClassDevs()函数实现。
以下是一个简单的示例代码:cppGUID guid = GUID_DEVINTERFACE_USB_DEVICE;HDEVINFO hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT);这段代码会返回一个设备信息集句柄hDevInfo,该句柄包含了所有当前连接的USB设备的信息。
四、枚举USB描述符获取到USB设备列表后,我们就可以开始枚举每个设备的描述符了。
实例讲解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是一种通用串行总线,全称Universal Serial Bus,通常被称为USB。
它是由Intel公司于1996年推出的,由7组信号和4根线组成,支持高速数据传输。
使用USB接口,各个计算机硬件设备可以连接在一起,实现数据的传输和共享。
USB描述符是一类标准文件,是用来描述USB设备的硬件特性,如设备的功能、总线的速率等。
它由USB设备厂商设计,是由设备驱动程序识别和使用USB设备的关键文件。
据统计,USB描述符已经在全球范围内普及,可以应用于任何USB设备。
USB描述符通常由Device Descriptor(设备描述符)、Configuration Descriptor(配置描述符)、Interface Descriptor(接口描述符)、Endpoint Descriptor(端点描述符)和Class Descriptor (类描述符)组成。
这5种描述符是USB设备描述文件的基本类型,它们描述了USB设备的功能、规格、总线协议等信息。
Device Descriptor(设备描述符)是USB设备的基本描述文件,主要包括设备的VID(vendor ID,厂商编号)、PID(产品编号)、Class、Subclass、Protocol(协议版本)、MaxPower(最大功耗)等。
设备描述符是其他描述符的基础,可以用来识别和枚举设备。
Configuration Descriptor(配置描述符)是描述USB设备配置的描述文件,主要包括配置属性、总线电源类型、接口数。
usb识别为未知设备设备描述符请求失败的解决方法
usb识别为未知设备设备描述符请求失败的解决方法USB设备被识别为未知设备或设备描述符请求失败是一种常见的USB连接问题,它可能导致设备无法正常工作。
这种问题通常出现在Windows操作系统上,但也可能在其他操作系统上发生。
在遇到这种问题时,用户可以尝试一些解决方法来修复USB设备的识别问题。
下面我们将介绍一些常见的解决方法,希望能够帮助你解决USB设备未被识别的问题。
1.重新插拔USB设备当USB设备被识别为未知设备或设备描述符请求失败时,首先要尝试的是重新插拔USB设备。
有时由于连接问题或设备驱动程序问题,USB设备可能无法正确地被识别。
这时,将USB设备从电脑上拔下,然后再重新插上,可能会解决该问题。
在重新插拔USB设备之前,建议先关闭电脑,并点亮USB设备确保其断电状态,然后再进行插拔操作。
2.更换USB端口USB设备被识别为未知设备或设备描述符请求失败可能是由于USB 端口损坏或出现连接问题导致的。
因此,你可以尝试将USB设备插入另外一个USB端口,看看是否能够解决该问题。
如果USB设备能够在其他USB端口上正常工作,那么问题很可能是由于原来的USB端口出现了问题。
3.更新驱动程序设备描述符请求失败可能是由于设备驱动程序问题导致的。
检查你的USB设备是否配备了最新的驱动程序,如果没有,你可以尝试更新USB设备的驱动程序。
在Windows操作系统上,你可以通过设备管理器来更新设备驱动程序。
右击“此电脑”或“计算机”图标,选择“管理”,然后打开“设备管理器”,找到出现问题的USB设备,右击该设备,选择“更新驱动程序软件”,然后按照提示进行操作。
4.卸载并重新安装USB设备有时,USB设备的驱动程序可能出现问题,导致设备不能正常被识别。
你可以尝试先卸载USB设备的驱动程序,然后重新安装驱动程序来解决该问题。
在设备管理器中找到USB设备,右击该设备,选择“卸载设备”,然后重新插拔USB设备,系统会自动重新安装驱动程序。
usb 同步端点描述符
usb 同步端点描述符1.引言1.1 概述在USB(Universal Serial Bus,通用串行总线)接口标准中,同步端点描述符扮演着重要的角色。
USB是一种用于电脑和外部设备之间传输数据的通信协议,为了实现设备之间的高效通信,同步端点描述符被用于定义和配置USB设备的同步端点。
同步端点描述符定义了USB设备的同步传输端点的配置和属性,可以理解为是对同步端点的详细描述。
同步传输端点是USB设备与主机之间进行同步传输的通道,用于实时传输数据,比如音频和视频数据。
同步端点描述符可以告知主机关于端点的特性,比如端点的方向(输入或输出)、传输类型(同步或异步)以及数据传输的带宽需求等。
为了更好地理解同步端点描述符的作用,可以将其类比为一个设备的规范说明书。
它提供了对端点的详细描述,使得主机能够正确地配置和管理设备。
同步端点描述符的配置可以影响USB设备的性能和兼容性,因此,对于开发USB设备的工程师和USB设备的使用者来说,了解和理解同步端点描述符是非常重要的。
本文将对USB同步端点描述符进行深入的探讨,包括其定义和作用,结构和字段的解析。
我们将详细介绍同步端点描述符中包含的字段和其对应的含义,以及如何根据实际需求配置同步端点描述符。
接下来的正文部分将首先介绍USB同步端点描述符的定义和作用,以便读者对其有一个整体的认知。
随后,我们将深入解析同步端点描述符的结构和各个字段的含义,帮助读者更好地理解和使用同步端点描述符。
最后,我们将总结USB同步端点描述符的重要性和应用场景,并展望其未来的发展前景。
通过本文的阅读,读者将能够全面了解USB同步端点描述符的概念、结构和应用,并且能够根据需要使用和配置同步端点描述符,从而实现高效、可靠的数据传输。
1.2 文章结构本文主要讨论USB同步端点描述符。
文章分为引言、正文和结论三个部分。
在引言部分,首先对USB同步端点描述符进行概述,介绍其作用和重要性。
其次,说明文章的整体结构,即引言、正文和结论的分布,以及各部分的内容概要。
USB基础知识
1.拓扑结构USB是我们经常用的,只是看到USB线一头接着主机,一头接着USB设备。
但是设备是如何通信的呢?电气上的连接是怎么样的还不是很清楚?USB的可见的拓扑结构很好理解,就是一个USB host 接若干个Hub, hub下面接若干个USB Device。
2.枚举步骤USB协议定义了设备的6种状态,仅在枚举过程种,设备就经历了4个状态的迁移:上电状态(Powered),默认状态(Default),地址状态(Address)和配置状态(Configured)(其他两种是连接状态(Attached)和挂起状态(Suspend))。
Attached和Powered状态不难理解:当一个设备被正确插入到主机的USB接口时,就处于Attached(连接)的状态。
设备连接好了,USB主机识别了设备,同时没有对设备进行请求,USB设备就处于Suspended(挂起)状态。
下面步骤是Windows系统下典型的枚举过程,但是固件不能依此就认为所有的枚举操作都是按照这样一个流程行进。
设备必须在任何时候都能正确处理所有的主机请求。
1. 用户把USB设备插入USB端口或给系统启动时设备上电这里指的USB端口指的是主机下的根hub或主机下行端口上的hub端口。
Hub给端口供电,连接着的设备处于上电状态。
2. Hub监测它各个端口数据线上(D+/D-)的电压在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。
当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。
hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口(全速、高速设备的区分在后面的章节中描述)。
检测到设备后,hub继续给设备供电,但并不急于与设备进行USB传输。
【STM32F429】第5章ThreadXUSBX各种USB描述符简介
【STM32F429】第5章ThreadXUSBX各种USB描述符简介第5章 ThreadX USBX各种USB描述符简介本章节为⼤家讲解USB的各种描述符。
5.1初学者重要提⽰5.2 USB描述符概述5.3 USB设备描述符5.4 USB配置描述符5.5 USB接⼝描述符5.6 USB端点描述符5.7 USB字符串描述符5.8 USB设备限定符描述符5.9 总结5.1 初学者重要提⽰1、 USB1.1和USB2.0规格书以及Cypress做的中⽂版USB⽂档,⾮常推荐⼤家学习:2、 USB初学 -- ⼊门篇(USB基础知识速览)3、⽂献参考:5.2 USB描述符概述(USB Descriptors)USB设备使⽤描述符报告其属性,描述符是具有定义格式的数据结构。
每个描述符都以⼀个字节宽的字段开始,该字段包含描述符中字节的总数,然后是⼀个标识描述符类型的字段。
将USB设备连接到USB总线时,主机通过总线枚举来识别和配置设备。
设备加⼊USB⽹络后,USB主机⽴即发送设置请求。
将指⽰该设备选择配置和接⼝,以匹配USB主机上运⾏的应⽤程序需求。
选择配置和接⼝后,设备必须为活动的端点提供服务,以此与USB主机交换数据。
常⽤的描述符主要有:设备描述符(Device Descriptor)配置描述符(Configuration Descriptor)接⼝描述符(Interface Descriptor)⼀个或多个端点描述符(Endpoint Descriptor)字符串描述符(String Descriptor)字符串描述符是另⼀种可选的描述符,它为⽤户提供了有关设备的可读信息。
设备限定符描述符(Device Qualifier Descriptor)它提供了⽀持⾼速性能的设备信息,该信息会根据设备的不同运⾏速度⽽不同。
复杂设备具有多个接⼝。
每个接⼝可以有多个端点。
例如,IP语⾳电话可能具有:A. ⼀个⾳频类接⼝,带有2个同步端点,⽤于在每个⽅向上传输⾳频数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
无
(高字
节为 0,
低字节
表示要
设置的
配置值)
Set_Descriptor 00000000B
SET_DESCRIPTOR
描述表 零或语 种类(高 言标志 字节,见 表 5)和 索引(低 字节)
描述表长 描述 表
Set_Feature
00000000B 00000001B 00000010B
SET_FEATURE
1
bRequest
1
值 命令类型编码值(见表 3)
2
wValue
2
值 根据不同的命令,含义也不同
4
wIndex
索引或偏 根据不同的命令,含义也不同,主要用于传送索引 2
移 或偏 移
6
wLength
2
如有数据传送阶段,此为数据字节数。
下表列出了 USB 的 11 种标准命令
表 2、USB 的 11 种标准命令
偏移量 0 1 2 4 5 6 7
8
表 8、USB 配置描述符的结构
域
大小
值
描述
bLength
1
数字 此描述表的字节数长度。
bDescriptorType
1
常量 配置描述表类型(此处为 0x02)
wTotalLength
2
数字 此配置信息的总长(包括配置,接口,端
点和设备类及厂商定义的描述符)
bNumInterfaces
2
ID 厂商标志(由 USB-IF 组织赋值)
10
idProduct
2
ID 产品标志(由厂商赋值)
12
bcdDevice
2 BCD 码 设备发行号(BCD 码)
14
iManufacturer
1 索引 描述厂商信息的字符串描述符的索引值。
15
iProduct
1 索引 描述产品信息的字串描述符的索引值。
GET_STATUS
零
零(返回 二
设备状
态)
接口号
(对像
时接口
时)
端点号
(对象
是端点
时)
设备, 接 口, 或 端点 状态
Set_Address
00000000B
SET_ADDRESS
设备地 零
零
无
址
Set_Configuration 00000000B
SET_CONFIGURATION 配置值 零
零
不同的命令虽然有不同的数据和使用目的,但所有的 USB 命令结构是一样的。下表所 示为 USB 命令的结构:
表 1、USB 命令的结构
长度(字
偏移量
域
值 描述
节)
0 bmRequestType
1
位图
请求特征: D7:传输方向 0=主机至设备 1=设备至主机 D6..5:种类 0=标准 1=类 2=厂商 3=保留 D4..0:接受者 0=设备 1=接口 2=端点 3=其他 4..31 保留
1、设备描述符
设备描述符给出了 USB 设备的一般信息,包括对设备及在设备配置中起全程作用的信 息,包括制造商标识号 ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描 述符的个数等。一个 USB 设备必须有且仅有一个设备描述符。设备描述符是设备连接到总 线上时 USB 主机所读取的第一个描述符,它包含了 14 个字段,结构如下:
每个 USB 设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即 USB 设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即 USB 设备可以支持多种功能(接口),接口的特性通过描述符提供。
在 USB 主机访问 USB 设备的描述符时,USB 设备依照设备描述符、配置描述符、接 口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备 描述符、配置描述符和接口描述符,如果 USB 设备没有端点描述符,则它仅仅用默认管道 与主机进行数据传输。
描述符值 0x01 0x02 0x03 0x04 0x05
类描述符 厂商定义的描述符
集线器类描述符(Hub Descriptor) 人机接口类描述符(HID)
设备类代码 bDeviceClass 可查下表:
值(十进制) 0 2 9
220 224 255
表 6、设备的类别(bDeviceClass)
1
数字 此配置所支持的接口个数
bCongfigurationValue 1
数字
在 SetConfiguration()请求中用作参 数来选定此配置。
iConfiguration
1
索引 描述此配置的字串描述表索引
bmAttributes
1
位图 配置特性:
D7: 保留(设为一)
D6: 自给电源
D5: 远程唤醒
零
一
配置 值
Get_Descriptor 10000000B
GET_DESCRIPTOR
描述表 零或语 种类(高 言标志 字节,见 表 5)和 索引(低 字节)
描述表长 描述 表
Get_Interface
10000001B
GET_INTERFACE
零
接口号 一
可选 设置
Get_Status
10000000B 10000001B 10000010B
2
SET_FEATURE
3
为将来保留
4
SET_ADDRESS
5
GET_DESCRIPTOR
6
SET_DESCRIPTOR
7
GET_CONFIGURATION
8
SET_CONFIGURATION
9
GET_INTERFACE
10
SET_INTERFACE
11
SYNCH_FRAME
12
特性选 零
零
择符(1 接口号
D4..0:保留(设为一)
一个既用总线电源又有自给电源的设备
会在 MaxPower 域指出需要从总线取的
电量。并设置 D6 为一。运行时期的实际
电源模式可由 GetStatus(DEVICE) 请
求得到。
MaxPower
1
mA 在此配置下的总线电源耗费量。以 2mA
为一个单位。
下面是一种硬盘的配置描述符示例:
1 子类 子类挖码
这些码值的具体含义根据 bDeviceClass 域来看。
如 bDeviceClass 域为零,此域也须为零
如 bDeviceClass 域为 FFH,此域的所有值保留。
6
bDevicePortocol
1 协议 协议码
这些码的值视 bDeviceClass 和
bDeviceSubClass 的值而定。
16
iSerialNumber
1 索引 描述设备序列号信息的字串描述符的索引值。
17
bNumConfigurations 1 数字 可能的配置描述符数目
其中 bDescriptorType 为描述符的类型,其含义可查下表(此表也适用于标准命令 Get_Descriptor 中 wValue 域高字节的取值含义):
表示设 端点号
备,0 表
示端点)
可选设 接口号 零 置
零
端点号 二
无
无 帧号
二、USB 描述符
USB 协议为 USB 设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标 准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符,还有百 标准描述符,如类描述符。USB 设备通过这些描述符向 USB 主机汇报设备的各种各样属性, 主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程 序。
1
类 设备类码:
如果此域的值为 0 则一个设置下每个接口指出它
自己的类,各个接口各自独立工作。
如果此域的值处于 1~FEH 之间,则设备在不同的
接口上支持不同的类。并这些接口可能不能独立工
作。此值指出了这些接口集体的类定义。
如果此域设为 FFH,则此设备的类由厂商定义。
5
bDeviceSubClass
值(十六进制)
说明
0x00
接口描述符中提供类的值
0x02
通信类
0x09
集线器类
0xDC
用于诊断用途的设备类
0xE0
无线通信设备类
0xFF
厂商定义的设备类
下表列出了一个 USB 鼠标的设备描述符的例子,供大家分析一下:
字段 bLength bDecriptorType bcdUSB bDeviceClass bDeviceSubClass bDevicePortocol bMaxPacketSize0 idVendor idProduct bcdDevice iManufacturer iProduct iSerialNumber bNumConfigurations
USB 设备通过描述符反映自己的设备特性。USB 描述符是由特定格式排列的一组数据 结构组成。
在 USB 设备枚举过程中,主机端的协义软件需要解析从 USB 设备读取的所有描述符 信息。在 USB 主向设备发送读取描述符的请求后,USB 设备将所有的描述符以连续的数据 流方式传输给 USB 主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺 序地解析读到的数据流。
一、USB 命令
在 USB 规范里,对命令一词提供的单词为“Request”,但这里为了更好的理解主机与 设备之间的主从关系,将它定义成“命令”。
所有的 USB 设备都要求对主机发给自己的控制命令作出响应,USB 规范定义了 11 个 标准命令,它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、 Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、 Set_Interface、Set_Feature、Synch_Frame。所有 USB 设备都必须支持这些命令(个 别命令除外,如 Set_Descriptor、Synch_Frame)。