您的位置 首页 硬件

USB协议深入分析 回来设备描述符

回应设备描述符上一次已经介绍怎么样收到主控器的获取设备描述符的数据,这里就解释怎么样发送回应数据给主控器。先从USB协议里找到标准设

回应设备描述符

上一次现已介绍怎么样收到主控器的获取设备描述符的数据,这儿就解说怎么样发送回应数据给主控器。
先从USB协议里找到规范设备的界说,我把它用C言语界说如下:
typedefstruct_USB_DEVICE_DESCRIPTOR{
BYTEbLength;
BYTEbDescriptorType;
WORDbcdUSB;
BYTEbDeviceClass;
BYTEbDeviceSubClass;
BYTEbDeviceProtocol;
BYTEbMaxPacketSize0;
WORDidVendor;
WORDidProduct;
WORDbcdDevice;
BYTEiManufacturer;
BYTEiProduct;
BYTEiSerialNumber;
BYTEbNumConfigurations;
}USB_DEVICE_DESCRIPTOR;
回来给主控器的数据结构便是上面的内容,只要把上面的结构填写适宜的内容,就能够发送回去给主控器。在我的USB设备里,我把它填写如下的数据:
12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01
看到这串数据是不明白是什么东西的,现在就来细心地剖析它的详细界说。下面就按着一个字段一个字段地剖析它。
bLength是本结构的数据长度,这样能够便利今后兼容不同的版别协议。因为不同的结构是不同的长度,这样就能够区别不同的协议了。比方有一天想增加一个字段,那么它的长度就会改动,这时就能够依据不同的长度进行解说不同的协议了。这次回来的结构长度是0x12,也便是18个字节,它的长度是从bLength长度开端,也便是说是彻底整个结构的长度。
bDescriptorType是描述符的类型。它的界说跟主控器发下来描述符的类型是相同的,如下:
DEVICE1
CONFIGURATION2
STRING3
INTERFACE4
ENDPOINT 5
DEVICE_QUALIFIER 6
OTHER_SPEED_CONFIGURATION 7
INTERFACE_POWER1 8
因为回来的是设备描述符,所以就挑选了1,也便是包里显现的第二个字节01。用这个类型来区别不同的描述符。
bcdUSB是USB发布的协议版别。也便是本设备能适用于那种协议,现在USB首要有两个版别,一个是1.10,一个是2.10版别。在本设备里,选用了1.10的协议版别。因为这个字段是选用BCD编码,所以1.10的表明为0x0110的格局,按小端格局输出来,就变成10 01的显现了。
bDeviceClass是设备分类。当它的值是0时,表明一切接口在装备描述符里,而且一切接口是独立的。当它的值是1到FEH时,表明不同的接口相关的。当它的值是FFH时,它是厂商自己界说的。在这个设备里,是界说为0。
bDeviceSubClass是设备子分类码。当时面的bDeviceClass值是0时,这儿一定要设置为0。其它就跟据USB-IF安排界说的编码。
bDeviceProtocol是设备运用的协议。假如运用USB-IF安排界说的协议,就需要设置这儿的值。假如不运用,就直接设置为0。假如厂商自己界说的能够设置为FFH。
以上三个值,在本设备里悉数设置为0。
bMaxPacketSize0是端点0收发最大的包巨细。仅答应设置8,16,32,64中的任何一个巨细。在本设备里是设置为64个字节巨细。所以看到这个字段是40 的巨细。
12 01 10 01 00 00 0040 00 80 00 80 00 01 04 2C 4A 01
idVendor是厂商标识。由USB-IF分配的编码。在这儿运用0x8000。
idProduct是厂商界说的产品标识。由厂家和产品标识,就能够让操作系统加载不同的驱动程序。如下:
12 01 10 01 00 00 00 4000 80 00 80 00 01 04 2C 4A 01
bcdDevice是用BCD表明的设备发布的版别号。这儿是1.00。
12 01 10 01 00 00 00 4000 80 00 8000 0104 2C 4A 01
iManufacturer是厂商字符串的偏移值。这值首要说明晰它在字符串描述符里的偏移方位。假如它设置为0,表明没有厂商字符串。在这儿是0x04,便是从字符串描述符开端方位算起第4个字节方位读取字符串。
iProduct是产品字符串的偏移值。这值首要说明晰它在字符串描述符里的偏移方位。假如它设置为0,表明没有产品字符串。在这儿是0x2C,便是从字符串描述符开端方位算起第2C个字节方位读取字符串。
iSerialNumber是序列号字符串的偏移值。这值首要说明晰它在字符串描述符里的偏移方位。假如它设置为0,表明没有序列号字符串。在这儿是0x4A,便是从字符串描述符开端方位算起第4A个字节方位读取字符串。
一切字符串,都是采有UNICODE编码。
bNumConfigurations是装备描述符的个数。在这儿只运用了一个装备,所以设置为1

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部