热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

USB2.0协议学习笔记各种描述符

 USB设备描述符字段名长 度(字节) 地址偏移含      义bLenth  1 0 描述符长度bDescriptorType  1 1描述符类型(这里为1)bcdUSB  2 

 USB设备描述符































































































字段名长  度(字节) 地址偏移含           义
bLenth  1 0 描述符长度
bDescriptorType  1 1描述符类型 (这里为 1)
bcdUSB  2 2USB规范版本号(BCD码) 
bDeviceClass  1 4类代码 
bDeviceSubClass  1 5子类代码 
bDeviceProtocol 1 6协议代码 
bMaxPackSize0  1 7端点0最大支持数据包长度 
idVendor  2 9供应商ID 
idProduct  2 11产品ID 
bcdDevice  2 13设备版本号(BCD码) 
iManufacturer  1 14供应商字符串描述索引 
iProduct  1 15产品字符描述字符串索引 
iSerialNumber  1 16产品序列好描述符索引 
bNumConfigurations  1 17所支持的配置数 

bLenth :该描述符的长度,单位字节一般USB设备描述符都是固定的18字节即0x12;

bDescriptorType :描述符种类代码。USB设备描述符为0x01;

bcdUSB :USB协议版本,采用BCD编码如2.0就是0x0200,但是USB是小端结构,因此实际就是 【0x00 ,0x20】

bDeviceClass: 设备类代码,大多数是0而在接口描述符中的bInterfaceClass中指定该接口实现的功能,注意的是当bDeviceClass为0时,bDeviceSubClass也必须为0;

bDeviceSubClass :配合bDeviceClass代码决定,USB标准定义。

bDeviceProtocol:设备所使用类的协议,如果没有定义类就为0 ,字段为0xFF表示使用自定义协议

bMaxPackSize0 :端点0的最大包长,最小是8,因为枚举过程,第一次获取设备描述符只会读取一次,因此需要在这个包中包含USB设备描述符的长度

idVendor:厂商ID VID,需要交保护费申请。

idProduct :产品ID PID由厂商自己定义。通常主机会根据VID和PID来加载本地或源的驱动程序。

bcdDevice :设备版本号,也采用BCD码,同理USB协议版本号。

iSerialNumber :设备序列号字符串索引值。

bNumConfigurations :设备有多少种配置,大部分USB设备就只有一个配置

 

USB配置描述符

需要注意的是在有些时候,配置描述符中会包含接口描述符,特殊类描述符,端点描述符等信息,并在主机枚举请求设备配置描述符时一起返回给主机,不能单独返回给主机。



























































字段名 长  度 (字 节) 地址偏移量     含义
bLenth 10配置描述符长度
bDescriptorType11配置描述符类型
wTotalLength22配置信息总长度
bNumInterfaces14配置接口数
bConfigurationValue15配置值
iConfiguration16字符串描述符索引值
bmAttributes17配置特性
bMaxPower18最大电流(2mA为单位)

 

bLenth :该描述符长度

bDescriptorType:描述符类型,配置描述符为0x02

wTotalLength:表示整个配置描述符的总长度,包括配置描述符,接口描述符,类特殊描述符和端点描述符。

bNumInterfaces:配置支持的接口数

bConfigurationValue:每个配置都有一个标识值。

iConfiguration:配置描述符索引。

bmAttributes:描述特性 D7保留,D6辨识供电方式,为1表示自供电的,否则是总线供电,D5标识是否支持远程唤醒(1),D4-D0保留。

bMaxPower:总线供电时的最大电流,如值为100则最大电流为200mA。

 

USB接口描述符

































































 字 段 名  长 度 (字节) 地址偏移    含  义   
bLenth10描述符的长度
bDescriptorType11描述符的类型
bInterfaceNumber12接口号
bAlterateSetting13可替换设置值
bNumEndpoint14端点0以外的端点数
bInterfaceClass15类代码
bInterfaceSubClass16子类代码
bInterfaceProtocol17协议代码
iInterface18字符串描述符索引值

bLenth: 描述符的长度。

bDescriptorType: 描述符的类型(接口描述符为4)

bInterfaceNumber:  表示该接口的编号,用在配置有多个接口,每个接口有唯一放入编号,从0 开始编号。

bAlterateSetting:接口的备用编号,规则同上。一般不用

bNumEndpoint:该接口使用的端点数,不包括端点0。即如果为0 就只有控制端点

bInterfaceClass:接口使用的类

bInterfaceSubClass:接口使用的子类

bInterfaceProtocol:接口使用的协议。三个一起定义了设备的功能,鼠标键盘就只需要改协议部分就可以。其他两个都是HID类

iInterface:接口字符串描述符的索引值。

 

USB端点描述符








































域 大小(字节)偏移
bLenth10
bDescriptorType11
bEndpointAddress12
bmAttributes13
wMaxPackSize24
bInterval16

bLenth: 该描述符的长度(字节)

bDescriptorType: 该描述符的类型(0x05)

bEndpointAddress:端点的地址,D7表示端点的传输方向,为1则为输入,为0则为输出,D3-D0为端点号,其他位没有用。

bmAttributes:一个字节的属性描述字节,D1~D0表示端点传输类型,0 为控制传输,1为等时传输,2为批量传输,3为中断传输。如果为等时传输,D3-D2表示等时传输的类型,0表示无同步,1为异步,2为适配,3为同步;D5-D4辨识用途,0为数据端点,1为反馈端点,2为暗反馈端点,3保留;D7-D6保留。但是如果不是同步传输则只用到D1-D0其他位全部保留。

wMaxPackSize:该端点支持的最大数据长度,对于低速和全速设备而言,D10-D0表示数据包最大长,其他位未用,对于高速设备D12-D11表示每个帧的附件传送次数,具体参考USB标准协议。

bInterval:表示该端点的查询时间,对于中断传输表示查询的帧间隔数;对于其他传输方式参考USB标准协议。

 

 类特殊描述符

有些设备还需要有类特殊描述符,这里拿HID设备举例,HID设备的特殊描述符如下







































































大小偏移说明
bLenth10描述符长
bDescriptorType11描述符类型
bcdHID22HID 协议版本
bCountryCode14国家代码
bNumDescriptors15下级描述符数量
bDescriptorType16下级描述符类型
bDescriptorLength27下级描述符长度
bDescriptorType19下级描述符的类型(可选)
wDescriptorLength210下级描述符的长度(可选)
............

 

类比前面描述符的作用这里只需要记一下一下几个字段的意义:

bcdHID:为 HID设备的版本,用BCD码表示,两个字节,如下表示版本为1.10 

bCountryCode:  国家代码(这个用在特殊情况下 比如键盘,美式键盘等)。

bNumDescriptors:下级描述符的数量,在HID设备中至少有一个是报告描述符。

bDescriptorType:HID报告描述符为0x22.

bDescriptorLength:对应描述符的大小

因为下级描述符至少有一个因此,HID类描述至少是10个字节,底下就是一个HID描述符的例子。

 

 

 

0x09, /* bLength: HID Descriptor size */
HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
0x10, /* bcdHID: HID Class Spec release number */
0x01,
0x00, /* bCountryCode: Hardware target country */
0x01, /* bNumDescriptors: Number of HID class descriptors to follow */
0x22, /* bDescriptorType */
CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
0x00,

 

看了这么多,现在我对USB协议的理解是这样的:USB设备可以理解为一个类,描述符就是这个类的属性,而枚举过程就是host主动请求调用,获取属性的方法,从而知道这个类的属性,其余在主机和设备数据交换过程的处理细节就是设备类的方法,我们实现一个USB设备就是在定义设备属性和定义方法接口的过程,只是定义属性需要了解到以上USB标准中的这些规则(profile),同时枚举过程的一些操作就是必须要实现的接口,其余的部分就要看我们的设备,设计出来支持的操作有哪些,选择的实现了,好了暂时就这些,后面还有一部分概念需要学习,待续。。。

2019-06-02 11:39:57


推荐阅读
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
晴天逍遥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有