[21IC首页] [21IC资料下载] [21IC器件搜索[alldatasheet网] [中国芯片手册网] [电子查询网] [磁动力工作室] [驱动程序开发网] [射频网络] [液晶之家] [可控硅应用技术网]

Computer○○的家当®

 
 
载入中...
   
                                                         设置为首页      [站长入口]    站点2: [EDN站点]   站点3:[61IC站点]  USB专区: [圈圈的USB专区]




载入中...

日志内容


USB的描述符及各种描述符之间的依赖关系
电脑圈圈 发表于 2007-9-14 22:56:00

[原创] USB入门系列之七 —— USB的描述符及各种描述符之间的依赖关系

    USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,
例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的
设备的呢?这就要依赖于描述符了。
    USB的描述符主要有设备描述符,配置描述符,接口描述符,
端点描述符,字符串描述符,HID描述符,报告描述符等等。
关于报告描述符,请看我以前写的:《USB HID报告及报告描述符简介 》
 http://group.ednchina.com/93/198.aspx

    一个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号输入端点

 

(来自USB小组专区:http://group.ednchina.com/93/
                       By computer00 @ 2007-09-14)


阅读全文 | 回复(17) | 引用通告 | 编辑       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-10-19 15:55:00

computer00这个我还没研究过,看看HID那份文档应该可以做出来吧。21IC有人做出来了,你去这里面找找:http://bbs.21ic.com/club/bbs/list.asp?boardid=53
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
zjymcu发表评论于2007-10-19 11:49:00

zjymcu请问OO:
我已做了一个标准的USB健盘实验。现在我想在键盘上加上SLEEP、POWER、WAKEUP特殊功能键和WWW、MAIL等的多媒体键,请问怎么把原来的键盘报告描述符改成多媒体键盘的报告描述符?
wdzjy@163.com

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-24 22:03:00

computer00还有DBR要改啊,里面有总扇区数等。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
aa(游客)发表评论于2007-9-24 21:53:00

aa(游客)请问OO??
要把模拟U盘改成128M
怎么改啊!
nsigned char DISK_CAPACITY[8]= //磁盘容量
{
0x00,0x4F,0xD8,0x00,
0x00,0x00,0x02,0x00
这里该了但是
属性里还是64M啊?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
yeu(游客)发表评论于2007-9-23 19:49:00

yeu(游客)谢谢OO明白了
0xC2, 0xC3, 0xD3, 0xCE, 0xB5, 0xBC, 0xB2, 0xA5, 0xBB, 0xFA, 0x20, //磁盘标卷
D3 0 1 2 3 4 5 6 7 8 9 A B C D E F
A 印 英 樱 婴 鹰 应 缨 莹 萤 营 荧 蝇 迎 赢 盈
B 影 颖 硬 映 哟 拥 佣 臃 痈 庸 雍 踊 蛹 咏 泳 涌
C 永 恿 勇 用 幽 优 悠 忧 尤 由 邮 铀 犹 油 游 酉
D 有 友 右 佑 釉 诱 又 幼 迂 淤 于 盂 榆 虞 愚 舆
E 余 俞 逾 鱼 愉 渝 渔 隅 予 娱 雨 与 屿 禹 宇 语
F 羽 玉 域 芋 郁 吁 遇 喻 峪 御 愈 欲 狱 育 誉

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-23 18:37:00

computer00那些关于FAT16里面的磁盘标卷以及磁盘信息等,是GB码,不是Unicode。

USB的字符串描述符才识Unicode。你下载我的USB鼠标代码看看就清楚了。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
fengyeu(游客)发表评论于2007-9-23 14:51:00

fengyeu(游客)还有要请教OO
0xC2, 0xC3, 0xD3, 0xCE, 0xB5, 0xBC, 0xB2, 0xA5, 0xBB, 0xFA, 0x20, //磁盘标卷
旅游导播机的Unicode是(旅65C5) (游6E38)
但是在USB.C里找不到??

个人主页 | 引用 | 返回 | 删除 | 回复       


圈字的Unicode是5708
fengyeufengyeu(游客)发表评论于2007-9-23 14:42:00

fengyeufengyeu(游客)找不到
比如你共享的USBD12的哪个虚拟U盘
圈字的Unicode是5708。
但是我在
《USB.C file》
里找不到呢?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-23 0:19:00

computer00有不同的编码方案,例如GB和Unicode. USB里面的字符串描述符使用的是后者.
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
fengyeu(游客)发表评论于2007-9-23

fengyeu(游客)我也问个问题
汉字传输个PC是怎么编码的?????
英文的话是ASCII玛

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-21 15:58:00

computer00我也不知道准确含义怎么说。它就是接口的集合,而接口又是端点的集合。
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
guoj(游客)发表评论于2007-9-21 14:18:00

guoj(游客)谢谢computer00。
但是“配置”还不能理解。能否举例说明一下,USB中该配置的确切含义。
十分感激!

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-17 13:59:00

computer00配置描述符是说这个设备配置成怎样的. 配置描述符中包含了接口数,所以配置描述符是必不可少的。有多个配置描述符,说明它可以有不同的配置.
个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
guoj(游客)发表评论于2007-9-17 11:30:00

guoj(游客)请问:
设备描述符里面的配置描述符,具体有什么特殊作用? 为什么有的设备会存在多个配置描述符,不要配置描述符行吗?

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
computer00发表评论于2007-9-15 20:24:00

computer00这个...我没看过哦...其实USB协议我也没仔细看过的,就是看了很多本关于USB方面的书,乱七八糟的。

USB协议可以直接去www.usb.org上下载的.

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
xcc(游客)发表评论于2007-9-15 16:46:00

xcc(游客)00那:
英文原版的‘USB协议’书,全名叫什么?哪个出版社?
在网上搜了下搜不到。想去买本看看。

个人主页 | 引用 | 返回 | 删除 | 回复       


Re:USB的描述符及各种描述符之间的依赖关系
xcc(游客)发表评论于2007-9-15 16:27:00

xcc(游客)看过马伟的书后,感觉有点头绪了。之前看你的USB鼠标程序,看到后来就看不下去了,就里面的N多的变量名都看的我眼睛够呛。一顶以表示支持00。
个人主页 | 引用 | 返回 | 删除 | 回复       

发表评论:
载入中...

 
 

 

用户信息

载入中...

    
    
 
家当信息
载入中...

站长简介:  

    Computer00,男。B型血,天蝎座。爱好电子技术及计算机技术。21IC中国电子网[技术交流]版版主。

 

最新回复

载入中...

圈圈公告 
载入中...

最新家当

载入中...

友情链接 

 

家当主题

载入中...

最新留言

载入中...

搜我的家当 

          chunyang工作室
        为您提供无线通讯模块