USB的描述符详解总结
- 格式:doc
- 大小:212.50 KB
- 文档页数:10
USB的描述符与命令请求详解一、描述符1.什么是描述符所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。
2.描述符的作用描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。
3.描述符的分类描述符分为三大类:标准描述符、设备类描述符、厂商描述符。
除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。
在USB1.0中规定了5种标准的描述符:设备描述符配置描述符接口描述符端点描述符字符串描述符规定的设备类描述符有:集线器类描述符、人机接口类描述符。
下表是三种描述符的类型值:4.使用的几种类设备类DeviceClass下表是设备类值的含义。
接口类InterfaceClass下表是接口类值的含义。
类的交叉与独享在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。
而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义)【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有:02h ------------- 通信及CDC控制类;DCh ------------ 诊断设备类;EFh ------------- 混杂设备类;FFh ------------- 厂商定义的设备类。
5.标准描述符设备描述符【说明1:】当设备类型bDeviceClass = 0时,说明类型将由接口描述符中定义的为准。
【说明2:】从设备描述符表格中可知,有3个索引值:厂商信息索引、产品信息索引、设备序列号索引,这意味着,将有3个字符串描述符为其准备。
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。
报告是一个数据包,里面包含的是所要传送的数据。
输入报告是通过中断输入端点输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。
它通过控制输入端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求是发送到接口的,而不是到设备。
一个报告描述符可以描述多个报告,不同的报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。
当报告描述符中没有规定报告ID时,报告中就没有ID字段,开始就是数据。
更详细的说明请参看USB HID协议,该协议可从下载。
USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以到下载,为了方便大家,我顺便上传了一份。
/Upload/Blog/2007/4/2/af7c3443-ad61-4465-ADC7-a74d28bbc322.zip下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告描述符和报告。
code char KeyBoardReportDescriptor[63] = {//表示用途页为通用桌面设备0x05, 0x01, // USAGE_PAGE (Generic Desktop)//表示用途为键盘0x09, 0x06, // USAGE (Keyboard)//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION 0xa1, 0x01, // COLLECTION (Application)//表示用途页为按键0x05, 0x07, // USAGE_PAGE (Keyboard)//用途最小值,这里为左ctrl键0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl)//用途最大值,这里为右GUI键,即window键0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI)//逻辑最小值为00x15, 0x00, // LOGICAL_MINIMUM (0)//逻辑最大值为10x25, 0x01, // LOGICAL_MAXIMUM (1)//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为10x75, 0x01, // REPORT_SIZE (1)//报告的个数为8,即总共有8个bits0x95, 0x08, // REPORT_COUNT (8)//输入用,变量,值,绝对值。
usb描述符含义USB描述符是一种定义了USB设备能力和特征的数据结构。
它通过描述设备的不同方面,例如设备的配置、接口和端点规范,为计算机系统提供了与USB设备进行通信的方法。
每个USB设备都包含一个或多个描述符,这些描述符以二进制形式存储在设备的固件中。
USB描述符的含义可以从以下几个方面来解释。
首先,设备描述符是USB设备的一个重要组成部分。
它包含了设备的厂商和产品ID、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设备描述符完全解析//======================================================= =====================// 文件名: USBDESC.C// 用途: USB描述符// 作者: shenfei5// 时间: 2007.2.3// 版本: V1.10//======================================================= =====================#include <RTL.h>#include "usb.h" // USB模块#include "hid.h" // HID设备#include "usbcfg.h" // 配置USB#include "usbdesc.h" // USB描述符//// HID报文描述符//const U8 HID_ReportDescriptor[] = {HID_UsagePageVendor(0x00), // 报告页版本: 0X06 0X00 0XFFHID_Usage(0x01), // 用途页: 0X05 0X01// 如果是MOUSE,KEY,在这里应该有用法索引HID_Collection(HID_Application), // 用法集合开始: 0XA1 0X01HID_UsagePage(HID_USAGE_PAGE_BUTTON), // BUTTON用法页HID_UsageMin(1), // 用法最小值HID_UsageMax(3), // 用法最小值HID_LogicalMin(0), // 逻辑最小值HID_LogicalMax(1), // 逻辑最大值HID_ReportCount(3), // 报告计数(3)HID_ReportSize(1), // 报告页大小(1)HID_Input(HID_Data | HID_Variable | HID_Absolute), // 输入(2)HID_ReportCount(1), // 报告计数值HID_ReportSize(5), // 报告大小HID_Input(HID_Constant), // 输入1HID_UsagePage(HID_USAGE_PAGE_LED), // LED用法页HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR), // 用法页HID_LogicalMin(0), // 用法最小值HID_LogicalMax(1), // 用法最大值HID_ReportCount(8), // 报告计数值HID_ReportSize(1), // 报告大小(1)HID_Output(HID_Data | HID_Variable | HID_Absolute), // 输出(2)HID_EndCollection, // 报告结束};// HID报告描述符大小const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);//// USB 设备描述符//const U8 USB_DeviceDescriptor[] = {USB_DEVICE_DESC_SIZE, // bLength 描述符长度= 12HUSB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型= 1HWBVAL(0x0110), // 1.10 // bcdUSB 设备版本号= 你发行的版本的号0x00, // bDeviceClass 类型代码= 由USB指定0x00, // bDeviceSubClass 子类型代码= 由USB分配0x00, // bDeviceProtocol 协议代码= 由USB分配USB_MAX_PACKET0, // bMaxPacketSize0 端点0的容量= 64(只能是8,16,32,64) WBVAL(0x1977), // idVendor 供应商ID(同USB协会分配,我就自己分配一份)WBVAL(0X1006), // idProduct 产品ID(由厂商分配)WBVAL(0x0100), // 1.00 // bcdDevice ( 设备出厂编号)0x04, // iManufacturer ( 厂商描述字符串索引, 用来在字符串索引中查找字符串)0x20, // iProduct ( 产品描述字符串索引, 用来在字符串索引中查找字符串)0x42, // iSerialNumber ( 设备序列号描述字符串索引, 用来在字符串索引中查找字符串)0x01 // bNumConfigurations (配置字符串的个数)};//// USB 描述符集// 所有描述符(配置描述符, 接口描述符, 端点描述符, USB类描述符, 设备描述符//const U8 USB_ConfigDescriptor[] = {// 配置描述符USB_CONFIGUARTION_DESC_SIZE, // bLength 描述符长度= 9HUSB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型= 2H WBVAL( // wTotalLengthUSB_CONFIGUARTION_DESC_SIZE + // 返回描述符串集的长度, 配置描述字符长度USB_INTERFACE_DESC_SIZE + // 接口描述字符长度HID_DESC_SIZE + // HID描述字符长度USB_ENDPOINT_DESC_SIZE // 端点描述字符长度),0x01, // bNumInterfaces// 支持接口数0x01, // bConfigurationValue// 配置值0x00, // iConfiguration// 配置字符串描述索相// 0: 不使用// 如果使用,必须在字符串描述符中添加相应的字符串.USB_CONFIG_BUS_POWERED | // bmAttributes 设置的供电特性USB_CONFIG_REMOTE_WAKEUP, // 总线供电// 有唤醒功能USB_CONFIG_POWER_MA(100), // bMaxPower 设备从供电总线吸取的电流值//// 当前配置为100MA// 接口类描述符// 接口0 ,位置0 , HID类// Interface 0, Alternate Setting 0, HID ClassUSB_INTERFACE_DESC_SIZE, // bLength 描述符长度= 9HUSB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型= 4H0x00, // bInterfaceNumber ( 接口编号)0x00, // bAlternateSetting ( 可代替位置)0x01, // bNumEndpoints 使用端点(不含端点0)USB_DEVICE_CLASS_HUMAN_INTERFACE, // bInterfaceClass// USB 类// USB_DEVICE_CLASS_HUMAN_INTERFACE == 3// HID类HID_SUBCLASS_NONE, // bInterfaceSubClass// 子类,没有.HID_PROTOCOL_NONE, // bInterfaceProtocol// 协议代码0x5C, // iInterface// 字符串描述符索引,要使用该字符串必须在字符串描述符里添加相应的字符串// HID类描述符// HID_DESC_OFFSET = 0x0012// HID类描述符的偏移量HID_DESC_SIZE, // bLength 描述符长度=HID_HID_DESCRIPTOR_TYPE, // bDescriptorType HID描述符类型= 21HWBVAL(0x0100), // 1.00 // bcdHID HID版本号0x00, // bCountryCode 国家代码0x01, // bNumDescriptors 支持其它类描述符个数HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType 从属类描述类型= 报告描述符22H WBVAL(HID_REPORT_DESC_SIZE), // wDescriptorLength 从属类描述的长度// Endpoint, HID Interrupt In// HID 端点描述描,端点1输入USB_ENDPOINT_DESC_SIZE, // bLength 端点描述符长度USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType 端点描述符类型= 5HUSB_ENDPOINT_IN(1), // bEndpointAddress 逻辑端点号BIT.7 = DIR// BIT.0..3 端点号// 这个值是用来把逻辑端点号换成物理端点号USB_ENDPOINT_TYPE_INTERRUPT, // bmAttributes 端点属性= 中断WBVAL(0x0004), // wMaxPacketSize 端点容量10, // 10ms // bInterval// 传输间隔时间.只对中断端点有效// Terminator0 // bLength// 结果码.};//// USB 字符串描述符(可选)// 字符描述符结构:// {// 字符串描述符1 大小// 描述符类型= 字符串描述符(0X03)// 描述符内容.// ... ...// 字符串描述符n 1 大小// 描述符类型n = 字符串描述符(0X03)// 描述符内容n.// }//const U8 USB_StringDescriptor[] = {// 字符串索引: 0x00:// 字符串用途: 语言代码0x04, // 描述符长度bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)//WBVAL(0x0409), // 使用English 语言// 描述符内容wLANGIDWBVAL(0x0804), // 试一下中文的行不行,改了之后,在硬件属性里看不到,在客户端可以看到,不明原因. // 字符串索引: 0x04:// 字符串用途: 生产产商字符描述符0x1C, // 描述符长度bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)0xc1,0,0xd6,0,0xca,0,0xb7,0,0xe1,0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,// 字符串索引: 0x20// 字符串用途: 产品名称0x22, // 描述符长度bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 0xc1,0,0xd6,0,0xca,0,0xa4,0,0xb7,0,0xe1,0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,' ',0,'H',0,'I',0,'D',0,// 字符串索引: 0x42// 字符串用途: 产品系列号0x1A, // 描述符长度bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 'T',0,'E',0,'S',0,'T',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,// 字符串索引号0x5C// 接口Interface 0, 位置Alternate Setting 00x08, // 描述符长度bLengthUSB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符) 'H',0,'I',0,'D',0,}。
USB报告描述符详细解析
USB报告描述符是对USB设备上的功能指定的一系列键值对,它们描
述了USB设备提供的服务,以及它如何使用USB总线。
USB报告描述符可
以让计算机可以正确地识别USB设备,并且可以正确地处理它们发送的数据。
报告描述符由一个全局报告描述符和一个或多个功能报告描述符组成。
全局报告描述符描述了整个USB设备,包括设备的厂商ID,产品ID,序
列号,版本号等全局信息。
一个功能报告描述符描述一些功能,或者一组
相关功能。
功能报告描述符向计算机提供有关每个功能的信息,包括功能
类型,最大报告大小,功能字节级访问信息,功能特征集,报文信息等。
USB设备可以在接口上提供多种功能,因此,可以有一个或多个功能
报告,每个功能报告描述符都将描述特定的功能。
例如,触摸板USB设备
可能提供多个功能报告描述符,每个描述符描述一个功能,如触摸屏,键盘,鼠标,笔,滚轮等。
USB报告描述符需要遵守USB协议,确保报告描述符中包含的信息传
输正确。
USB报告描述符除了包括数据传输信息外,还会描述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是一种通用串行总线,全称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 Device Protocol)字段
USB设备协议(USB Device Protocol)涉及多个字段,以下是一些常见的USB设备协议字段:
1.头部(Header):用于描述USB设备协议的版本和长度。
2.设备描述符(Device Descriptor):提供了关于USB设备的基
本信息,如设备类别、供应商ID、产品ID、设备协议等。
3.配置描述符(Configuration Descriptor):描述USB设备的配
置信息,包括配置数量、最大功率等。
4.接口描述符(Interface Descriptor):描述USB设备提供的接
口信息,包括接口号、传输类型、端点数量等。
5.端点描述符(Endpoint Descriptor):描述USB设备的端点特
性,包括端点地址、传输类型、最大包大小等。
6.字符串描述符(String Descriptor):提供了USB设备的可读
描述信息,用于向用户展示设备的名称、厂商信息等。
7.设备请求(Device Request):用于主机与USB设备之间进行
通信和控制,包括设备请求类型、目标接口/端点等。
8.同步帧(Synchronization Frame):用于定义帧同步信号。
9.帧(Frame):USB设备数据传输的基本单位,包括帧开始标
记、数据包、帧号等。
10.错误检测(Error Detection):用于检测和纠正数据传输中的
错误,如CRC校验等。
USB设备协议的具体字段结构和定义会根据不同的USB设备类
型和协议版本有所差异,上述列举了一些常见的字段。
USB描述符的分类详解所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。
描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。
描述符分为三大类:标准描述符、设备类描述符、厂商描述符。
标准描述符:除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符:设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符设备类描述符可划分为:集线器类描述符、人机接口类描述符每个USB设备都有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。
由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。
在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。
其中可能还会有获取设备序列号,厂商字符串,产品字符串等1 标准描述符标准描述符是指一组描述符,包括设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符和其他速率配置描述符。
这七种描述符具有类似的格式,比如说它们的第一个字段都是bLength,第二个字段都是bDescriptorType。
七种描述符在使用时以第二字段(bDescriptorType)来区分,描述符类型与对应的bDescriptorType字段值对应关系为:1.1 设备描述符设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。
在主机对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 同步端点描述符1.引言1.1 概述在USB(Universal Serial Bus,通用串行总线)接口标准中,同步端点描述符扮演着重要的角色。
USB是一种用于电脑和外部设备之间传输数据的通信协议,为了实现设备之间的高效通信,同步端点描述符被用于定义和配置USB设备的同步端点。
同步端点描述符定义了USB设备的同步传输端点的配置和属性,可以理解为是对同步端点的详细描述。
同步传输端点是USB设备与主机之间进行同步传输的通道,用于实时传输数据,比如音频和视频数据。
同步端点描述符可以告知主机关于端点的特性,比如端点的方向(输入或输出)、传输类型(同步或异步)以及数据传输的带宽需求等。
为了更好地理解同步端点描述符的作用,可以将其类比为一个设备的规范说明书。
它提供了对端点的详细描述,使得主机能够正确地配置和管理设备。
同步端点描述符的配置可以影响USB设备的性能和兼容性,因此,对于开发USB设备的工程师和USB设备的使用者来说,了解和理解同步端点描述符是非常重要的。
本文将对USB同步端点描述符进行深入的探讨,包括其定义和作用,结构和字段的解析。
我们将详细介绍同步端点描述符中包含的字段和其对应的含义,以及如何根据实际需求配置同步端点描述符。
接下来的正文部分将首先介绍USB同步端点描述符的定义和作用,以便读者对其有一个整体的认知。
随后,我们将深入解析同步端点描述符的结构和各个字段的含义,帮助读者更好地理解和使用同步端点描述符。
最后,我们将总结USB同步端点描述符的重要性和应用场景,并展望其未来的发展前景。
通过本文的阅读,读者将能够全面了解USB同步端点描述符的概念、结构和应用,并且能够根据需要使用和配置同步端点描述符,从而实现高效、可靠的数据传输。
1.2 文章结构本文主要讨论USB同步端点描述符。
文章分为引言、正文和结论三个部分。
在引言部分,首先对USB同步端点描述符进行概述,介绍其作用和重要性。
其次,说明文章的整体结构,即引言、正文和结论的分布,以及各部分的内容概要。
USB描述符的分类与介绍讲解
USB描述符是用于计算机与外围设备之间进行沟通的一种机制,它的
作用是将计算机的设备,例如USB鼠标、USB打印机等,定义为外围设备,以便于计算机可以理解外围设备的特性,并能够与它们进行交互。
计算机
访问设备的方式就是通过USB描述符,因此USB描述符对于实现USB设备
的连接外部设备至关重要。
此外,USB描述符中还定义了不同设备的特性,以便于计算机可以更
好地识别外围设备,从而便于系统更好地工作。
USB描述符可以分为三类:第一类是基本描述符,主要用于描述USB设备的基本信息,如设备的
类别、版本号等,其主要目的是支持系统驱动程序的正确加载,这样就可
以使外接设备与系统进行沟通。
第二类是特性描述符,其主要用于对USB设备的特性进行描述,例如
电压、电流、数据传输速率等,这样就可以保证USB设备在使用时能得到
最佳的性能。
第三类是配置描述符,它是用于描述USB设备配置的,通常用于说明USB设备总线的类型、端口数量等信息,以便于系统能够正确地识别该设
备并能让外围设备安全地连接到外部设备。
usbdevice协议字段(最新版)目录B 设备协议字段概述B 设备协议字段的具体内容B 设备协议字段的作用和应用B 设备协议字段的发展趋势正文一、USB 设备协议字段概述USB(Universal Serial Bus,通用串行总线)是一种广泛应用于电脑及其他电子设备的外部总线标准。
USB 设备协议字段是指在 USB 通信过程中,用于传输数据和控制信息的字段。
了解 USB 设备协议字段有助于更好地掌握 USB 设备的通信原理和使用方法。
二、USB 设备协议字段的具体内容1.设备描述符(Device Descriptor):设备描述符包含了设备的基本信息,如设备类型、通信速率、支持的接口类型等。
设备描述符是 USB 设备和主机之间进行通信的关键数据结构。
2.配置描述符(Configuration Descriptor):配置描述符用于描述USB 设备的具体配置信息,如设备支持的功能、操作指令等。
配置描述符可以根据设备的实际需求进行配置。
3.接口描述符(Interface Descriptor):接口描述符用于描述 USB 设备支持的接口类型及其属性。
每个接口描述符对应一个 USB 接口,可以包含多个接口描述符。
4.端点描述符(Endpoint Descriptor):端点描述符用于描述 USB 设备支持的数据传输方式及端点属性。
每个端点描述符对应一个数据传输方向,可以是输入或输出。
5.类(Class):类是用于描述 USB 设备所属类型的一种分类方法。
每个 USB 设备都属于一个或多个类,如 CDC(Communications Device Class,通信设备类)、HID(Human Interface Device,人机接口设备类)等。
三、USB 设备协议字段的作用和应用USB 设备协议字段在 USB 设备与主机之间进行通信时起到关键作用。
通过这些字段,USB 设备可以向主机发送设备信息,主机也可以根据这些信息识别和配置 USB 设备。
USB鼠标键盘报告描述符介绍
USB鼠标键盘报告描述符是一种采用USB协议的报告描述设备,用来
描述鼠标和键盘报告的格式、报告长度以及如何在USB报告中识别鼠标和
键盘动作。
USB协议的报告描述符定义了鼠标和键盘报告格式、报告长度
以及如何在USB报告中识别操作。
报告描述符还必须描述每个设备的报告长度,比如鼠标报告长度是3
个字节,键盘报告长度是从6到127个字节。
这里的报告长度表示这个设
备发出的报告数据包的大小。
再有就是报告数据的格式,报告数据的格式是在报告描述符中定义的,它一般分为两种:普通报告和特殊报告。
普通报告是以设备状态为中心的,它以设备状态值的变化为基础对报告数据进行格式化,并向USB传输。
USB的描述符与命令请求详解一、描述符1.什么是描述符所谓描述符,就是用于描述设备特性的具有特定格式排列的一种数据组织结构。
2.描述符的作用描述符的作用在于设备向主机汇报自己的信息、特征,主机根据这些信息从而加载相应的驱动程序。
3.描述符的分类描述符分为三大类:标准描述符、设备类描述符、厂商描述符。
除字符串描述符可选外,任何设备都必须包含剩下的几种标准描述符。
在USB1.0中规定了5种标准的描述符:设备描述符配置描述符接口描述符端点描述符字符串描述符规定的设备类描述符有:集线器类描述符、人机接口类描述符。
下表是三种描述符的类型值:4.使用的几种类设备类DeviceClass下表是设备类值的含义。
接口类InterfaceClass下表是接口类值的含义。
类的交叉与独享在描述符中,只有设备描述符和接口描述符中会有类别之分,即只有设备和接口会分类使用,不过有些类别的使用只需经过设备或接口的区分就可彻底清楚明白,这说明在设备类别和接口类别的定义上会有共同的类别名称。
而有些类别则是设备或接口独享的,下表是与使用设备相关的类别划分交叉或共享情况:(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义)【说明:】在设备或接口分类上均可彻底分清使用的(Usage = Both),即在任一处描述符中定义即可的分清楚使用的类(Usage = Both)的基本类有:02h ------------- 通信及CDC控制类;DCh ------------ 诊断设备类;EFh ------------- 混杂设备类;FFh ------------- 厂商定义的设备类。
5.标准描述符设备描述符【说明1:】当设备类型bDeviceClass = 0时,说明类型将由接口描述符中定义的为准。
【说明2:】从设备描述符表格中可知,有3个索引值:厂商信息索引、产品信息索引、设备序列号索引,这意味着,将有3个字符串描述符为其准备。
配置描述符配置描述符中包含了配置描述符本身的长度、所有配置信息的总长度、供电方式及远程唤醒、供电量。
如果主机发出标准命令Get_Descriptor要求获得设备的某个配置描述符时,该配置应用的所有信息都将发给主机,它包括:该标准配置符本身、该配置所包含的所有接口、端点描述符及设备类描述符和厂商描述符。
【说明1:】配置描述符也包含了个用于描述符该配置的字符串描述符索引iConfiguration,这说明将有个字符串描述符为其准备。
【说明2:】枚举的过程可分为4个状态阶段:接入状态阶段、缺省状态阶段、地址状态阶段、设置状态阶段,各状态阶段任务如下:接入状态阶段-----------主机检测到新设备接入后,将复位总线(释放总线于空闲状态)。
缺省状态阶段-----------主机利用0x00地址访问新接入的设备,读取部分描述符后,会分配个设备地址。
地址状态阶段-----------主机再次复位总线,然后用新分配的地址获取设备所有的描述符。
设置状态阶段-----------主机根据设备的描述符,会对设备作些相关的配置。
【说明3:】bCongfigurationValue-----------USB设备的配置值。
用于存放主机执行SetConfiguration命令的设置值。
当主机发送GetConfiguration命令时,设备将向主机返回1个字节的配置值。
然而,USB设备处于不同的状态时,对GetConfigration的请求也有不同的响应:1.> 在枚举阶段,若设备处于地址状态时,对GetConfigration的请求返回为0;2.> 在枚举阶段,若设备处于默认状态(缺省状态)时,对GetConfigration的请求视为无效;3.> 在枚举阶段,若设备处于配置状态时,对GetConfigration的请求将返回bConfigurationValue 字段的值(该值可能是配置描述符的默认值,也可能是USB主机的设置值,这要看在执行GetConfigration 命令前是否执行了SetConfigration命令)。
因为主机要执行SetConfigration命令,所以bCongfigurationValue的默认值没什么用。
实际上主机给bCongfigurationValue赋值后,bCongfigurationValue值就充当配置描述符的编号,用以区分不同的配置,因为一个设备可能有多个配置。
接口描述符USB设备的接口,并不指物理接口,更确切的说应该是“功能接口“,是个赋予特定功能逻辑概念,是由一组物理端点为实现这一特定功能而凝聚的集合。
//定义标准的接口描述符结构typedef struct _INTERFACE_DESCRIPTOR_STRUCT{BYTE bLength; //接口描述符的字节数大小BYTE bDescriptorType; //接口描述符的类型编号BYTE bInterfaceNumber; //接口的编号BYTE bAlternateSetting; //可替换的接口描述符编号。
实际就是接口的描述符的编号。
BYTE bNumEndpoints; //该接口使用的端点数,不包括端点0BYTE bInterfaceClass; //接口类BYTE bInterfaceSubClass; //接口子类BYTE bInterfaceProtocol; //接口遵循的协议BYTE iInterface; //描述该接口的字符串索引值}INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;【说明1:】接口描述符中用到接口编号bInterfaceNumber,以区分在同一配置下的不同的接口。
同时还有该接口描述符的索引iInterface,这意味着将为其准备准备一个字符串描述符。
【说明2:】接口描述符中有一项:可替换的接口描述符编号bAlternateSetting,表示对某一接口进行描述的描述符编号。
虽然,USB设备的配置与配置描述符是一一对应的,即一个配置只能由一个配置描述来描述它,但一个接口却允许有多种描述符来描述它,尽管接口描述符的编号还是唯一一个。
说白了就是:一个接口有唯一的一个接口编号,但一个接口却可以有多个不同的描述符编号,而这些不同的接口描述符的编号值就是bAlternateSetting。
所以,通过bInterfaceNumber可以选定一个唯一的接口,然后再通过bAlternateSetting选择想要的对该接口的描述。
主机通过GetInterface可以获取当前正在使用的接口及接口描述,通过SetInerface可以选定某接口及其使用的描述符。
端点描述符端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。
端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。
每个设备必须要有一个默认的控制型端点,地址为0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。
主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。
//定义标准的端点描述符结构typedef struct _ENDPOINT_DESCRIPTOR_STRUCT{BYTE bLegth; //端点描述符字节数大小BYTE bDescriptorType; //端点描述符类型编号BYTE bEndpointAddress; //端点地址及输入输出属性BYTE bmAttributes; //端点的传输类型属性WORD wMaxPacketSize; //端点收、发的最大包大小BYTE bInterval; //对周期性端点的访问间隔}ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;【说明1:】端点的传输类型字节bmAttributes,描述了该端点的传输特性:0~1bit定义了传输类型---------00=控制传输、01=同步传输、10=批量传输、11=中断传输。
【说明2:】周期端点的访问周期字节bInterval,定义了该端点被主机的访问周期,此域值对于批量传输和控制传输毫无意义。
对于同步传输,其值必须为1,即1ms为标准的同步帧周期。
对于中断传输,该值为1~255,即1ms~255ms。
字符串描述符字符串描述符是一种可选的USB标准描述符,描述了如制商、设备名称或序列号等信息。
如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。
字符串使用的是Unicode编码。
字符串描述符是用字符的形式描述设备、配置、接口、端点等信息。
字符串描述符以一种格式2类符值的方式存在:1.> 显示语言的字符串描述符-----------该字符串描述符表明了设备支持哪几种语言。
2.> 显示信息的字符串描述符-----------用于描述具体的信息。
标准的字符串描述符的格式为:显示语言的字符串描述符与显示信息的字符串描述符的区别在于Strings项的不同,对于显示语言的字符串描述符来说Strings项由多个wLANGID[n]数组元素组成,每个wLANGID[n]是一个双字节的代表语言的ID值。
而对于显示信息的字符串描述符而言,Strings则是描述信息后的一组UNICODE编码。
为什么会出现这两种情况,原因在于访问字符串描述符的过程,主机请求访问某个字符串描述符的步骤分成两步:第一步:获取语言信息---------------首先主机向设备发送标准请求命令Get_Descriptor,其参数为:描述符类型=字符串描述符,字符串的索引值=0,语言=0,这样设备将返回显示语言的字符串描述符,从而主机知道了设备能支持哪些语言。
第二步:主机根据自已需要的语言,再次向设备发出标准请求命令Get_Descriptor,其参数为:描述符类型=字符串描述符,字符串索引值=目标字符串索引值,语言=目标语言。
这次设备将返回目标已经明确的显示信息的字符串描述符。
【说明1:】只有字符串描述符的长度不是固定的,其长度为N+2,其中N代表Strings项的字节数,2代表字符串描述符的bLength、bDescritorType所占的两个字节。
设备类描述符之HID描述符在USB协议中,HID设备的描述符没有划作为标准的描述符,而是作为一类设备单独划分出来进行描述,以设备类的方式来描述它。
所以,描述它的格式用设备类描述符。
HID设备的信息在设备描述符和配置描述符中都不包含,而是包含在接口描述符中,所以在使用HID 设备时,其设备描述符中的相关项应定义如下:bDeviceClass=0;bDeviceSubClass=0;bDeviceProtocol=0;其接口描述符应该:bInterfaceClass=0x03另外,对无引导的HID设备,其接口描述符中子类代码bInterfaceSubClass应置0,此时bInterfaceProtocol 无效,置零即可。