yiffer的个人空间 https://blog.eetop.cn/edesign [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

USB设备的枚举过程及描述符说明2

已有 3421 次阅读| 2011-7-4 21:07 |个人分类:USB

下面分别详细介绍一下各描述符。

1.设备描述符

//定义标准的设备描述符结构

typedef struct _DEVICE_DCEs criptOR_STRUCT
{
 BYTE blength;                               //设备描述符的字节数大小
 BYTE bDes criptorType;                      //设备描述符类型编号
 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_DEs criptOR_STRUCT, * pDEVICE_DEs criptOR_STRUCT;

//实际的设备描述符示例
code DEVICE_DEs criptOR_STRUCT device_des criptor=   //设备描述符
{
 sizeof(DEVICE_DEs criptOR_STRUCT),                   //设备描述符的字节数大小,这里是18字节
 DEVICE_DEs criptOR,                              //设备描述符类型编号,设备描述符是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_DEs criptOR_STRUCT
{
 BYTE bLength;                               //配置描述符的字节数大小
 BYTE bDes criptorType;                       //配置描述符类型编号
 WORD wTotalLength;                          //此配置返回的所有数据大小
 BYTE bNumInterfaces;                        //此配置所支持的接口数量
 BYTE bConfigurationValue;                   //Set_Configuration命令所需要的参数值
 BYTE iConfiguration;                        //描述该配置的字符串的索引值
 BYTE bmAttributes;                          //供电模式的选择
 BYTE MaxPower;                              //设备从总线提取的最大电流
}
CONFIGURATION_DEs criptOR_STRUCT, * pCONFIGURATION_DEs criptOR_STRUCT;

2.接口描述符

//定义标准的接口描述符结构

typedef struct _INTERFACE_DEs criptOR_STRUCT
{
 BYTE bLength;                               //接口描述符的字节数大小
 BYTE bDes criptorType;                       //接口描述符的类型编号
 BYTE bInterfaceNumber;                      //该接口的编号
 BYTE bAlternateSetting;                     //备用的接口描述符编号
 BYTE bNumEndpoints;                         //该接口使用的端点数,不包括端点0
 BYTE bInterfaceClass;                       //接口类型
 BYTE bInterfaceSubClass;                    //接口子类型
 BYTE bInterfaceProtocol;                    //接口遵循的协议
 BYTE iInterface;                            //描述该接口的字符串索引值
}
INTERFACE_DEs criptOR_STRUCT, * pINTERFACE_DEs criptOR_STRUCT;

4.端点描述符

//定义标准的端点描述符结构

typedef struct _ENDPOINT_DEs criptOR_STRUCT
{
 BYTE bLegth;                                //端点描述符字节数大小
 BYTE bDes criptorType;                       //端点描述符类型编号
 BYTE bEndpointAddress;                      //端点地址及输入输出属性
 BYTE bmAttributes;                          //端点的传输类型属性
 WORD wMaxPacketSize;                        //端点收、发的最大包大小
 BYTE bInterval;                             //主机查询端点的时间间隔
}
ENDPOINT_DEs criptOR_STRUCT, * pENDPOINT_DEs criptOR_STRUCT;

下面是一个配置描述符集合的定义
typedef struct _CON_INT_ENDP_DEs criptOR_STRUCT
{
 CONFIGURATION_DEs criptOR_STRUCT configuration_des criptor;
 INTERFACE_DEs criptOR_STRUCT  interface_descritor;
 ENDPOINT_DEs criptOR_STRUCT  endpoint_des criptor[ENDPOINT_NUMBER];
}CON_INT_ENDP_DEs criptOR_STRUCT;

配置描述符集合的示例


code CON_INT_ENDP_DEs criptOR_STRUCT con_int_endp_des criptor=  //配置描述符集合
{
//configuration_des criptor                     //配置描述符
{
 sizeof(CONFIGURATION_DEs criptOR_STRUCT),      //配置描述符的字节数大小,这里为9
 CONFIGURATION_DEs criptOR,                     //配置描述符类型编号,配置描述符为2
 (sizeof(CONFIGURATION_DEs criptOR_STRUCT)+
 sizeof(INTERFACE_DEs criptOR_STRUCT)+
 sizeof(ENDPOINT_DEs criptOR_STRUCT)*ENDPOINT_NUMBER)*256+
 (sizeof(CONFIGURATION_DEs criptOR_STRUCT)+
 sizeof(INTERFACE_DEs criptOR_STRUCT)+
 sizeof(ENDPOINT_DEs criptOR_STRUCT)*ENDPOINT_NUMBER)/256,   //配置描述符集合的总大小
 0x01,                                  //只包含一个接口
 0x01,                                  //该配置的编号
 0x00,                                  //iConfiguration字段
 0x80,                                  //采用总线供电,不支持远程唤醒
 0xC8                                   //从总线获取最大电流400mA
},
//interface_descritor                   //接口描述符
{
 sizeof(INTERFACE_DEs criptOR_STRUCT),   //接口描述符的字节数大小,这里为9
 INTERFACE_DEs criptOR,                  //接口描述符类型编号,接口描述符为3
 0x00,                                  //接口编号为4
 0x00,                                  //该接口描述符的编号为0
 ENDPOINT_NUMBER,                       //非0端点数量为2,只使用端点主端点输入和输出
 0x08,                                  //定义为USB大容量存储设备
 0x06,                                  //使用的子类,为简化块命令
 0x50,                                  //使用的协议,这里使用单批量传输协议
 0x00                                   //接口描述符字符串索引,为0,表示没有字符串
},

//endpoint_des criptor[]
{
                                     //主端点输入描述
  sizeof(ENDPOINT_DEs criptOR_STRUCT),  //端点描述符的字节数大小,这里为7
  ENDPOINT_DEs criptOR,                 //端点描述符类型编号,端点描述符为5
  MAIN_POINT_IN,                       //端点号,主输入端点
  ENDPOINT_TYPE_BULK,                  //使用的传输类型,批量传输
  0x4000,                              //该端点支持的最大包尺寸,64字节
  0x00                                 //中断扫描时间,对批量传输无效
 },
 
                                     //主端点输出描述
  sizeof(ENDPOINT_DEs criptOR_STRUCT),  //端点描述符的字节数大小,这里为7
  ENDPOINT_DEs criptOR,                 //端点描述符类型编号,端点描述符为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号输入端点

转:http://blog.sina.com.cn/s/blog_4dd77fd10100assw.html


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 20

    获赞
  • 69

    评论
  • 3705

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 22:12 , Processed in 0.013997 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部