『USB3.0Cypress』USB原理(5)枚举描述符

在这里插入图片描述

前言

通用串行总线USB以其强大的功能,方便的连接广受用户使用,这些都得益于USB灵活多样的描述符。USB设备通过设备描述符,配置描述符,接口描述符,端点描述符等描述符实现设备功能。标准描述符是指一组设备描述符,包括设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符、设备限定描述符和其他速率配置描述符。这七种描述符具有类似的格式,比如说它们的第一个字段都是bLength,第二个字段都是bDescriptorType。七种描述符在使用时以bDescriptorType字段来区分。

1.标准描述符间关系

在这里插入图片描述

**设备描述符描述的是设备的整体信息,与设备本身一一对应,一个设备只能有一个设备描述符。**在主机对USB设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。USB设备灵活多变的角色转换是通过USB的配置描述符来实现的,但一个USB设备有多个配置描述符时,就表明了这个USB设备支持多角的转换,不过一次只能有一个USB配置描述符有效。当设备在接入PC时,主机端发现设备存在多配置功能时,会弹窗让用户选择一种工作状态。接口描述符一般是按设备的运行状态分类,这样设备可以在不同的接口中切换来实现设备运行状态的切换,如在设备在运行状态下使用正常的接口描述符,在停止状态下使用该接口描述符的备用接口描述符。一个接口是一种USB逻辑,即一个接口对应一个USB设备驱动。例如usb声卡播放和录音两个功能属于不同的接口,对应不同的设备驱动。对于端点描述符来说,每个设备至少支持控制端点0,应该支持三类端点:控制端点、输入端点和输出端点。端点分为了控制端点(热插拔配置)bulk块传输端点(大量数据)同步端点(实时数据流)中断端点。端点对应的是每一个物理通道(pipes)。

2.标准描述符字段

描述符中字段都有一个小写字母表示的前缀,它们所表示的意思如下:

描述符字段含义
b一个字节,=8bits
w一个字,=16bits
bm按位寻址
bcd用BCD码表示
i索引值
id标识码

1)设备描述符

共14个字段,总长度18字节,下图为赛普拉斯描述符文件。
在这里插入图片描述

  • bLength:描述符长度0x12(18字节),16进制描述符长度表示。
  • bDescriptorType:类型为设备描述符 该宏定义等于0x01。
  • bcdUSB:USB规范版本号USB3.0,USB2.0,小端模式表示为0x00,0x02 。
  • bDeviceClass:类型代码(由USB指定)。该设备所属的标准设备类,USB协议中对常见的设备进行了分类。当它的值是0时, 表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的。
  • bDeviceSubClass:子类型代码(由USB分配).如果bDeviceClass值是0,一定要设置为0.其它情况就跟据USB-IF组织定义的编码。
  • bDeviceProtocol:协议代码 如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。
  • bMaxPacketSize0:端点0支持的最大数据包长度,0x09代表2的9次方为512B。这个0x09在USB3的规格书中,而且不支持其它的包大小,所以从这设备描述符的bMaxPacketSize0的值就可以判断出是否是超高速设备。
  • idVendor:供应商ID(由USB分配)。
  • idProduct : 产品ID(由厂商分配),由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序。
  • bcdDevice : 设备出产编码,由厂家自行设置。
  • iManufacturer:厂商描述符字符串索引,索引到对应的字符串描述符, 为0则表示没有。
  • iProduct:产品描述符字符串索引,同上。
  • iSerialNumber:设备序列号字符串索引,同上。
  • bNumConfigurations : 可能的配置数,指配置字符串的个数。

2)配置描述符

每个USB设备都有默认的配置描述符,支持至少一个接口,每个配置描述符如下:
在这里插入图片描述

  • bLength :描述符大小.固定为0x09。
  • bDescriptorType : 配置描述符类型.固定为0x02。
  • wTotalLength :返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。
  • bNumInterfaces :用于表示配置所支持的接口数。一般来说,USB设备的接口至少有一个,因此其最小值为1。
  • bConfigurationValue :用于表示USB设备的配置值。作为Set Configuration的一个参数选择配置值。
  • iConfiguration :用于描述该配置字符串描述符的索引,具体字符串的内容在后面字符串描述符中定义。如果没有配置字符串,可以置为0。
  • bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒。
  • MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位

3)接口描述符

接口是端点的集合,负责完成USB的特定功能,例如数据的输入输出。接口描述符用于描述一个接口,包含了接口的特性,如端点个数,所属设备类和子类等。它有9个字段,共9字节。
在这里插入图片描述

  • bLength : 描述符大小.固定为0x09.
  • bDescriptorType : 接口描述符类型.固定为0x04.
  • bInterfaceNumber : 该接口的编号.
  • bAlternateSetting : 用于为上一个字段选择可供替换的位置.即备用的接口描述符标号.
  • bNumEndpoint : 使用的端点数目.端点0除外.
  • bInterfaceClass : 类型代码(由USB分配).
  • bInterfaceSubClass : 子类型代码(由USB分配).
  • bInterfaceProtocol : 协议代码(由USB分配).
  • iInterface : 接口字符串描述符的索引

4)端点描述符

端点描述符用于指出USB端点的特性,包括其所支持的传输类型、传输方向等信息。USB中规定,端点0没有端点描述符,其余端点必须包含端点描述符。端点描述符由6个字段组成,共7个字节。
在这里插入图片描述

  • bLength : 描述符大小.固定为0x07.
  • bDescriptorType : 接口描述符类型.固定为0x05.
  • bEndpointType : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号.
    当为同步传输时,bEndpointType的bit3-2的值不同代表的含义不同:
    00:无同步
    01:异步
    10:适配
    11:同步
    BIT5:4
    00: 表示数据端点
    01:表示反馈端点Feedback endpoint
    10:表示隐式反馈数据端点 Implicit feedback Data endpoint
    11:保留
  • bmAttributes : 端点属性.Bit7-2,保留(同步有定义).BIt1-0:00控制,01同步,02批量,03中断。
  • wMaxPacketSize : 本端点接收或发送的最大信息包大小.USB3.0时:wMaxPacketSize表示包的大小。对于bulk为1024,而对于同步传输,可以为0~1024或 1024。
  • bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略。对于同步传送的端点,取值范围是1-16,对于中断传送的端点,范围为1-255,后续说明。(同步传输实现时详细说明)

5)设备限定描述符

设备限定描述符用在当一个设备能够工作在不同的速度下时,会获取设备限定描述符。同时支持全速与高速的设备,必须有一个Device Qualifier Descriptor。当设备转换速度的时候,设备描述符中的某些字段可能改变。Device Qualifier Descriptor描述符储存当前不适用的速度的字段数值。设备描述符与device_qualifier描述符中的字段数值,视所选择的速度来做交替。比如有一个高速的设备和一个全速的设备,他们的 VID、 PID 以及设备版本号都一样,先接入高速的设备,系统会“记住”他的速度是高速的。拔掉后再接入一个全速的设备,由于他们的标识都一样,系统会认为这是个相同的设备工作在不同的速度下,会请求设备限定描述符。 这里其实虽然用了两个不同速度的设备来举例,但是在主机端看来,这和一个设备工作在两种速率是一样的。 反过来如果先接入全速再接入高速,也会这样。由9个字段组成,长度固定为10个字节。USB设备不一定会支持设备限定描述符,所以如果USB主机获取设备限定描述符,USB设备回复STALL表示设备不支持该描述符。这种控制传输的失败并不影响设备的正常枚举和使用。
在这里插入图片描述

  • bLength :描述符大小.固定为0x0A。
  • bDescriptorType : 配置描述符类型.固定为0x06。
  • bcdUSB :USB规范版本号(例如, 0200h V2.00).
  • bDeviceClass :类别码.
  • bDeviceSubclass :子类别码.
  • bDeviceProtocol :协议码
  • bMaxPacketSize (0):端点0支持的最大数据包大小
  • bNumConfigurations :可能配置的数目

6)字符串描述符

为了提供比较友好的设备标识,USB规范中定义了字符串描述符。字段个字节个数不定。
在这里插入图片描述

  • bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定.
  • bDescriptorType : 接口描述符类型.固定为0x03.
  • bString[1] : Unicode编码字符串.UNICODE采用两个字节字节表示一个字符,如果是英语字符的话,那就很简单了,直接在ASCII码前面补上一个为0x00的字节数据就组成UNICODE编码了,如果是其它语言的话,网上有很多的UNICODE编码转换工具,可以直接拿来使用就行了。

7)语言ID描述符

字符串描述符使用UNICODE编码,可以支持多种语言,所以字符串描述符首先要指定语言ID,简体中文的ID值为0x0804,美式英语ID值为0x0409。一共三个字段,四个字节。
在这里插入图片描述

  • bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定。
  • bDescriptorType : 接口描述符类型.固定为0x03。
  • wIndex :语言ID。

8)其它速率配置描述符

其它速率配置描述符与设备限定描述符(Device Qualifier Descriptor)配合使用, 当工作在其他速度下时使用, 除了描述符类型, 其他字段含义格式与配置描述符完全一致。(不常用)

3.其他描述符

1)BOS描述符

USB3.2规范新增加了一个灵活且可扩展的框架,用于描述设备级功能特性。
BOS(Binary Device Object Store)是与配置描述符类似的一个根描述符。使用该描述符,可以访问一系列相关描述符的基本描述符。和配置描述符一样,主机通过读取BOS描述符的wTotalLength字段中获取该BOS描述符的总大小,然后根据总大小读取设备功能的整个BOS描述符集。所以BOS描述符的获取是分两次获取的,第一次只取BOS描述符的头部(包括wTotalLength字段),然后再根据wTotalLength字段再次获取BOS描述符的全部内容。
在这里插入图片描述

  • bLength :描述符的大小,固长为5
  • bDescriptorType :BOS描述符类型,固定为15
  • wTotalLength :BOS描述符的总大小,以字节为单位
  • bNumDeviceCaps :BOS描述符中独立设备功能特性描述符的数量
    /* USB 2.0 extension */
  • bLength :本描述符的长度,这里固定为7字节。
  • bDescriptorType :描述符的类型,固这为16.
  • bDevCapabilityType :特性描述符类型,这里为0x02H,表示USB 2.0 EXTENSION
  • bmAttributes :4字节,这里为位图标识。
    BIT0:保留不用,值设为0。
    BIT1:LPM,此位值为1表示此设备支持链路电源管理协议。USB3.2增强型超高速设备应将该位设置为1。
    BIT[31:2],保留不用,值设为0。
    /* SuperSpeed device capability */
  • bLength :本描述符的长度,这里固定为10字节。
  • bDescriptorType :描述符的类型,固这为16
  • bDevCapabilityType :特性描述符类型,这里为0x02H,表示USB 3.0 SUPERSPEED_USB
  • bmAttributes :1字节,这里为位图标识。
    BIT0:保留不用,值设为0。
    BIT1:LPM,此位值为1表示此设备具有生成延迟容忍消息的能力(Latency Tolerance Messages)。
    BIT[7:2],保留不用,值设为0。
  • wSpeedsSupported :2字节,位图信息。
    BIT0置1,表示设备支持低速USB操作。
    BIT1置1,表示设备支持全速USB操作。
    BIT2置1,表示设备支持高速USB操作。
    BIT3置1,表示设备支持以GEN1速度运行。
  • bFunctionalitySupport :设备支持的所有功能对用户可用的最低速度。例如,如果设备支持其所有功能当以全速或更高速度连接时,它将此值设置为1。
  • bU1DevExitLat :U1设备退出延迟。** (不太懂)
  • wU2DevExitLat : U2设备退出延迟
    描述符的DEVICE CAPABILITY 子类型如下(均需要二次获取)
    在这里插入图片描述

2)超高速端点伙伴描述符

超高速端点伙伴描述符 (SuperSpeed Endpoint Companion Descriptor)用于支持增强型超高速功能(Enhanced SuperSpeed capabilities)。接口中描述的每个端点后面都有一个超高速端点伙伴描述符 (SuperSpeed Endpoint Companion Descriptor)。超高速端点伙伴描述符 (SuperSpeed Endpoint Companion Descriptor)总是在配置信息中,跟随在与其相关联的端点描述符(Endpoint Descriptor)之后。它有5个字段,6个字节。
在这里插入图片描述

  • bLength 以字节为单位的描述符大小;
  • bDescriptorType 超高速端点伙伴描述符类型,为0x30。
  • bMaxBurst 端点突发的数据包最大数量。端点在一次突发中可以发送或接收的数据包的最大数量。bMaxBurst的值等于这个突发数据包最大数量减1。有效值为0到15。值为0表示端点每次突发只能1个包,而15表示端点每次突发最多可以16个包(与固件程序中的端点配置burstLen一致,值为burstLen-1)。对于控制端点(control endpoints),这个字段应设置为0。
  • bmAttributes 端点的属性。
    如果这是个批量端点:4:0 MaxStreams。 这个端点支持的流的最大数量。有效值是从 0 到 16,其中值为 0 表示端点没有定义流。对于值 1 至 16,所支持的流等于2^MaxStream。7:5 保留。这些位是保留,并应设置为零。
    如果这是个控制或中断端点:7:0 保留。这些位是保留,并应设置为零。
    如果这是一个等时端点(isochronous endpoint),用于确定服务间隔(service interval)中的最大数据包数。Bits 1…0为 Mult值,其余保留。如果Bits 7 字段的值为0,那么这个Mult(其实是与固件程序中的端点配置isoPck一致,值为isoPck-1)值和bMaxBurst值将一起确定这个端点支持的服务间隔(service interval)内的最大数据包(指的是1024最大负载)数量。最大数据包数 = (bMaxBurst + 1) x (Mult + 1)Mult值的有效值为0到2。如果bMaxBurst字段设置为零,则该字段应设置为零。因此,(同步传输)允许的最大数据包数 = (bMaxBurst + 1) x (Mult + 1) = (15 + 1) × (2 + 1) = 48。当wMaxPacketSize = 1024时,吞吐量为每个服务间隔49152B,就是最大48KB。
      如果每个服务间隔(service interval)传输超过48 KB的SuperSpeedPlus端点使用规范(USB 3.1及以上)中超高速加等时端点伙伴描述符(SuperSpeedPlus Isochronous Endpoint Companion Descriptor)来指定每个服务间隔的最大数据包数。
      在USB3.0中,该字段不受Bits 7 字段的影响。因为Bits 7 字段保留,被设置为0。Bits 6…2保留,这些bits都要设置为0。Bits 7 即SSP ISO Companion(SuperSpeedPlus Isochronous Endpoint Companion)。这个字段用于确认是否使用超高速加等时端点伙伴描述符(SuperSpeedPlus Isochronous Endpoint Companion Descriptor)。如果这个字段被设置为1,那么超高速加等时端点伙伴描述符(SuperSpeedPlus Isochronous Endpoint Companion Descriptor)就应该跟随在该描述符之后出现,并且Bits 1…0的Mult字段无效。实际的Mult应该确定如下:dwBytesPerInterval/bMaxBurst/wMaxPacketSize向上取整到最近的整数值。该字段在USB 3.1中开始被定义,在USB 3.0协议中该字段保留,被设置为0。
  • wBytesPerInterval 端点在每个服务间隔(service interval (SI))中将要传输的总字节数。(实际配置0x00,0xB4 //45KB)该字段只对周期性端点有效,即只对中断(interrupt)和等时(isochronous)端点有效。对于控制(control)和批量(bulk)端点,该字段未使用,被保留的,必须将其设置为零。如果bmAttributes字段中SSP ISO Companion位的值设置为1(USB3.1),那么这个字段的值应被设置为1,并且这个端点的将要传输的总字节数,应该通过超高速加等时端点伙伴描述符(SuperSpeedPlus Isochronous Endpoint Companion Descriptor)来上报。

4.小结

1.除以上提到的描述符之外,还有接口关联描述符、调试描述符等,后续如果有机会做应用时用到会细讲;
2.当USB设备与主机连线,并且从设备上电之后,USB主机检测到从设备接入之后,进行一连串的操作以期待得知设备的信息。这其中包括了对设备的枚举操作,枚举操作就是主设备发出标准请求,从设备响应信息,对响应的信息进行必要规范就是描述符。(而利用这个请求的机制,自己设计自定义的vendor请求,在固件程序中进行处理,处理的响应过程即为实现控制传输的过程。)
3.涉及到原理的地方,后续我会结合实际实现过程再次介绍。

5.传送门

END

🔈文章原创,首发于CSDN论坛。
🔈欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🔈欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Cypress USB芯片是一种高性能的USB解决方案。它由美国半导体公司Cypress Semiconductor Corporation开发和生产。 Cypress USB芯片具有可靠性高、性能出色、应用广泛等特点。它能够实现高速数据传输和稳定连接,支持USB 2.0、USB 3.0USB 3.1等多种协议,满足不同设备的需求。 Cypress USB芯片在各种应用中被广泛使用。它们可以用于个人电脑、平板电脑、手机、摄像头、外部存储设备等各种USB设备中。此外,由于Cypress USB芯片可编程性强,也可以用于一些特定领域的应用,例如工业自动化和医疗设备等。 Cypress USB芯片系列包括FX2LP、FX3、EZ-USB FX3S、EZ-USB HX3等。FX2LP是一款高集成度的USB控制器,适合低速和全速USB应用。FX2LP具有灵活的配置和丰富的接口选择,可与各种外围设备进行高效通信。 FX3是一款超高速的USB 3.0控制器,支持5Gbps的数据传输速率。它还具有片上RAM和集成的ARM处理器,可通过固件进行灵活配置。FX3适用于对数据传输速度有较高要求的应用,如高清视频采集和数据存储等。 EZ-USB FX3S是FX3的低功耗版本,适用于对功耗要求较高的应用场景。EZ-USB HX3是一款USB集线器控制器,可一对多地进行USB连接,适用于需要连接多个USB设备的应用。 总的来说,Cypress USB芯片是一种可靠、高性能的USB解决方案,广泛应用于各种USB设备和特定领域的应用中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑾芳玉洁错过的烟火

原创不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值