USB的描述符及各种描述符之间的依赖关系

发布者:码梦创想最新更新时间:2015-09-25 来源: eefocus关键字:USB  描述符  依赖关系 手机看文章 扫描二维码
随时随地手机看文章
    USB的描述符及各种描述符之间的依赖关系.USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。

    USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。

   设备描述符记录的信息:设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID)和产品(PID),设备版本号,厂商字符串索引,产品字符串索引,设备序列号索引,可能的配置数等.

   配置描述符记录的信息:配置所包含的接口数,配置的编号,供电方式,是否支持远程唤醒,电流需求量等.

   接口描述符记录的信息:接口的编号,接口的端点数,接口所使用的类,子类,协议等.

   端点描述符记录的信息:端点号及方向,端点的传输类型,最大包长度,查询时间间隔等.

   字符串描述符记当的信息:提供一些方便人们阅读的信息,它不是必需的.

 

    一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

    举个例子说明它们之间的关系:8号教学楼的808教室.8号楼就是设备,而808或其它教室就是端点.而配置和接口,是为了方便管理端点而抽象出来的概念.一个设备可以有多个配置,但是同一时刻只能有一个配置有效.每个配置下又可有很多接口.当我们需要不同的功能时,只要选择不同的配置即可.如我们把教学楼分为两个配置:平时上课用和期末考试用。当我们做为考试用时,要将所有的教室都用上。即该配置下只有一个接口,接口下有很多端点--教室。而平时上课用时,把教室分为两类,即两个接口。一类是教师休息室,有N个教室(即该接口有N个端点),一类上课的课室,有M个教室(即该接口有M个端点)。教师休息室和课室是不能共用的(在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;

 [page]

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  描述符  依赖关系 引用地址:USB的描述符及各种描述符之间的依赖关系

上一篇:USB的电气特性
下一篇:USB设备的插入检测机制

推荐阅读最新更新时间:2024-05-02 23:59

Vishay超小尺寸4路ESD保护二极管保护USB 3.0接口
器件采用超小尺寸CLP1007-5L封装,所用的电路板空间比前一代方案少70% 日前,Vishay Intertechnology, Inc.(NYSE 股市代号:VSH)宣布,推出新的4路ESD保护阵列---VBUS54FD-SD1。该器件采用超小尺寸的芯片级CLP1007-5L封装,可用于便携式电子产品。在不牺牲性能的前提下,Vishay Semiconductors VBUS54FD-SD1的尺寸远小于前一代元器件,具有低电容和低漏电流的特点,可保护高速数据线路免收瞬变电压信号的影响。 今天推出的保护阵列的尺寸为1.0mm x 0.7mm,厚度为0.27mm,所使用的电路板空间比前一代器件少70%,体积减小了7倍
[电源管理]
Vishay超小尺寸4路ESD保护二极管保护<font color='red'>USB</font> 3.0接口
基于单片无操作系统的 USB 主机控制器接口
1引言 论文以Compaq、Microsoft 等公开的 USB 主机控制器接口规范为基础,遵循USB 主机的协议规范,开发了独立于操作系统的USB 主机底层驱动程序,并在S3C2410 平台上得到了验证。下面详细论述主机控制器接口规范及 驱动程序实现。   2 USB 体系结构 USB 体系包括一系列的硬件层和软件层,如图1 所示。   为了实现其可重用性和适合嵌入式系统特性,图 1 借鉴了PC 机上的USB 主机系统结 构,同时对一些在嵌入式系统中不必要的功能进行了取舍。用户程序和USB 设备类驱动通 过加工和分解IRP,构建相应的URB(Universal Request Block)并通过HCD(Ho
[电源管理]
基于单片无操作系统的 <font color='red'>USB</font> 主机控制器接口
USB接口芯片FT245AM的原理
随着计算机的广泛就算,与计算机通信的方式也越来越多,对通信速度和易用性要求也越来越高,这使得USB通信方式显得越来越突出,应用领域也越来越广泛。因此,在鼠标、键盘、游戏杆、数据采集卡、数码相机、掌上电脑中都有USB的应用。 FT245AM是美国FTDI公司生产的一种USB专用芯片。它具有功能强、体积小、传输速度快、符合USB1.1技术规范、易于一微处理器接口等特点,因而倍受用户的青睐。笔者采用FT245AM成功地开发了航空ARINC429总线测试仪。     FT245AM集成了USB1.1通信协议和外设接口,可以方便地实现USB主机与外设MCU、CPLD的接口,其数据传输速率可达1MB/s。FT245AM内部128字节的接收F
[嵌入式]
USB接口电路的原理图
  USB接口电路的原理如图所示。   R3是上拉电阻器,它可使USB口的D+端上拉到DS2490S的VB端,表示USB主机系统是高速设备,同时这个上拉电阻器告诉主机有USB设备插入。该上拉电阻器的设置对适配器的影响很大,它的负载值和1-Wire网络的总长决定1-Wire总线电压上升到5 V的速度。经过实验测试选择R3的阻值为27 Ω±lO%。R1、R2为USB数据线保护电阻器。L、L2具有禁止高频干扰并且减弱EMI辐射的功能。LF33CV为3.3 V电压稳压器,与周     USB接口电路的原理如图所示。   R3是上拉电阻器,它可使USB口的D+端上拉到DS2490S的VB端,表示USB主机系统是高速设备,同时这
[嵌入式]
Switch Pro底座更大 带有2个USB 3.0与1个网线接口
此前据彭博社报道,有知情人士称,任天堂公司计划最快于 7 月开始组装其新款 Switch,并在 9 月或 10 月发布新款 Switch。   现在,有越来越多的证据表明它可能真的要来了。   今日,亚马逊墨西哥网站上出现了一个空白的“New Nintendo Switch Pro”的商品页面,价格和发售时间都是未知。虽然很快就被下架了,但还是有手快的网友截到了图。允许开发商和发行商展示运行在这个新硬件上的Switch游戏。定价比299美元的原版机型高。 此前的种种爆料都表明,新款主机的命名为 Switch Pro。虽然不知道官方怎么把它和 Switch Pro 手柄进行区分,但目前还没有第二种称呼。   
[手机便携]
USB 3.0标准解析
所谓USB 3.0,就是新一代的USB接口,特点是传输速率非常快,理论上能达到4.8Gbps,比现在的480Mbps的High Speed USB(简称为USB 2.0)快10倍,外形和现在的USB接口基本一致,能兼容USB 2.0和USB 1.1设备。 你厌倦了在拷贝一部高清视频时要等待近20分钟吗?虽然和USB 1.1相比,USB 2.0的速度有了质的飞跃,但我们依然不满足,所以……我们熟悉的USB传输速率又要加速向前冲了! 名叫USB 3.0的新一代接口比现在的USB 2.0快十倍,全面超越 IEEE 1394 和eSATA的速度足以让它傲视所有“非主流”接口的移动设备,它会成为日后王者中的王者吗?其他接口会因此而消失吗?
[嵌入式]
基于CY7C68013的USB2.0数据传输模块设计
  1 引 言   通用串行总线(USB) 是一种电缆总线。它支持主计算机与许多可同时访问的外设之间进行数据交换。使外设的连接具有单一化、即插即用、热插拔等特点,已经成为个人笔记本电脑和台式机的标准配置接口。USB支持3种传输速率:1.5Mb/s的低速传输、12Mb/s的全速传输、480Mb/s的高速传输。Cypress公司的EZ-USB FX2是一款集成 USB2.0的微处理器,它集成了USB2.0收发器、SIE(串行接口引擎)、增强的8051微控 制器和可编程的外围接口。每条指令占四个时钟周期,在48M晶振下工作时,单指令周 期为83.3ns,执行速度远快于标准的8051单片机。本文的数据传输模块采用CY7C68013 高速
[嵌入式]
基于CY7C68013的<font color='red'>USB</font>2.0数据传输模块设计
内置微处理器的USB音频接口芯片TUSB3200
    摘要: TUSB3200是由德州仪器日本公司推出的一款用于USB接口连接的音频数据控制芯片,该芯片内置8052MCU微处理器,能实现多声道的录音和播放功能。文中介绍了TUSB3200的内部工作原理、框图及功能,并给出了用TUSB3200设计的双声道输入/输出播录的应用电路。     关键词: USB 音频接口 单片机 TUBS3200 1 概述 USB音频接口电路是带USB接口的音响设备和电脑多媒体外围设备的必需器件。德州仪器公司推出的TUSB3200是一款最适合于音响和电脑周边设备的USB接口用的音频数据控制芯片。它采用52脚扁平封装,带有内置微处理器,价格低,可实现多声道播放和录音等功能,因而
[应用]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

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