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

发布者:阳关三迭最新更新时间:2015-08-14 来源: eefocus关键字:USB协议  返回设备  描述符 手机看文章 扫描二维码
随时随地手机看文章
回应设备描述符
上一次已经介绍怎么样收到主控器的获取设备描述符的数据,这里就解释怎么样发送回应数据给主控器。
先从USB协议里找到标准设备的定义,我把它用C语言定义如下:
typedef struct _USB_DEVICE_DESCRIPTOR {
 BYTE bLength;
 BYTE bDescriptorType;
 WORD bcdUSB;
 BYTE bDeviceClass;
 BYTE bDeviceSubClass;
 BYTE bDeviceProtocol;
 BYTE bMaxPacketSize0;
 WORD idVendor;
 WORD idProduct;
 WORD bcdDevice;
 BYTE iManufacturer;
 BYTE iProduct;
 BYTE iSerialNumber;
 BYTE bNumConfigurations;
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是描述符的类型。它的定义跟主控器发下来描述符的类型是一样的,如下:
DEVICE                   1
CONFIGURATION          2
STRING                   3
INTERFACE                4
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 00 40 00 80 00 80 00 01 04 2C 4A 01
 
idVendor是厂商标识。由USB-IF分配的编码。在这里使用0x8000。
 
idProduct是厂商定义的产品标识。由厂家和产品标识,就可以让操作系统加载不同的驱动程序。如下:
12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01
 
bcdDevice是用BCD表示的设备发布的版本号。这里是1.00。
12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01
 
iManufacturer是厂商字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有厂商字符串。在这里是0x04,就是从字符串描述符开始位置算起第4个字节位置读取字符串。
 
iProduct是产品字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有产品字符串。在这里是0x2C,就是从字符串描述符开始位置算起第2C个字节位置读取字符串。
 
iSerialNumber是序列号字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有序列号字符串。在这里是0x4A,就是从字符串描述符开始位置算起第4A个字节位置读取字符串。
所有字符串,都是采有UNICODE编码。
 
bNumConfigurations是配置描述符的个数。在这里只使用了一个配置,所以设置为1

关键字:USB协议  返回设备  描述符 引用地址:USB协议深入分析 返回设备描述符

上一篇:USB协议深入分析 设备描述符配置包
下一篇:USB协议深入分析 设置USB地址

推荐阅读最新更新时间:2024-03-16 14:28

labview的数据类型----通过类型描述符提取控件名称(LABEL)
通过分析类型描述符结构,我们已经得到的类型描述符的头部信息,我们知道,LV的存储结构中同时包括了控件的标签信息,看看如何能通过描述符得到控件的标签.OPENG中提供了这个功能,我们跟踪一下看看它实现的方法: 首先根据类型描述符头部信息中的类型码对LV的数据类型进行分类,每个CASE中的数据存储结构都是类似的. 先看看第一个CASE: 条件是: I8 .. CXT , Boolean , Variant ,这说明从I8--- CXT ,包括BOOLEAN VARIANT类型描述符的结构都是类似的.看看I8 和BOOLEAN的类型描述符的内容,我们分析一下. I8和BOOLEAN除了类型码不同(0X01,0X21)
[测试测量]
labview的数据类型----通过类型<font color='red'>描述符</font>提取控件名称(LABEL)
基于OHCI协议的S3C2440 USB Host Driver之协议介绍(二)
一 HCD的职责: 1.HCD负责HC的操作。 HCD可以直接与HC的可操作寄存器通信,且在HCCA中建立中断ED表头指针。HCD维护HC的状态,表处理指针,表处理使能,中断使能。 2.带宽分配。 HCD负责对USB访问进行调度。HCD给每一个周期端点分配一定可用的带宽。如果没有足够的带宽可用,一个新连接的周期端点不允许访问总线。 一部分带宽分给非周期传输。这会确保在每帧里一定量的批量和控制传输会发生。每帧是1ms。 每帧的开始,HC发起SOF给USB总线。HC紧接着服务非周期列表。然后服务周期列表。还有剩余时间的话,再次服务非周期列表。 3列表管理。 USB传输机制以通过连接ED表上的TD。HCD
[单片机]
基于OHCI<font color='red'>协议</font>的S3C2440 <font color='red'>USB</font> Host Driver之<font color='red'>协议</font>介绍(二)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved