您的位置 首页 传感器

usb规范描述符之技巧

本站为您提供的usb标准描述符之技巧,usb标准描述符之技巧
USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖

usb规范描绘符之技巧


USB是个通用的总线,端口都是一致的。可是USB设备却各式各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是怎么辨认出不同的设备的呢?这就要依赖于描绘符了。
    USB的描绘符主要有设备描绘符,装备描绘符,接口描绘符,端点描绘符,字符串描绘符,HID描绘符,陈述描绘符等等。


    一个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,                              //设备描绘符类型编号,设备描绘符是01
 0x1001,   //USB版本号,这儿是USB01.10,即USB1.1。因为51是大端形式,所以凹凸字节交流
 0x00,                                 //USB分配的设备类代码,0表明类型在接口描绘符中界说
 0x00,                                 //USB分配的子类代码,上面一项为0时,本项也要设置为0
 0x00,                                //USB分配的设备协议代码,上面一项为0时,本项也要设置为0
 0x10,                                //端点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;


2.接口描绘符


//界说规范的接口描绘符结构


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,                                  //接口编号为4
 0x00,                                  //该接口描绘符的编号为0
 ENDPOINT_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号输入端点

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/70987.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部