USB驱动开发——USB描述符

合集下载

USB 开发基础--USB 命令(请求)和USB 描述符

USB 开发基础--USB 命令(请求)和USB 描述符

类型 标准描述符
表 5、USB 描述符的类型值 描述符 设备描述符(Device Descriptor) 配置描述符(Configuration Descriptor) 字符串描述符(String Descriptor) 接口描述符(Interface Descriptor) 端点描述符(EndPont Descriptor)
一、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)。
USB 设备通过描述符反映自己的设备特性。USB 描述符是由特定格式排列的一组数据 结构组成。
在 USB 设备枚举过程中,主机端的协义软件需要解析从 USB 设备读取的所有描述符 信息。在 USB 主向设备发送读取描述符的请求后,USB 设备将所有的描述符以连续的数据 流方式传输给 USB 主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺 序地解析读到的数据流。
偏移量 0 1 2
域 bLength bDecriptorType bcdUSB
表 4、USB 设备描述符的结构

USB驱动开发之USB描述符

USB驱动开发之USB描述符

USB驱动开发——USB描述符观察USB设备1.usbview图1 通用串行总线控制器usbview 在C:\WINDDK\2600\src\wdm\usb\usbview\objchk\i386文件夹下,如图2所示的usbview.exe文件。

图2 usbview目录图3 usbview观察USB外接设备如图3所示,可以看出端口8(port8),以及图形右边关于插入U盘的描述信息。

2.bus hound 使用指南bus hound 5.0使用方法如下:1.请下载安装bus hound 5.0全功能版:/down/view.asp?id=282.安装完毕后请一定要重启,否则软件不能工作;3.进行USB监控的主要步骤如下:(1)启动软件,将USB设备插入USB口;(2)在DEVICE内选择设备,例如我的设备是一个U盘,则设备为USB DEVICE,选中该设备,可以在下面的PROPERTIES看到设备的总线类型,设备的电源以及各个端点的功能,在该设备下面还有两个分支:USB AUDIO DEVICE 和 "USB人体学输入设备"(这就是本设备占用的两个接口),一样在PROPERTIES里面可以看到他们的类代码为0x01和0x03。

(3)在看完基本信息后,将上述的某个接口,或者全部打勾。

(4)切换到"SETTING"选项卡,将MAX PHASE设置为512,这样你就可以看到完全的DESCRIPTOR 和其他的数据了。

(5)在"PHASE TO CAPTURE"里面的几个和USB相关的选项如下:CDB:命令描述符块;CTL:USB控制传输;DI/D数据输入/输出;LEN:数据长度;INSOC:同步传输;RSET:总线复位;URB:USB请求块;USTS:USB状态。

查看USB数据传输就把它们都打勾就行了;(6)在"Coloumn to display"里面,把里面的全部打勾。

usb描述符含义

usb描述符含义

usb描述符含义USB描述符是一种定义了USB设备能力和特征的数据结构。

它通过描述设备的不同方面,例如设备的配置、接口和端点规范,为计算机系统提供了与USB设备进行通信的方法。

每个USB设备都包含一个或多个描述符,这些描述符以二进制形式存储在设备的固件中。

USB描述符的含义可以从以下几个方面来解释。

首先,设备描述符是USB设备的一个重要组成部分。

它包含了设备的厂商和产品ID、USB规范版本号、设备类别、设备能力以及设备的供电要求等信息。

通过读取设备描述符,计算机系统可以识别并与USB设备进行通信。

其次,配置描述符描述了设备的配置信息。

它包含了配置的唯一标识符、供电要求、接口数目以及所需的带宽等信息。

计算机系统在与USB设备进行通信时,会根据配置描述符来分配资源并设置设备的工作模式。

接口描述符提供了关于设备接口的详细信息。

它包含了接口类别、子类别、协议以及与接口关联的端点数目等信息。

通过读取接口描述符,计算机系统可以了解设备接口的功能和特性。

最后,端点描述符描述了设备端点的特性。

端点是USB设备和计算机系统之间进行数据传输的通道。

端点描述符包含了端点的类型、方向、最大数据包长度以及传输速率等信息。

计算机系统通过读取端点描述符,了解设备端点的能力和规范,以便进行数据的传输和控制。

总之,USB描述符作为USB设备的重要组成部分,提供了与计算机系统进行通信和操作的必要信息。

通过解读这些描述符,计算机系统可以有效地管理和控制USB设备,实现数据传输和设备控制的功能。

winusb设备的开发方法

winusb设备的开发方法

winusb设备的开发方法
开发WinUSB设备涉及一些复杂的步骤和概念,需要一定的专业
知识和经验。

以下是开发WinUSB设备的一般步骤和方法:
1. 硬件设计,首先需要设计和制造符合WinUSB标准的硬件设备。

这可能涉及选择合适的芯片、接口和电路设计。

2. 驱动程序开发,WinUSB设备需要相应的驱动程序来与Windows操作系统进行通信。

通常使用微软提供的WinUSB驱动框架
来开发驱动程序。

开发驱动程序需要熟悉Windows Driver Kit (WDK) 和 Windows Driver Framework (WDF)。

3. USB描述符配置,在设备固件中配置USB描述符,以确保设
备能够正确地与Windows系统进行通信。

描述符包括设备描述符、
配置描述符、接口描述符等。

4. 测试和调试,在开发过程中需要进行大量的测试和调试工作,确保设备和驱动程序的稳定性和兼容性。

可以使用微软提供的HLK (Windows Hardware Lab Kit) 进行测试。

5. 证书签名,最终的WinUSB驱动程序需要通过微软的数字签名认证,以确保安全性和兼容性。

这需要申请和获取相应的数字证书。

需要注意的是,开发WinUSB设备需要一定的专业知识和经验,包括硬件设计、驱动程序开发、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的描述符及各种描述符之间的依赖关系描述符都有自己独立的编号,如下:#define DEVICE_DESCRIPTOR 0x01 //设备描述符#define CONFIGURATION_DESCRIPTOR 0x02 //设置描述符#define STRING_DESCRIPTOR 0x03 //字符串描述符#define INTERFACE_DESCRIPTOR 0x04 //接口描述符#define ENDPOINT_DESCRIPTOR 0x05 //端点描述符下面分别周详介绍一下各描述符。

1.设备描述符//定义标准的设备描述符结构typedef struct _DEVICE_DCESCRIPTOR_STRUCT{BYTE blength; //设备描述符的字节数大小BYTE bDescriptorType; //设备描述符类型编号WORD bcdUSB; //USB版本号BYTE bDeviceClass; //USB分配的设备类代码BYTE bDeviceSubClass; //USB分配的子类代码BYTE bDeviceProtocol; //USB分配的设备协议代码BYTE bMaxPacketSize0; //端点0的最大包大小WORD idVendor; //厂商编号WORD idProduct; //产品编号WORD bcdDevice; //设备出厂编号BYTE iManufacturer; //设备厂商字符串的索引BYTE iProduct; //描述产品字符串的索引BYTE iSerialNumber; //描述设备序列号字符串的索引BYTE bNumConfigurations; //可能的设置数量}DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;//实际的设备描述符示例code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //设备描述符{sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小,这里是18字节DEVICE_DESCRIPTOR, //设备描述符类型编号,设备描述符是010x1001, //USB版本号,这里是USB01.10,即USB1.1。

USB描述符的分类与介绍

USB描述符的分类与介绍

USBf苗述符的分类与介绍USB的符述符分为几类?有人可能会答:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符等。

但这里说的不是这样的。

上面的几类描述符属于USB标准描述符。

另外还有HID描述符和Hub描述符。

所以分类是这样的:1. 标准描述符1)设备描述符2)配置描述符3)字符串描述符4)接口描述符5)端点描述符6)设备限定描述符7)其他速率配置描述符2. HID描述符3. Hub描述符1标准描述符标准描述符是指一组设备描述符,包括设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符和其他速率配置描述符。

这七种描述符具有类似的格式,比如说它们的第一个字段都是bLength,第二个字段都是bDescriptorType。

七种描述符在使用时以bDescriptorType 字段来区分。

描述符类型与对应的bDescriptorType字段值对应关系为:1.1设备描述符设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。

在主机对USB设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。

设备描述符由14个字段组成,总长度18字节:这些字段都有一个小写字母表示的前缀,它们所表示的意思如下:b表一个字节,=8bits ;w 表一个字,=16bits ;bm表按位寻址;bcd用BC码表示;i表索引值I _ i d 表标识码各字段含义:bLength :表示描述符的长度,对于设备描述符来说,其值为18,即0x12。

bDescriptorType :描述符类型,对应表1中的值,设备描述符为0x01bcdUSB该设备遵循的US版本号,以BCD?表示,USB1.1为0x0101, USB2.0为0 x0200。

bDeviceClass :该设备所属的标准设备类,US协议中对常见的设备进行了分类。

该字段值为0x01〜0xFE寸,表示是US协议中已定义的设备类,常用的HID设备类编号为0x03,其它设备类编号参:bDeviceProtocol :用于表示USBS备类所采用的设备类协议,其值和bDeviceCl ass和bDeviceSubClass有关。

USB的描述符详解总结

USB的描述符详解总结

USB的描述符详解总结U S B的描述符详解总结USB的描述符与命令请求详解⼀、描述符1.什么是描述符所谓描述符,就是⽤于描述设备特性的具有特定格式排列的⼀种数据组织结构。

2.描述符的作⽤描述符的作⽤在于设备向主机汇报⾃⼰的信息、特征,主机根据这些信息从⽽加载相应的驱动程序。

3.描述符的分类描述符分为三⼤类:标准描述符、设备类描述符、⼚商描述符。

除字符串描述符可选外,任何设备都必须包含剩下的⼏种标准描述符。

在中规定了5种标准的描述符:设备描述符配置描述符接⼝描述符端点描述符字符串描述符规定的设备类描述符有:集线器类描述符、⼈机接⼝类描述符。

下表是三种描述符的类型值:表描述符的类型值类型描述符描述符值标准描述符设备描述符(DeviceDescriptor) 0x01 配置描述符(ConfigurationDescriptor)0x02 字符串描述符(StringDescriptor)0x03 接⼝描述符(InterfaceDescriptor)0x04 端点描述符(EndPointDescriptor)0x05 (DeviceQualifierdescriptor) 0x06 (BOSdescriptor) 0x0F (DeviceCapabilitydescriptor) 0x10Document number:NOCG-YUNOO-BUYTT-UU986-1986UT4.设备类DeviceClass在描述符中,只有设备描述符和接⼝描述符中会有类别之分,即只有设备和接⼝会分类使⽤,不过有些类别的使⽤只需经过设备或接⼝的区分就可彻底清楚明⽩,这说明在设备类别和接⼝类别的定义上会有共同的类别名称。

⽽有些类别则是设备或接⼝独享的,下表是与使⽤设备相关的类别划分交叉或共【说明:】在设备或接⼝分类上均可彻底分清使⽤的(Usage=Both),即在任⼀处描述符中定义即可的分清楚使⽤的类(Usage=Both)的基本类有:02h-------------通信及CDC控制类;DCh------------诊断设备类;EFh-------------混杂设备类;FFh-------------⼚商定义的设备类。

USB摄像头驱动之分析描述符

USB摄像头驱动之分析描述符

USB摄像头驱动之分析描述符设备描述符是USB设备上的一个数据结构,用于提供有关设备的基本信息。

它包含了设备的各种参数和功能,如设备的厂商ID、产品ID、设备版本等。

设备描述符的结构由USB规范定义,它有几个重要的字段,我们将逐一进行分析。

1. bLength:这是一个1字节的字段,表示设备描述符的长度,包括该字段本身。

2. bDescriptorType:这也是一个1字节的字段,表示描述符的类型,对于设备描述符,它的值是0x013. bcdUSB:这是一个2字节的字段,表示USB规范的版本号,例如0x0200表示USB 2.0。

4. bDeviceClass:这是一个1字节的字段,表示设备的类别。

对于摄像头,通常它的值是0xEF,表示视频类设备。

5. bDeviceSubClass:这是一个1字节的字段,表示设备的子类别。

对于摄像头,通常它的值是0x02,表示视频流。

6. bDeviceProtocol:这是一个1字节的字段,表示设备的协议。

对于摄像头,通常它的值是0x01,表示基于流传输模式的视频设备。

7. bMaxPacketSize0:这是一个1字节的字段,表示设备的0号端点的最大数据包大小。

对于USB 2.0设备,通常它的值是64字节。

8. idVendor和idProduct:这是一个2字节的字段,分别表示设备的厂商ID和产品ID。

每个设备都有唯一的ID,用于在系统中进行设备的识别和驱动的匹配。

9. bNumConfigurations:这是一个1字节的字段,表示设备支持的配置数目。

一个设备可以有多个配置,每个配置定义了设备的特定功能和参数。

设备描述符作为USB设备的基本信息,为操作系统提供了对设备的识别和初始化。

操作系统在发现新设备时,首先读取设备描述符并解析其中的字段,然后根据设备的类别和ID匹配相应的驱动程序。

驱动程序通过解析设备描述符中的其它字段,如配置描述符和接口描述符,来了解设备的详细功能和传输模式,并进行相应的初始化和控制。

USB报告描述符详细解析

USB报告描述符详细解析

USB报告描述符详细解析
USB报告描述符是对USB设备上的功能指定的一系列键值对,它们描
述了USB设备提供的服务,以及它如何使用USB总线。

USB报告描述符可
以让计算机可以正确地识别USB设备,并且可以正确地处理它们发送的数据。

报告描述符由一个全局报告描述符和一个或多个功能报告描述符组成。

全局报告描述符描述了整个USB设备,包括设备的厂商ID,产品ID,序
列号,版本号等全局信息。

一个功能报告描述符描述一些功能,或者一组
相关功能。

功能报告描述符向计算机提供有关每个功能的信息,包括功能
类型,最大报告大小,功能字节级访问信息,功能特征集,报文信息等。

USB设备可以在接口上提供多种功能,因此,可以有一个或多个功能
报告,每个功能报告描述符都将描述特定的功能。

例如,触摸板USB设备
可能提供多个功能报告描述符,每个描述符描述一个功能,如触摸屏,键盘,鼠标,笔,滚轮等。

USB报告描述符需要遵守USB协议,确保报告描述符中包含的信息传
输正确。

USB报告描述符除了包括数据传输信息外,还会描述USB设备的
更多信息,如设备功能,设备参数,配置参数,接口位置,电源参数,安
全功能等。

05-USB驱动程序开发

05-USB驱动程序开发

2、USB设备类型 USB设备类型
八、USB设备列举 USB设备列举
在USB规范中有一个非常重要的“动作” USB规范中有一个非常重要的 动作” 规范中有一个非常重要的“ 过程” 这个动作将会让PC PC机知道何 或“过程”。这个动作将会让PC机知道何 USB设备刚接上以及其所含的各种信息 设备刚接上以及其所含的各种信息。 种USB设备刚接上以及其所含的各种信息。 这样,PC机就可以与这个USB设备开始进行 机就可以与这个USB 这样,PC机就可以与这个USB设备开始进行 数据传输的工作了。 数据传输的工作了。这个动作称之为设备 列举(enumeration) (enumeration)。 列举(enumeration)。
7 . USB2.0 的 High-speed 模式支持音频和视频设备 , 可 USB2 High-speed模式支持音频和视频设备 模式支持音频和视频设备, 以保证其固定带宽; 以保证其固定带宽; 8 . 为了适应各种不同类型外围设备的要求 USB 提供了 为了适应各种不同类型外围设备的要求USB 四种不同的数据传输类型:控制传输,Bulk数据传输 数据传输, 四种不同的数据传输类型:控制传输, Bulk数据传输, 中断数据传输,同步数据传输。 中断数据传输, 同步数据传输。 同步数据传输可为音 频和视频等实时设备的实时数据传输提供固定带宽。 频和视频等实时设备的实时数据传输提供固定带宽。 的端口具有很灵活的扩展性。 一个USB 9 . USB 的端口具有很灵活的扩展性 。 一个 USB 端口串 接上一个USB 就可以扩展为多个USB 端口。 USB端口 接上一个 USB Hub 就可以扩展为多个 USB 端口 。 规范 中说,USB可以扩展到127个外设端口 可以扩展到127个外设端口。 中说,USB可以扩展到127个外设端口。

USB的描述符详解总结

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从设备驱动实现流程1.硬件初始化:首先需要对USB从设备的硬件进行初始化。

这包括配置USB接口和相关寄存器,分配内存用于数据传输等。

2. 设备描述符定义:USB设备需要提供设备描述符,以描述其功能、厂商信息等。

设备描述符是一个结构体,包含各种属性,如设备的VID (Vendor Id)、PID(Product Id)、设备类别等。

3.端点描述符定义:端点描述符用于描述设备的输入输出端点。

从设备可以有多个端点,包括控制端点、批量端点、中断端点和等时端点。

每个端点都有一个端点地址、传输方向、传输类型、包大小等属性。

B设备注册和初始化:驱动程序需要注册USB设备,并进行初始化。

这包括获取USB总线的指针,通过指针与USB总线进行通信,并与USB总线驱动进行通信。

5.数据传输:驱动程序需要实现数据的传输功能,包括收发数据。

从设备收到主机的请求后,驱动程序需要根据请求进行相应的操作,如读取设备信息、发送数据等。

6.中断处理:从设备在一些情况下可能会触发中断,如数据接收完成、传输超时等。

驱动程序需要实现中断处理函数来处理这些中断事件,以确保设备的正常工作。

7.错误处理:在驱动程序的实现过程中,可能会遇到一些错误,如传输超时、报文解析错误等。

驱动程序需要通过错误处理函数来对这些错误进行处理,如重试传输、重新配置设备等。

8.资源释放:当USB设备不再使用时,驱动程序需要释放相应的资源,如内存、中断处理函数等。

9.调试和测试:在驱动程序的实现过程中,可以使用调试工具对代码进行调试和测试,以确保程序的正确性和可靠性。

总结来说,USB从设备驱动的实现流程包括硬件初始化、设备和端点描述符定义、设备注册和初始化、数据传输、中断处理、错误处理、资源释放以及调试和测试等步骤。

通过这些步骤,可以使USB从设备与主机进行正常的通信和数据传输。

一文入门usb设备的驱动编写方法

一文入门usb设备的驱动编写方法

一文入门usb设备的驱动编写方法USB设备驱动编写入门USB(通用串行总线)是一种广泛使用的协议,用于在计算机和外围设备之间建立通信渠道。

编写USB设备驱动程序需要对USB规范以及操作系统提供的底层机制有深入的理解。

1. 理解USB规范USB规范定义了设备之间的通信协议、设备类型和描述符格式等方面。

理解规范对于编写符合标准且能够与其他USB设备交互的驱动程序至关重要。

2. 选择操作系统平台不同操作系统对USB设备驱动程序的要求有所不同。

为Windows环境编写驱动程序与为Linux或macOS编写驱动程序具有不同的方法。

了解目标操作系统的特定要求至关重要。

3. 设置开发环境设置开发环境包括安装必要的工具和库。

这可能需要安装USB 开发工具包或编译器。

阅读操作系统的文档以设置正确的环境。

4. 创建USB描述符USB描述符是描述设备功能和配置的数据结构。

驱动程序需要创建这些描述符才能注册设备并向操作系统公开其功能。

5. 实现USB端点USB端点是设备与计算机之间的数据传输通道。

驱动程序需要实现端点处理程序来处理数据传输和控制请求。

6. 处理USB事件驱动程序需要处理各种USB事件,例如设备插入、拔出和配置更改。

实现事件处理程序来响应这些事件并更新设备状态。

7. 使用USB堆栈操作系统提供USB堆栈,为驱动程序提供与底层USB硬件接口的抽象层。

了解USB堆栈的API和功能对于与硬件交互至关重要。

8. 调试驱动程序调试USB设备驱动程序需要专门的工具和技术。

使用调试器、日志记录和分析工具来识别并解决问题。

9. 测试驱动程序在不同环境和条件下全面测试驱动程序至关重要。

执行功能测试、兼容性测试和压力测试以验证驱动程序的可靠性和稳定性。

10. 提交并分发驱动程序开发完成后,需要向操作系统供应商提交驱动程序以进行认证和分发。

遵守供应商的准则并提供必要的文档。

USB描述符的分类与介绍讲解

USB描述符的分类与介绍讲解

USB描述符的分类详解所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。

描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。

描述符分为三大类:标准描述符、设备类描述符、厂商描述符。

标准描述符:除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符设备类描述符可划分为:集线器类描述符、人机接口类描述符每个USB设备都有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。

由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。

在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。

其中可能还会有获取设备序列号,厂商字符串,产品字符串等1 标准描述符标准描述符是指一组描述符,包括设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符和其他速率配置描述符。

这七种描述符具有类似的格式,比如说它们的第一个字段都是bLength,第二个字段都是bDescriptorType。

七种描述符在使用时以第二字段(bDescriptorType)来区分,描述符类型与对应的bDescriptorType字段值对应关系为:1.1 设备描述符设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。

在主机对USB设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。

usb描述符举例

usb描述符举例

1 设备描述符bLength : 描述符长度,固定为0x12。

bDescriptorType : 设备描述符类型,固定为0x01。

bcdUSB : USB 规范发布号。

表示了本设备能适用于那种协议,如2.0=0200bDeviceClass : 类型代码。

bDeviceSubClass : 子类型代码。

bDeviceProtocol : 协议代码。

bMaxPacketSize0 : 端点0最大分组大小。

idVendor : 供应商ID。

idProduct : 产品ID(由厂商分配)。

bcdDevice : 设备出产编码,由厂家自行设置。

iManufacturer : 厂商描述符字符串索引.索引到对应的字符串描述符。

iProduct : :产品描述符字符串索引。

iSerialNumber : 设备序列号字符串索引。

bNumConfigurations : 可能的配置数。

2 配置描述符bLength : 描述符长度,固定为0x09。

bDescriptorType : 配置描述符类型,固定为0x02。

wTotalLength : 返回整个数据的长度,指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。

bNumInterfaces : 配置所支持的接口数,指该配置配备的接口数量,也表示该配置下接口描述符数量。

bConfigurationValue : 作为Set Configuration的一个参数选择配置值。

iConfiguration : 用于描述该配置字符串描述符的索引。

bmAttributes : 供电模式选择。

Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.MaxPower : 总线供电的USB设备的最大消耗电流,以2mA为单位。

3 接口描述符bLength : 描述符长度,固定为0x09。

bDescriptorType : 接口描述符类型,固定为0x04。

bInterfaceNumber: 该接口的编号。

usb标准描述符详解

usb标准描述符详解

一、基本概念1、USB协议本身很复杂,但方便在提供了统一的接口方式,使得驱动程序在使用设备的时候,工作简化到了类似操作串行接口。

2、USB设备可以看作提供了多个串口的设备,依据USB的规范,我们将每个串口称作端点(Endpoint),要和这个端点通信,我们就要打开到这个端点的连接,这个连接就是管道(Pipe)。

3、打开端点之后,就可以像串口一样进行数据传输了。

USB有4种不同类型的传输方式:控制传输(Control Transfer),批量传输(Bulk Transfer),中断传输(Interrupt Transfer)和实时传输(IsochTransfer)。

4、由于一个设备可能要适应多种情况,端点的设置会有多套,以备使用。

端点设置称为接口(Interface)。

USB设备展现给我们能够找到的东西就是这些Interface,我们选择要用的Interface,就可以找到Endpoint,再打开Endpoint,就可以传输数据了。

所以,在驱动程序开始的时候,需要记录下这些Interface。

5、例如:OV511+的端点0是控制端点,用来设置参数以及起停设备;端点1是实时传输端点,用来传输视频。

端点1有8套不同的设置,主要区别就在于一次传输的数据帧的大小,所以在USBDeviceAttach的时候,要记录这些设置到驱动程序中,后面才能够选用。

二、描述符介绍标准的USB设备有5种USB描述符:设备描述符,配置描述符,字符串描述符,接口描述符,端点描述符。

下面详解:1、设备描述符:一个设备只有一个设备描述符typedef struct _USB_DEVICE_DESCRIPTOR_{BYTE bLength,BYTE bDescriptorType,WORD bcdUSB,BYTE bDeviceClass,BTYE bDeviceSubClass,BYTE bDeviceProtol,BYTE bMaxPacketSize0,WORD idVenderI,WORD idProduct,WORD bcdDevice,BYTE iManufacturer,BYTE iProduct,BYTE iSerialNumber,BYTE iNumConfiguations}USB_DEVICE_DESCRIPTOR;bLength : 描述符大小.固定为0x12.bDescriptorType : 设备描述符类型.固定为0x01.bcdUSB : USB 规范发布号.表示了本设备能适用于那种协议,如2.0=0200,1.1=0110等.bDeviceClass : 类型代码(由USB指定)。

USB描述符

USB描述符

USB描述符主机是通过标准的USB请求命令中的GET_DESCRIPTOR获得一个USB设备属性的描述符的。

关于Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性。

它的作用就是通过响应主机的请求命令操作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息,并为设备分配资源后,设备才能真正开始工作。

标准的描述符有5种,USB为这些描述符定义了编号:1——设备描述符2——配置描述符3——字符描述符4——接口描述符5——端点描述符一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。

这些描述符是用一定的字段构成的,分别如下说明:1.设备描述符struct_DEVICE_DEscriptOR_STRUCT{BYTE bLength;BYTE bDescriptorType;WORD bcdUSB;BYTE bDeviceClass;BYTE bDeviceSubClass;BYTE bDeviceProtocl;BYTE bMaxPacketSize0;WORD idVendor;WORD idProduct;WORD bcdDevice;BYTE iManufacturer;BYTE iProduct;BYTE iSeialNumber;BYTE bNumConfiguration;}2.配置描述符struct_CONFIGURATION_DEscriptOR_STRUCT {BYTE bLength;BYTE bDescriptorType;WORD wTotalLength;BYTE bNumlnterface;BYTE bConfigurationValue;BYTE iConfiguration:BYTE bmAttribute;BYTE MaxPower;}3.字符描述符struct_STRING_DEscriptOR_STRUCT{BYTE bLength;BYTE bDescriptorType;BYTE SomeDes criptor[36];}4.接口描述符struct_INTERFACE_DEscriptOR_STRUCT{BYTE bLength;BYTE bDescriptorType;BYTE bInterfaceNumber;BYTE bAlternateSetting;BYTE bNumEndpoints:BYTE bInterfaceSubClass;BYTE bInterfaceProtocol;BYTE iInterface;}5.端点描述符struct_ENDPOINT_DescriptOR_STRUCT {BYTE bLength;BYTE bDescriptorType;BYTE bEndpointAddress;BYTE bmAttribute;WORD wMaxPacketSize;BYTE bInterval;}。

USB描述符的分类与介绍讲解

USB描述符的分类与介绍讲解

USB描述符的分类与介绍讲解
USB描述符是用于计算机与外围设备之间进行沟通的一种机制,它的
作用是将计算机的设备,例如USB鼠标、USB打印机等,定义为外围设备,以便于计算机可以理解外围设备的特性,并能够与它们进行交互。

计算机
访问设备的方式就是通过USB描述符,因此USB描述符对于实现USB设备
的连接外部设备至关重要。

此外,USB描述符中还定义了不同设备的特性,以便于计算机可以更
好地识别外围设备,从而便于系统更好地工作。

USB描述符可以分为三类:第一类是基本描述符,主要用于描述USB设备的基本信息,如设备的
类别、版本号等,其主要目的是支持系统驱动程序的正确加载,这样就可
以使外接设备与系统进行沟通。

第二类是特性描述符,其主要用于对USB设备的特性进行描述,例如
电压、电流、数据传输速率等,这样就可以保证USB设备在使用时能得到
最佳的性能。

第三类是配置描述符,它是用于描述USB设备配置的,通常用于说明USB设备总线的类型、端口数量等信息,以便于系统能够正确地识别该设
备并能让外围设备安全地连接到外部设备。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

USB驱动开发——USB描述符观察USB设备1.usbview图1 通用串行总线控制器usbview 在C:\WINDDK\2600\src\wdm\usb\usbview\objchk\i386文件夹下,如图2所示的usbview.exe文件。

图2 usbview目录图3 usbview观察USB外接设备如图3所示,可以看出端口8(port8),以及图形右边关于插入U盘的描述信息。

2.bus hound 使用指南bus hound 5.0使用方法如下:1.请下载安装bus hound 5.0全功能版:/down/view.asp?id=282.安装完毕后请一定要重启,否则软件不能工作;3.进行USB监控的主要步骤如下:(1)启动软件,将USB设备插入USB口;(2)在DEVICE内选择设备,例如我的设备是一个U盘,则设备为USB DEVICE,选中该设备,可以在下面的PROPERTIES看到设备的总线类型,设备的电源以及各个端点的功能,在该设备下面还有两个分支:USB AUDIO DEVICE 和 "USB人体学输入设备"(这就是本设备占用的两个接口),一样在PROPERTIES里面可以看到他们的类代码为0x01和0x03。

(3)在看完基本信息后,将上述的某个接口,或者全部打勾。

(4)切换到"SETTING"选项卡,将MAX PHASE设置为512,这样你就可以看到完全的DESCRIPTOR 和其他的数据了。

(5)在"PHASE TO CAPTURE"里面的几个和USB相关的选项如下:CDB:命令描述符块;CTL:USB控制传输;DI/D数据输入/输出;LEN:数据长度;INSOC:同步传输;RSET:总线复位;URB:USB请求块;USTS:USB状态。

查看USB数据传输就把它们都打勾就行了;(6)在"Coloumn to display"里面,把里面的全部打勾。

注意,这样要把窗体最大化才可以看见全部数据。

(7)在"CAPTURE"选项卡里面可以看捕捉的数据了,在文本框输入文字,再点旁边的箭头,可以查询。

按STOP,再按START可以清屏。

(8)举个例子,接上设备,在文本框输入GET DESCRIPTOR(大小写无所谓),点箭头,可以找到你的DESCRIPTOR,但是值得注意的是这个DESCRIPTOR主要是CONFIG,如果是设备描述符会有专门的说明GET DEVICE DESCRIPTOR;这个软件好像不会捕捉STRING DESCRIPTOR。

设备返回的信息在DI里面。

图4 bus hound界面图5 bus hound捕获图6 bus hound界总线命令设置USB的描述符及各种描述符之间的依赖关系USB是个通用的总线,端口都是统一的。

但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。

USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。

具体内容参见USB2.0协议第九章《USB设备架构》。

关于报告描述符,请看:《USB HID报告及报告描述符简介 》/93/198.aspx。

一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。

由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。

在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。

其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

每种描述符都有自己独立的编号,如下:#define DEVICE_DESCRIPTOR 0x01 //设备描述符#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符#define STRING_DESCRIPTOR 0x03 //字符串描述符#define INTERFACE_DESCRIPTOR 0x04 //接口描述符#define ENDPOINT_DESCRIPTOR 0x05 //端点描述符下面分别详细介绍一下各描述符。

具体的内容可以在DDK下面找到,具体路径如下:C:\WINDDK\2600\inc\wxp。

当然不同的安装环境路径就不一样,笔者是按照默认安装路径安装的,因此在C盘下面。

具体的安装请参考《Windows驱动开发环境配置》介绍。

1.设备描述符//定义标准的设备描述符结构。

typedef struct _DEVICE_DCESCRIPTOR_STRUCT{BYTE blength; //设备描述符的字节数大小BYTE bDescriptorType; //设备描述符类型编号WORD bcdUSB; //USB版本号BYTE bDeviceClass; //USB分配的设备类代码BYTE bDeviceSubClass; //USB分配的子类代码BYTE bDeviceProtocol; //USB分配的设备协议代码BYTE bMaxPacketSize0; //端点0的最大包大小WORD idVendor; //厂商编号WORD idProduct; //产品编号WORD bcdDevice; //设备出厂编号BYTE iManufacturer; //设备厂商字符串的索引BYTE iProduct; //描述产品字符串的索引BYTE iSerialNumber; //描述设备序列号字符串的索引BYTE bNumConfigurations; //可能的配置数量}DEVICE_DESCRIPTOR_STRUCT, * pDEVICE_DESCRIPTOR_STRUCT;//实际的设备描述符示例code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //设备描述符{sizeof(DEVICE_DESCRIPTOR_STRUCT), //设备描述符的字节数大小,这里是18字节DEVICE_DESCRIPTOR, //设备描述符类型编号,设备描述符是010x1001, //USB版本号,这里是USB01.10,即USB1.1。

由于51是大端模式,所以高低字节交换0x00, //USB分配的设备类代码,0表示类型在接口描述符中定义0x00, //USB分配的子类代码,上面一项为0时,本项也要设置为00x00, //USB分配的设备协议代码,上面一项为0时,本项也要设置为00x10, //端点0的最大包大小,这里为16字节0x7104, //厂商编号,这个是需要跟USB组织申请的ID号,表示厂商代号。

0xf0ff, //该产品的编号,跟厂商编号一起配合使用,让主机注册该设备并加载相应的驱动程序0x0100, //设备出厂编号0x01, //设备厂商字符串的索引,在获取字符串描述符时,使用该索引号来识别不同的字符串0x02, //描述产品字符串的索引,同上0x03, //描述设备序列号字符串的索引,同上0x01 //可能的配置数为1,即该设备只有一个配置};2.配置描述符//定义标准的配置描述符结构typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT{BYTE bLength; //配置描述符的字节数大小BYTE bDescriptorType; //配置描述符类型编号WORD wTotalLength; //此配置返回的所有数据大小BYTE bNumInterfaces; //此配置所支持的接口数量BYTE bConfigurationValue; //Set_Configuration命令所需要的参数值BYTE iConfiguration; //描述该配置的字符串的索引值BYTE bmAttributes; //供电模式的选择BYTE MaxPower; //设备从总线提取的最大电流}CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;3.接口描述符//定义标准的接口描述符结构typedef struct _INTERFACE_DESCRIPTOR_STRUCT{BYTE bLength; //接口描述符的字节数大小BYTE bDescriptorType; //接口描述符的类型编号BYTE bInterfaceNumber; //该接口的编号BYTE bAlternateSetting; //备用的接口描述符编号BYTE bNumEndpoints; //该接口使用的端点数,不包括端点0 BYTE bInterfaceClass; //接口类型BYTE bInterfaceSubClass; //接口子类型BYTE bInterfaceProtocol; //接口遵循的协议BYTE iInterface; //描述该接口的字符串索引值}INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;4.端点描述符//定义标准的端点描述符结构typedef struct _ENDPOINT_DESCRIPTOR_STRUCT{BYTE bLegth; //端点描述符字节数大小BYTE bDescriptorType; //端点描述符类型编号BYTE bEndpointAddress; //端点地址及输入输出属性BYTE bmAttributes; //端点的传输类型属性WORD wMaxPacketSize; //端点收、发的最大包大小BYTE bInterval; //主机查询端点的时间间隔}ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;下面是一个配置描述符集合的定义:typedef struct _CON_INT_ENDP_DESCRIPTOR_STRUCT{CONFIGURATION_DESCRIPTOR_STRUCT configuration_descriptor;INTERFACE_DESCRIPTOR_STRUCT interface_descritor;ENDPOINT_DESCRIPTOR_STRUCT endpoint_descriptor[ENDPOINT_NUMBER];}CON_INT_ENDP_DESCRIPTOR_STRUCT;配置描述符集合的示例code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= //配置描述符集合 {//configuration_descriptor //配置描述符{sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配置描述符的字节数大小,这里为9 CONFIGURATION_DESCRIPTOR, //配置描述符类型编号,配置描述符为2 (sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)*256+(sizeof(CONFIGURATION_DESCRIPTOR_STRUCT)+sizeof(INTERFACE_DESCRIPTOR_STRUCT)+sizeof(ENDPOINT_DESCRIPTOR_STRUCT)*ENDPOINT_NUMBER)/256, //配置描述符集合的总大小0x01, //只包含一个接口0x01, //该配置的编号0x00, //iConfiguration字段0x80, //采用总线供电,不支持远程唤醒0xC8 //从总线获取最大电流400mA},//interface_descritor //接口描述符{sizeof(INTERFACE_DESCRIPTOR_STRUCT), //接口描述符的字节数大小,这里为9 INTERFACE_DESCRIPTOR, //接口描述符类型编号,接口描述符为3 0x00, //接口编号为40x00, //该接口描述符的编号为0ENDPOINT_NUMBER, //非0端点数量为2,只使用端点主端点输入和输出 0x08, //定义为USB大容量存储设备0x06, //使用的子类,为简化块命令0x50, //使用的协议,这里使用单批量传输协议 0x00 //接口描述符字符串索引,为0,表示没有字符串 },//endpoint_descriptor[]{{ //主端点输入描述sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小,这里为7 ENDPOINT_DESCRIPTOR, //端点描述符类型编号,端点描述符为5 MAIN_POINT_IN, //端点号,主输入端点ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输0x4000, //该端点支持的最大包尺寸,64字节0x00 //中断扫描时间,对批量传输无效},{ //主端点输出描述sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //端点描述符的字节数大小,这里为7 ENDPOINT_DESCRIPTOR, //端点描述符类型编号,端点描述符为5 MAIN_POINT_OUT, //端点号,主输出端点ENDPOINT_TYPE_BULK, //使用的传输类型,批量传输0x4000, //该端点支持的最大包尺寸,64字节0x00 //中断扫描时间,对批量传输无效}}};其中关于端点的类型定义如下://定义的端点类型#define ENDPOINT_TYPE_CONTROL 0x00 //控制传输#define ENDPOINT_TYPE_ISOCHRONOUS 0x01 //同步传输#define ENDPOINT_TYPE_BULK 0x02 //批量传输#define ENDPOINT_TYPE_INTERRUPT 0x03 //中断传输端点号的定义如下:#define MAIN_POINT_OUT 0x02 //2号输出端点#define MAIN_POINT_IN 0x82 //2号输入端点。

相关文档
最新文档