USB协议分析(一)

1. 原文链接:https://blog.csdn.net/hao507/article/details/4934964

2.原文链接:https://blog.csdn.net/weiaipan1314/article/details/113530649

3.原文链接:https://blog.csdn.net/qq_40088639/article/details/109463239

4. 转载于:https://www.cnblogs.com/newjiang/p/9511331.html

https://blog.csdn.net/weixin_30933531/article/details/97532497

5.  https://www.cnblogs.com/uiojhi/p/9466597 .html

6.USB协议详解第14讲(USB传输-同步传输及事务组成)_一个早起的程序员-CSDN博客_usb同步传输

7.(1条消息) USB 协议分析(含基本协议和 USB 请求和设备枚举)_StephenZhou-CSDN博客_usb协议分析

 

8.《圈圈教你玩USB》

   8.1.第一章 :https://blog.csdn.net/sz189981/article/details/62072621

   8.2.第二章:https://blog.csdn.net/sz189981/article/details/62238094

   8.3.第三章:https://blog.csdn.net/sz189981/article/details/65029809

 

1.1 USB是什么
        1. USB是什么:
                                   USB是通用串行总线(Universan Serial Bus)的缩写。
        2. USB出现的原因:
                                   1)支持热插拔,并且即插即用(PnP:Plug and Play);
                                   2)有很强的可扩展性,速度也很快。
        3.USB协议版本:
                                  1.0、1.1、2.0等
        4.通信结构:
                                  主从模式结构,设备与设备、主机与主机之间不能互连。
        5.USB OTG(On The Go):
                                  同一个设备,在不同场合下可以在主机和从机之间切换。
                                  主从标志:USB OTG增加了一种MINI USB接头,比普通的4线USB多一根ID标识线,用来表明它是主机还是设备。
1.2 USB的特点
        1. 速度:
                                USB1.0和1.1版本中,只支持1.5Mb/s的低速(low-speed)模式和12Mb/s的全速(full-speed)模式。
                                USB2.0中,又加入了速度更快(480Mb/s)的高速(high-speed)模式。
                                USB3.0中,5.0Gb/s。
注:USB2.0并不一定都是高速设备,因为USB2.0协议对设备的高速模式不是强制的,而是可选的。例如PDIUSBD12,符合USB2.0协议,但不支持 高速模式,只支持12Mb/s的全速模式。
        2. 优点:
                                即插即用、容易使用、方便携带、传输速度快、可扩展性强、标准统一、价格便宜等。
        3. 缺点:
                               传输距离短、开发调试难度大等。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

   USB2.0的开发与设置主要包括三部分

                                第一:基于keil 的USB2.0的固件开发,这里主要是借用黑金开发板516上面自带的固件进行相关的设置预配置;

                               第二:是基于C# 或者C++对于USB2.0的上位机的开发;

                               第三:主要是基于FPGA的对于USB2.0的同步传输。

 

USB On-The-Go 扩大了USB 的应用领域,将USB 从传统的PC 与外设通讯的模式,扩展到移动电子和嵌入式领域中,抛开主机PC,实现通常的外设与外设之间点对点(Point to Point)的数据传输模式。

1 什么是USB On-The-Go

           我们先来回顾一下通用串行总线(Universal Serial Bus,简称为USB)发展的历史:

 i)1994 年11 月,以Intel 为首的7 家公司(Intel、Compaq、Microsoft、IBM、DEC、Northern Telecom 和NEC)推出了USB 协议的第一个草案,USB 作为一种新型的串行总线,揭开了新一轮的USB 总线的革命,但这时,USB 并不为计算机技术人员所熟知;

ii)1996 年2 月,USB 协议规范1.0 版本发布,版权属于Compaq、Intel、Microsoft和NEC 等4 家公司,并同意任何人可免费使用。自此,USB 开始逐渐被广大技术人员和用户所认可,并逐渐开始成为PC 主板上的标准接口;

iii)1998 年10 月,USB 1.1 版本发布,集中修订了USB 1.0 中的问题,并进一步突出了USB 的优势。到目前,USB 1.1 仍是开发USB 低速(1.5Mbps,Low-Speed)和全速(12Mbps,Full-Speed)设备的标准版本。

USB 的低功耗、速度高、成本低、支持即插即用和维护方便等优势更加稳定,USB 开始成为鼠标、键盘、游戏杆、打印机、光驱、硬盘、显示器和数码相机等几乎各种PC 外设与PC 连接的标准协议之一。

各种USB 的外设产品如雨后春笋般出现,如USB Flash 读卡器、USB 移动硬盘、USB 数码相机、USB 键盘等,几乎所有的PC 外设都有相应的USB 接口的产品。一时间,USB 成为了最为流行的PC 接口标准,嵌入式软硬件工程师也将USB 应用到自己的设计之中;

iv)2000 年4 月,Compaq、HP、Intel、Lucent、Microsoft、NEC 和Philips 等7 家公司联合发布USB 2.0 协议规范版本。新版本最大的变化就是将USB 的总线速度一下子提高到了480Mbps,即开始支持高速设备(High-Speed)。

由此,USB 翻开了新的一页,彻底打破了USB 应用在视频等高速传输领域中的速度瓶颈,大大扩展了USB 应用领域。从低速的鼠标、键盘,到全速的硬盘,再到高速的视频传输,USB 几乎无所不能,可以应用到任何一种PC 外设中。

USB 取代串口、并口等传统PC 接口只是个时间问题了。

 

               从问世,到协议规范2.0 版本,USB 不断在自我完善,走向成熟。从普通计算机用户,计算机工程师,到硬件芯片生产厂商,都已经完全认可了USB。厂商对于USB 的硬件和软件支持的也越来越完备,

现在开发一个USB 外设产品,所需要投入的成本和时间大大降低了,几年前是没有办法做到这一点的。但是,随着USB 应用领域的逐渐扩大,人们对于USB的期望也越来越高,希望USB 能应用在各种计算机领域中,

尤其是在移动通讯领域中,希望能通过PDA 等移动设备来直接和USB 外设通信,使得USB 能应用在没有PC 的领域中。非PC 应用领域?这正是USB 一个致命的弱点。USB 的拓扑结构中居于核心地位的是Host,

任何一次USB 的数据传输都必须由Host 来发起和控制,所有的USB 外设都只能和Host 建立连接,任何两个外设之间或是两个Host 之间无法直接通信。而目前,大量的扮演Host 角色的是个人电脑PC。

因此,“如何将USB 应用到嵌入式领域?如何实现USB 点对点的通讯?”等问题,开始进入了USB 开发者的讨论议程。正是在这种新的需求之下,USB On-The-Go 应运而生。2001 年12 月,USB On-The-Go 版本协议1.0 正式发布(简写为OTG 1.0)。

              USB On-The-Go,顾名思义,是USB 应用在便携式移动设备领域中,因此,我们姑且将其翻译为“便携式USB”(或者“移动USB”),简记成USB OTG。OTG 1.0 作为USB 2.0的补充协议,基本上符合USB 2.0 规范。

但是,有所不同的是符合USB OTG 的设备完全抛开了PC,既可以作为Host,也可以作为外设,而与另一个OTG 设备直接实现点对点(Pear to Pear)通讯。因此,这类OTG 设备也被成为是双角色设备(Dual-Role Device,简称为DRD),

并能够根据接入设备的特性和数据传输过程中的情况,自动切换为Host 或是外设。例如,一个OTG 数码相机可以直接与OTG 打印机相连,打印图片;两个OTG MP3 播放器可以之间连在一起,实现音乐文件的共享需要注意的是,

USB OTG 设备保留了作为普通USB 2.0 外设的功能,可以作为外设直接连接到PC Host 上。

2 USB OTG 设备的功能

     USB OTG 定义了两种设备类型:双角色设备DRD 和单外部设备(Peripheral-OnlyDevice,简称为POD)。DRD 具备Host 和外设的两种功能,POD 基本与外设功能近似,因此,我们这里着重讨论DRD。

要成为一个USB Host,必须具有存储外设驱动程序、提供足够的USB 端口电流和A型Host 插座的能力。而其所要实现的基本功能包括3 部分:

i)管理和控制总线,包括提供USB 端口电源管理;

ii)检测外设的接入和断开,枚举(Enumerate)设备;

iii)初始化总线上所有的数据包传输等活动。

同样,USB 外设也具有特定的功能:

i)响应USB Host 的命令,执行又Host 发起的发送设备描述符、传送数据等活动;

ii)远程唤醒处于挂起(Suspend)状态的主机;

iii)提供自供电(Self-Powered)电源(如果所需电流大于总线能提供的限额,选此项)。

      DRD 具有USB Host 和外设的双重功能,但是,正因为具有了双重的角色任务,DRD又必须有切换角色等新的任务和功能,因此,我们可以用(1)式来简单的定义OTG DRD的功能:

DRD = Host + Peripheral + OtherLL(1)

由(1)式可知,完整的USB OTG DRD 还必须具有除了通常的Host 和外设之外的一些功能,当然DRD 的Host 功能是有限的,不要求完全实现PC Host 的功能,不过,这正符合了嵌入式领域中对USB 灵活性和便携性的要求:

i)作为外设,支持12Mbps 的全速模式(或者是480Mbps 的高速模式);

ii)作为Host,也支持全速模式(或者是低速和高速模式);

iii)产生目标外设列表(Targeted Peripheral List,简写为TPL);

iv)会话请求协议(Session Request Protocol,简写为SRP);

v)主机交流协议(Host Negotiation Protocol,简写为HNP);

vi)有且仅有1 个Mini-AB 插座;

vii)至少为总线提供8mA 的电流;

viii)能及时将总线活动状态通知给设备用户。

3 USB OTG 体系的软件描述

3.1 OTG 配置描述符

在OTG 系统处于枚举过程时,A 设备就会发送GetDescriptor 命令给B 设备(开始处于外设状态的设备),要求B 设备发送OTG 配置描述符。配置描述符包括3 个字节,分别是bLength、bDescriptorType 和bmAttributes。

3.2 会话请求协议(Session Request Protocol,简写为SRP)

      SRP 用于B 设备向A 设备请求建立会话和使用总线。

一般,OTG 系统中的A 设备采用的是电池供电,因为这些设备是便携式和可移动的,这就决定了,OTG 系统电源管理是非常重要的一个专题。因此,为了节省OTG 系统的电源开支,OTG 2.0 规定A 设备在没有总线活动的时候,可以关掉VBus 上的电源。这样,当一个B 设备连接到A 设备上之后,就要初始化SRP,并发送给A 设备,请求A 设备在VBus上提供电流支持,进而进行通信。OTG 中,DRD 可以作为A 设备,也可以作为B 设备,因此,DRD 必须支持初始化SRP 和响应SRP;POD 只能作B 设备,所以,只能初始化SRP。SRP 中,B 设备有两种方式可以向A 设备发送请求,要求建立SRP:一种是数据线脉冲(Data-Line Pulsing),一种是VBus 脉冲(VBus Pulsing)。具体的脉冲方法在OTG 2.0 中有详细的说明。任何一个A 设备只要求能响应一种SRP 方式,而B 设备必须能初始化两种SRP方式。这样,当B 设备先初始化一种SRP,而A 设备无法响应是,则B 设备就要用另一种SRP 方式。

3.3 主机交流协议(Host Negotiation Protocol,简写为HNP)

      HNP 用于初始B 设备与初始A 设备之间切换Host 角色。

     OTG DRD 具有Mini AB 型插座,因此,DRD 既可作为Host,也可以作为外设。而在某一个OTG 连接中,这个DRD 到底是作Host(即A 设备),还是作外设(即B 设备),则要根据接入的另一个OTG 设备来定。如果,接入的是OTG POD,那么,毫无疑问,这个DRD 肯定是作A 设备。但,如果接入的是另一个DRD,那么这两个DRD 之间,就可以HNP来随时切换Host 角色。

一次完整的HNP 流程是这样的:B 设备希望控制总线,成为Host;在A 设备发送了SetFeature 命令后,B 设备就可以来请求控制总线;A 设备挂起总线,通知B 设备可以控制总线;B 设备发送信号,断开与A 设备的连接;A 设备启动D+信号线上的上拉电阻,将D+置高;这样,A 设备就开始作为外设,放弃了总线的控制权,B 设备成为了Host;在B设备完成了对总线的控制,就需要上拉其上的D+电阻,放弃总线控制权。当然,这一系列的HNP 活动,不仅仅是通过信号线上的电平变化来实现的。电平变化只是一种标志,真正内部对总线的控制权的变化,则要通过软件来实现。

3.4 OTG 的软件结构

     OTG 的软件结构包括3 部分:

i)OTG 系统硬件驱动:包括SRP 和HNP;

ii)OTG 系统外设软件:实现标准的USB 类,来实现特定的USB 外设功能;

iii)OTG 系统Host 软件:包括Host 驱动程序、操作系统支持软件、支持外设的类库。

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

1.1、概述

      一条USB传输线分别由地线、电源线、D+和D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置)。
        USB设备可以直接和HOST通信,或者通过Hub和Host通信。一个USB系统中仅有一个USB 主机,设备包括USB功能设备和USB HUB,最多支持127个设备。物理连接指的是USB传输线。在USB 2.0系统中要求使用屏蔽双绞线。
1.2、USB HUB
        USB HUB提供了一种低成本、低复杂度的USB接口扩展方法。HUB的上行PORT面向HOST,下行PORT面向设备(HUB或功能设备)。在下行PORT上,HUB提供了设备连接检测和设备移除检测的能力,并给各下行PORT供电。HUB可以单独使能各下行PORT。不同PORT可以工作在不同的速度等级(高速/全速/低速)。
        如果USB设备通过集线器和Host通信,主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。

二、USB数据格式

        USB的重要关键字:

        端点(Endpoint):位于USB设备或主机上的一个数据缓冲区,是USB设备中可以进行数据收发的最小单元,支持单向或者双向的数据传输,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持2组端点(2 个输入,2 个输出),高速和全速设备最多支持15组端点。

        帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份是一个USB的传输动作。

        上行、下行:设备到主机为上行,主机到设备为下行。

2.1、USB数据传输方法

        数据在USB线里传送是由低位到高位发送的。

        USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在USB总线上发送一个包时,传输设备就要进行位插入操作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这些是由专门硬件处理的。

2.2、数据格式

        USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面介绍一下域、包和事务。

 

2.2.1、域
        域是USB数据最小的单位,由若干位组成(多少位由具体的域决定),域可分为七个类型:

        1、同步域(SYNC)
        所有的USB包都由SYNC开始,高速包的SYNC宽度为32bit,全速/低速包的SYNC段度为8bit。实际接收到的SYNC长度由于USB HUB的关系,可能会小于该值。八位的值固定为0000 0001,用于本地时钟与输入同步。

        2、标识域(PID)
        由四位标识符 + 四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种。USB2.0使用了十六种标识码,标识码的作用是用来说明包的属性的,标识码是和包联系在一起的,标识码分别有以下十六种:

        令牌包 :

        0x01:输出(OUT)启动一个方向为主机到设备的传输,并包含了设备地址和标号。

        0x09:输入(IN) 启动一个方向为设备到主机的传输,并包含了设备地址和标号。

        0x05:帧起始(SOF)表示一个帧的开始,并且包含了相应的帧号。

        0x0d:设置(SETUP)启动一个控制传输,用于主机对设备的初始化。

        数据包 :

        0x03:偶数据包(DATA0)。

        0x0b:奇数据包(DATA1)。

        握手包:

        0x02:确认接收到无误的数据包(ACK)。

        0x0a:无效,接收(发送)端正在忙而无法接收(发送)信息。

        0x0e:错误,端点被禁止或不支持控制管道请求。

        特殊包0x0C前导,用于启动下行端口的低速设备的数据传输。

 

        3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。

        4、端点域(ENDP),四位,由此可知一个USB设备端点数量最大为16个。

 

        5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义。

        6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度。

 

        7、校验域(CRC):对令牌包和数据包中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,CRC码的除法是模2运算,不同于10进制中的除法。

2.2.2、包
        USB数据包的格式如下:

        由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同包的域结构不同,介绍如下:         

        1、令牌包

        分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放数据的)其中输入包、输出包和设置包的格式都是一样的:

                                               SYNC + PID + ADDR + ENDP + CRC5(五位的校验码)

        帧起始包的格式:

                                               SYNC + PID + 11位FRAM + CRC5(五位的校验码)

        2、数据包

        分为DATA0包和DATA1包,当USB发送数据的时候,如果一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:

                                                        SYNC + PID + 0~1023字节 + CRC16

        3、握手包
        结构最为简单的包,格式如下:

                                                                    SYNC + PID
        握手包包括 ACK、NAK、STALL以及NYET 四种,其中 ACK 表示肯定的应答,成功的数据传输。NAK 表示否定的应答,失败的数据传输,要求重新传输。STALL表示功能错误或端点被设置了STALL属性。NYET表示尚未准备好,要求等待。

2.2.3、事务

        分别有IN、OUT和SETUP三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下:

        1、令牌包阶段:启动一个输入、输出或设置的事务。

        2、数据包阶段:按输入、输出发送相应的数据。

        3、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。

        事务的三种类型如下(以下按三个阶段来说明一个事务):

        1、 IN事务:

        令牌包阶段——主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;

        数据包阶段——设备根据情况会作出三种反应(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段)。

        1) 设备端点正常:设备往主机里面发出数据包(DATA0与DATA1交替);

        2) 设备正在忙:无法往主机发出数据包就发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续;

        3) 相应设备端点被禁止:发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。

        握手包阶段——主机正确接收到数据之后就会向设备发送ACK包。

        2、 OUT事务:

        令牌包阶段——主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;

        数据包阶段——比较简单,就是主机会往设备送数据,DATA0与DATA1交替

        握手包阶段——设备根据情况会作出三种反应

        1) 设备端点接收正确,设备给主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息;

        2) 设备正在忙,无法给主机返回ACK,就发送NAK无效包,通知主机再次发送数据;

        3) 相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。

        3、SETUT事务:

 

        令牌包阶段——主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据;

 

        数据包阶段——比较简单,就是主机往设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令,详见2.4。

        握手包阶段——设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。

 

 

2.3、标准的USB设备请求命令

        标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成)。命令共有11个,大小都是8个字节,具有相同的结构,由5个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):

                    bmRequestType(1) + bRequest(1) + wvalue(2) + wIndex(2) + wLength(2)

        各字段的意义如下:

        1、bmRequestType:D7D6D5D4D3D2D1D0

        D7=0主机到设备

            =1设备到主机;

        D6D5=00标准请求命令

            =01 类请求命令

            =10用户定义的命令    

            =11保留值

        D4D3D2D1D0=00000 接收者为设备

            =00001 接收者为设备

            =00010 接收者为端点

            =00011 接收者为其他接收者

            =其他  其他值保留

 

        2、bRequest:请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):

        0  GET_STATUS:用来返回特定接收者的状态;

        1  CLEAR_FEATURE:用来清除或禁止接收者的某些特性;

        2) 3  SET_FEATURE:用来启用或激活命令接收者的某些特性;

        5  SET_ADDRESS:用来给设备分配地址;

        6  GET_DEscriptOR:用于主机获取设备的特定描述符;

        7  SET_DEscriptOR:修改设备中有关的描述符,或者增加新的描述符;

        8  GET_CONFIGURATION:用于主机获取设备当前设备的配置值(注同上面的不同);

        9  SET_CONFIGURATION:用于主机指示设备采用的要求的配置;

        10  GET_INTERFACE:用于获取当前某个接口描述符编号;

        11  SET_INTERFACE:用于主机要求设备用某个描述符来描述接口;

        12 SYNCH_FRAME:用于设备设置和报告一个端点的同步帧;

       控制传输是USB的重心,而这11个命令是控制传输的重心,所以这11个命令是重中之重。


2.4、描述符(Descriptor)

        Descriptor是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以描述符也是十分重要的部分,标准的描述符有5种,USB为这些描述符定义了编号:

        1——设备描述符

        2——配置描述符

        3——字符描述符

        4——接口描述符

        5——端点描述符

        上面的描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。这些描述符是用一定的字段构成的,分别如下说明:

        1、设备描述符

struct _DEVICE_DEscriptOR_STRUCT

{

    BYTE bLength;          //设备描述符的字节数大小,为0x12

    BYTE bDescriptorType;  //描述符类型编号,为0x01

    WORD bcdUSB;           //USB版本号

    BYTE bDeviceClass;  //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型

                        //0x00不是在设备描述符中定义的,如HID

    BYTE bDeviceSubClass;   //usb分配的子类代码,同上,值由USB规定和分配的

    BYTE bDeviceProtocl;    //USB分配的设备协议代码,同上

    BYTE bMaxPacketSize0;   //端点0的最大包的大小

    WORD idVendor;          //厂商编号

    WORD idProduct;         //产品编号

    WORD bcdDevice;         //设备出厂编号

    BYTE iManufacturer;     //描述厂商字符串的索引

    BYTE iProduct;          //描述产品字符串的索引

    BYTE iSerialNumber;     //描述设备序列号字符串的索引

    BYTE bNumConfiguration; //可能的配置数量

}

        2、配置描述符

struct _CONFIGURATION_DEscriptOR_STRUCT

{

    BYTE bLength;          //设备描述符的字节数大小,为0x12

    BYTE bDescriptorType;  //描述符类型编号,为0x01

    WORD wTotalLength;     //配置所返回的所有数量的大小

    BYTE bNumInterface;    //此配置所支持的接口数量

    BYTE bConfigurationVale;   //Set_Configuration命令需要的参数值

    BYTE iConfiguration;       //描述该配置的字符串的索引值

    BYTE bmAttribute;          //供电模式的选择

    BYTE MaxPower;             //设备从总线提取的最大电流

}

        3、字符描述符

struct _STRING_DEscriptOR_STRUCT

{

    BYTE bLength;          //设备描述符的字节数大小,为0x12

    BYTE bDescriptorType;  //描述符类型编号,为0x01

    BYTE SomeDescriptor[36];          //UNICODE编码的字符串

}

        4、接口描述符

struct _INTERFACE_DEscriptOR_STRUCT

{

    BYTE bLength;          //设备描述符的字节数大小,为0x12

    BYTE bDescriptorType;  //描述符类型编号,为0x01

    BYTE bInterfaceNunber; //接口的编号

    BYTE bAlternateSetting;//备用的接口描述符编号

    BYTE bNumEndpoints;    //该接口使用端点数,不包括端点0

    BYTE bInterfaceClass;  //接口类型

    BYTE bInterfaceSubClass;//接口子类型

    BYTE bInterfaceProtocol;//接口所遵循的协议

    BYTE iInterface;        //描述该接口的字符串索引值

}

        5、端点描述符

struct _ENDPOIN_DEscriptOR_STRUCT

{

    BYTE bLength;          //设备描述符的字节数大小,为0x12

    BYTE bDescriptorType;  //描述符类型编号,为0x01

    BYTE bEndpointAddress; //端点地址及输入输出属性

    BYTE bmAttribute;      //端点的传输类型属性

    WORD wMaxPacketSize;   //端点收、发最大包的大小

    BYTE bInterval;        //主机查询端点的时间间隔

}

posted @ 2021-08-09 10:21  湖畔清风  阅读(2254)  评论(0编辑  收藏  举报