电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

usb标准描述符之技巧

2022-02-19 10:01分类:电子元器件 阅读:

 

usb标准ioctl之方法

USB是个通用性的系统总线,端口号全是统一的。可是USB机器设备却各式各样,比如USB电脑鼠标,USB电脑键盘,U盘这些,那麼USB服务器是如何识别出不一样的专用设备的呢?这还要取决于ioctl了。
USB的ioctl关键有机器设备ioctl,配备ioctl,插口ioctl,节点ioctl,字符串数组ioctl,HIDioctl,汇报ioctl这些。

一个USB机器设备有一个机器设备ioctl,机器设备ioctl里边决策了该机器设备有多少种配备,每一种配备ioctl相匹配着配备ioctl;而在配备ioctl中又界定了该配备里边有多少个插口,每一个插口有相应的插口ioctl;在插口ioctl里边又界定了该插口有多少个节点,每一个节点相匹配一个节点ioctl;节点ioctl界定了节点的尺寸,种类这些。从而我们可以看得出,USB的ioctl中间的相互关系是一层一层的,最上层一层是机器设备ioctl,下边是配备ioctl,再下边是插口ioctl,再下边是节点ioctl。在获得ioctl时,先获得机器设备ioctl,随后再获得配备ioctl,依据配备ioctl中的配备结合长短,一次将配备ioctl、插口ioctl、节点ioctl一起一次读回。在其中很有可能也会有获得机器设备系列号,生产商字符串数组,商品字符串数组等。

每一种ioctl都是有自已单独的序号,以下:
#define DEVICE_DESCRIPTOR 0x01 //机器设备ioctl
#define CONFIGURATION_DESCRIPTOR 0x02 //配备ioctl
#define STRING_DESCRIPTOR 0x03 //字符串数组ioctl
#define INTERFACE_DESCRIPTOR 0x04 //插口ioctl
#define ENDPOINT_DESCRIPTOR 0x05 //节点ioctl

下边分別详解一下各ioctl。

1.机器设备ioctl

//界定规范的机器设备ioctl构造

typedef struct _DEVICE_DCESCRIPTOR_STRUCT
{
BYTE blength; //机器设备ioctl的字节尺寸
BYTE bDescriptorType; //机器设备ioctl种类序号
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;

//具体的机器设备ioctl实例
code DEVICE_DESCRIPTOR_STRUCT device_descriptor= //机器设备ioctl
{
sizeof(DEVICE_DESCRIPTOR_STRUCT), //机器设备ioctl的字节尺寸,这儿是18字节
DEVICE_DESCRIPTOR, //机器设备ioctl种类序号,机器设备ioctl是01
0x1001, //USB版本信息,这儿是USB01.10,即USB1.1。因为51是大端方式,因此高低字节互换
0x00, //USB分派的机器设备类编码,0表明种类在插口ioctl中界定
0x00, //USB分派的派生类编码,上边一项为0时,该项也需要设定为0
0x00, //USB分派的机器设备协议书编码,上边一项为0时,该项也需要设定为0
0x10, //节点0的较大包尺寸,这儿为16字节
0x7104, //生产商序号,这个是必须跟USB机构申请办理的ID号,表明生产商编号。
0xf0ff, //该商品的序号,跟生产商序号一起相互配合应用,让服务器申请注册该机器设备并载入对应的驱动软件
0x0100, //机器设备在出厂序号
0x01, //机器设备生产商字符串数组的数据库索引,在获得字符串数组ioctl时,应用该索引号来辨别差异的字符串数组
0x02, //叙述商品字符串数组的数据库索引,跟上面一样
0x03, //叙述机器设备系列号字符串数组的数据库索引,跟上面一样
0x01 //很有可能的配备数为1,即该机器设备只有一个配备
};

2.配备ioctl

//界定规范的配备ioctl构造

typedef struct _CONFIGURATION_DESCRIPTOR_STRUCT
{
BYTE bLength; //配备ioctl的字节尺寸
BYTE bDescriptorType; //配备ioctl种类序号
WORD wTotalLength; //此配备回到的任何数据信息尺寸
BYTE bNumInterfaces; //此配备所适用的插口总数
BYTE bConfiguraTIonValue; //Set_Configuration指令所须要的变量值
BYTE iConfiguration; //叙述该配备的字符串数组的数据库索引值
BYTE bmAttributes; //供电系统方式的挑选
BYTE MaxPower; //机器设备从系统总线获取的最大的电流量
}
CONFIGURATION_DESCRIPTOR_STRUCT, * pCONFIGURATION_DESCRIPTOR_STRUCT;

2.插口ioctl

//界定规范的插口ioctl构造

typedef struct _INTERFACE_DESCRIPTOR_STRUCT
{
BYTE bLength; //插口ioctl的字节尺寸
BYTE bDescriptorType; //插口ioctl的种类序号
BYTE bInterfaceNumber; //该插口的序号
BYTE bAlternateSetting; //预留的插口ioctl序号
BYTE bNumEndpoints; //该插口应用的节点数,不包括节点0
BYTE bInterfaceClass; //接口方式
BYTE bInterfaceSubClass; //插口子种类
BYTE bInterfaceProtocol; //插口遵循的协议书
BYTE iInterface; //叙述该插口的字符串数组数据库索引值
}
INTERFACE_DESCRIPTOR_STRUCT, * pINTERFACE_DESCRIPTOR_STRUCT;

4.节点ioctl

//界定规范的节点ioctl构造

typedef struct _ENDPOINT_DESCRIPTOR_STRUCT
{
BYTE bLegth; //节点ioctl字节尺寸
BYTE bDescriptorType; //节点ioctl种类序号
BYTE bEndpointAddress; //节点详细地址及I/O特性
BYTE bmAttributes; //节点的传送种类特性
WORD wMaxPacketSize; //节点收、发的较大包尺寸
BYTE bInterval; //服务器查看节点的间隔时间
}
ENDPOINT_DESCRIPTOR_STRUCT, * pENDPOINT_DESCRIPTOR_STRUCT;

下边是一个配备ioctl集合的定义
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;

配备ioctl结合的实例


code CON_INT_ENDP_DESCRIPTOR_STRUCT con_int_endp_descriptor= //配备ioctl结合
{
//configuration_descriptor //配备ioctl
{
sizeof(CONFIGURATION_DESCRIPTOR_STRUCT), //配备ioctl的字节尺寸,这儿为9
CONFIGURATION_DESCRIPTOR, //配备ioctl种类序号,配备ioctl为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, //配备ioctl结合的总尺寸
0x01, //只包括一个插口
0x01, //该配备的序号
0x00, //iConfiguration字段名
0x80, //选用系统总线供电系统,不兼容远程唤醒
0xC8 //从系统总线获得较大电流量400mA
},
//interface_descritor //插口ioctl
{
sizeof(INTERFACE_DESCRIPTOR_STRUCT), //插口ioctl的字节尺寸,这儿为9
INTERFACE_DESCRIPTOR, //插口ioctl种类序号,插口ioctl为3
0x00, //插口序号为4
0x00, //该插口ioctl的编码为0
ENDPOINT_NUMBER, //非0节点总数为2,只应用节点主节点键入和輸出
0x08, //界定为USB大容量存储器机器设备
0x06, //应用的派生类,为简单化块指令
0x50, //应用的协议书,这儿应用单大批量传输协议
0x00 //插口ioctl字符串数组数据库索引,为0,表明沒有字符串数组
},

//endpoint_descriptor[]
{
{ //主节点键入叙述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //节点ioctl的字节尺寸,这儿为7
ENDPOINT_DESCRIPTOR, //节点ioctl种类序号,节点ioctl为5
MAIN_POINT_IN, //节点号,主键入节点
ENDPOINT_TYPE_BULK, //应用的传送种类,大批量传送
0x4000, //该节点适用的较大包规格,64字节
0x00 //终断扫描时间,对大批量传送失效
},

{ //主节点輸出叙述
sizeof(ENDPOINT_DESCRIPTOR_STRUCT), //节点ioctl的字节尺寸,这儿为7
ENDPOINT_DESCRIPTOR, //节点ioctl种类序号,节点ioctl为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号键入节点

上一篇:连接线转接卡:接口类型详细介绍

下一篇:MAXQ1850-KIT DeepCover安全微控制器(MAXQ1850)评估套件

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部