USB描述符

2023-05-16

枚举过程

USB设备枚举一般会经过插入、供电、初始化、分配地址,配置,获取设备描述符、获取配置描述符、获取字符串和配置设备这么几个过程。(第一次获取设备描述符就是为了获取最大包长,在设备描述符的第8字节(因此USB规定端点0的最大包长至少8字节)。在复位之后,才会真正获取完整的设备描述符)
1616513913468

枚举过程基本上就是分配地址和获取描述符的过程。那么什么是描述符呢?

 

 

描述符

描述符是USB设备用来描述自己属性及用途的,因此设备端必须实现对应的描述符。主机会在枚举过程中根据描述符去确定这是一个什么设备,安装相应的驱动。

标准的描述符有5种,USB为这些描述符定义了编号:

        0x01.设备描述符:USB设备至少有一个配置描述符,但是主机同一时间只能选择一种配置。

        0x02.配置描述符:USB配置至少有一个接口描述符。

        0x03.接口描述符:USB接口可以至少有一个端点描述符,也可以没有端点描述符。

        0x04.端点描述符

        0x05.字符串描述符

还有一些不太常用的描述符:
        0x06.限定描述符

        0x07.其它速率配置描述符

        0x08.接口功率描述符

        0x21.HID描述符

        0x22.报表描述符

USB设备描述符关系

 

设备描述符

  • bLength : 描述符大小。固定为0x12.
  • bDescriptorType : 描述符类型。固定为0x01.
  • bcdUSB : 本设备能适用于那种协议,如2.0=0200,1.1=0110等。
  • bDeviceClass : 类型代码。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的。
  • bDeviceSubClass : 子类型代码。如果bDeviceClass值是0,一定要设置为0。其它情况就跟据USB-IF组织定义的编码。
  • bDeviceProtocol : 协议代码。如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH。
  • bMaxPacketSize0 : 端点0最大包长(只有8,16,32,64有效)。
  • idVendor : 供应商ID。
  • idProduct : 产品ID。由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序。
  • bcdDevice : 设备出产编码。由厂家自行设置。
  • iManufacturer : 厂商描述符字符串索引。索引到对应的字符串描述符。 为0则表示没有。
  • iProduct : :产品描述符字符串索引。为0则表示没有。
  • iSerialNumber : 设备序列号字符串索引。为0则表示没有。
  • bNumConfigurations : 配置描述符个数。

 

配置描述符

  • bLength : 描述符大小。固定为0x09。
  • bDescriptorType : 描述符类型。固定为0x02。
  • wTotalLength : 此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。
  • bNumInterfaces : 该配置下接口描述符数量。
  • bConfigurationValue : 作为Set Configuration的一个参数选择配置值。
  • iConfiguration : 用于描述该配置字符串描述符的索引。
  • bmAttributes : 供电模式选择。Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒。
  • MaxPower : 总线供电的USB设备的最大消耗电流。以2mA为单位。

 

接口描述符

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

 

端点描述符

  • bLength : 描述符大小。固定为0x07。
  • bDescriptorType : 描述符类型。固定为0x05。
  • bEndpointAddress : 端点地址。Bit7,方向,1/0:IN/OUT。Bit6-4,保留。BIt3-0:端点号。
  • bmAttributes : 端点属性。同步传输时,bit3-2:00无同步,01异步,10适配,11同步。同步传输时,BIT5:4:00数据端点,01反馈端点,10隐式反馈数据端点,11保留。Bit1-0:00控制,01同步,02批量,03中断。

  • wMaxPacketSize : 支持的最大数据包大小。

  • bInterval : 轮训数据传送端点的时间间隔。对于批量传送和控制传送的端点忽略。对于同步传送的端点,必须为1。对于中断传送的端点,范围为1-255。

 

字符串描述符

  • bLength : 描述符大小。由整个字符串的长度加上bLength和bDescriptorType的长度决定。
  • bDescriptorType : 描述符类型。固定为0x03。
  • bString[1] : Unicode编码字符串。

 

 

在USB标准类

类代码用法描述
00h设备描述符Use class information in the interface Descriptors
01h接口描述符音频
02h设备描述符、接口描述符通讯设备,如电话,moden等等
03h接口描述符HID设备
05h接口描述符Physical
06h接口描述符Image
07h接口描述符打印机
08h接口描述符大容量存储
09h设备描述符Hub USB集线器
0Ah接口描述符CDC-Data
0Bh接口描述符Smart Card
0Dh接口描述符Content Security
0Eh接口描述符视频
0Fh接口描述符Personal Healthcare
10h接口描述符音视频设备
11h设备描述符Billboard Device Class
12h接口描述符USB Type-C Bridge Class
DCh设备描述符、接口描述符Diagnostic Device
E0h接口描述符无线控制器
EFh设备描述符、接口描述符Miscellaneous
FEh接口描述符Application Specific
FFh设备描述符、接口描述符厂商用自定义

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

USB描述符 的相关文章

  • android usb UsbDeviceConnection.bulkTransfer 返回 -1

    我正在尝试从 Android 平板电脑向 POS 打印机发送命令 我已经能够使基本连接正常工作 但现在当我尝试将数据发送到打印机时 bulkTransfer 返回 1 请帮助我了解发生了什么事 以下是从 android 站点获取的修改后的广
  • 在c++中接收USB设备插入的通知/事件/信号

    我已经寻找了一段时间 但一直无法找到这个问题的答案 我正在尝试接收特定 USB 设备的连接通知 这是我所知道的 我运行的是 linux 内核版本 3 2 我有识别 USB 设备所需的 ID 我创建了一个用于读取和写入设备的内核模块 内核模块
  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 使用“设备过滤器”解决方案时如何处理 Android 上的 USB 权限对话框事件?

    当我将 已知 USB 设备连接到 Android 手机时出现的自动权限对话框中 用户按下 确定 或 取消 时 我试图处理该事件 我正在使用 android usb host 库 可以在 Android 手机和设备之间发送和接收 此外 我使用
  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • 软件和与外部设备串行通信的波特率限制

    我使用 USB 端口作为虚拟 COM 端口运行 以使用 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信 我面临波特率限制 具体取决于我用于与设备通信的软件 MATLAB 2018a 没有问题 因为它可以设置高波特率
  • python的跨平台usb模块?

    我有兴趣在 python 中使用 USB 设备进行一些跨平台工作 关于可以执行此类操作的模块有任何提示或建议吗 我浏览了 SF 和 googlecode 但运气不佳 thanks ct PyUSB http pyusb berlios de
  • 使用 C# 向 USB 连接的 GPRS 调制解调器发送 AT 命令

    任何人都可以给我一个关于如何访问连接到 USB 端口的 GPRS 调制解调器的良好指示或指南 我应该为我的程序制作一个 USB 驱动程序以将 AT 命令发送到调制解调器吗 或者就像一个路由器 我可以使用IP地址访问它 谢谢 如果 Windo
  • Ubuntu 10.1下如何识别多个USB串口适配器

    我正在 Ubuntu 10 1 下从多个相同的 USB 串行适配器读取数据 有时 它们的 dev tty 路径会发生变化 例如 如果在启动时连接了其他 USB 设备 我需要一种通过任何此类更改重复引用同一适配器的方法 据 udevadm 称
  • 如何在 DriverKit 中将我的 dex 与 USB 设备匹配?

    我正在编写一个驱动程序包扩展 其目标是阻止 USB 设备 例如闪存驱动器 作为起点 我选择了示例项目https developer apple com documentation driverkit communicating Betwee
  • WriteFile 返回错误代码 87

    我正在开发一个写入 HID 设备的程序 但收到错误 87 WriteFile 函数参数无效 我从 Jan Axelson 的 USB Complete 获得了这些功能 所以我不确定为什么会收到错误 我用它来查找我的设备 private vo
  • 如何枚举所有HID设备? C#

    我需要枚举连接到我的 PC 的所有 HID 设备 我尝试使用这个答案 https stackoverflow com a 3331509 902424 但它枚举了 USBHub 设备 但我在那里找不到我的 HID 设备 EDIT 我很高兴知
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • 在 Linux (libusb-1.0) 上访问 USB 设备?

    我正在编写一个小程序 使用 Linux 上的 libusb 1 0 与特定 USB HID 产品 由供应商和产品 ID 标识 进行通信 现在 我必须以 root 身份运行该程序 因为 libusb 需要对 USB 设备节点的写访问权限 有没
  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次
  • iOS 中通过 USB 进行反向端口转发

    我在桌面上有一个 Web 套接字服务器 在 iPhone 设备上有一个客户端 我想使用 USB 而不是任何网络与他们通信 我已经使用 adb reverse 在 android 上实现了它 但无法找到适用于 iOS 的任何解决方案 我尝试使
  • Android 3.1 USB 主机 - BroadcastReceiver 未收到 USB_DEVICE_ATTACHED

    我经历过USB 主机的描述和示例位于developer android com http developer android com guide topics usb host html检测连接和分离的 USB 设备 如果我在清单文件中使用

随机推荐

  • linux redis常用命令

    flushall 清空redis缓存 redis cli 进入redis xff08 需要进入redis的安装目录下 xff09 get key 查找key del key 删除key
  • java DateUtils时间工具栏

    package com eeye common utils import org apache commons lang3 time DateFormatUtils import java text ParseException impor
  • unity3d:Astar寻路,A星,A*,二叉堆优化Open表

    原理视频 油管 xff1a https youtu be i0x5fj4PqP4 别人的B站翻译 xff1a https www bilibili com video BV1v44y1h7Dt spm id from 61 333 999
  • TCP/IP 、HTTP、Socket的区别与联系

    1 Socket和http的区别 http xff1a 如何封装数据 xff1b 基于TCP协议 xff0c 简单的对象访问协议 xff0c 对应于应用层 xff1b xff08 货物 xff09 tcp协议 xff1a 数据在网络中的传输
  • 【亲测一次成功】将本地代码上传到Gitee码云

    1 在Gitee码云上创建仓库 2 在本地新建一个文件夹 3 右击新建的文件夹 xff0c 使用git bush here 4 输入 git init 5 输入 git remote add origin 43 仓库地址 6 输入 git
  • keil5打开工程报错:error:not found device

    1 error not found device 解决方法 xff1a 将Project文件夹中的工程扩展名由 uvproj改为 uvprojx 原因 xff1a 前提是所有的库安装都是正常且正确的 xff0c 所以应该是如下问题 xff1
  • STM32学习笔记:IWDG_独立看门狗

    1 简介 独立看门狗就是一个12位的递减计数器 xff0c 最大值0xFFF xff1b 计数器的值从某一个值减到0时 xff0c 系统产生一个复位信号 xff08 IWDG RESET xff09 xff1b 在计数器没减到0之前 xff
  • 基于单片机避障导盲智能拐杖控制设计(毕设资料)

    本设计研究为盲人提供行走时 xff0c 遇到前方障碍物提前躲避的智能避障预警系统 以AT89S52单片机作为核心处理器 xff0c 采用超声波回波时间差测量人与物体之间的安全距离 xff0c 实现了提前预警使用者避让障碍物 xff0c 起到
  • Matlab:excel文件 转 txt文件 (只需2行代码)

    亲测有用 xff0c 只需两行代码 xff0c 将EXCEL文件 xff0c 转换成txt文件 xff1a Data 61 readtable 39 TEST xls 39 writetable Data 39 test txt 39 ex
  • 快速理解C语言——指针

    1 地址和内存 把值存在内存中 xff0c 内存就给每一个值分配一个地址 xff1a 100 104 108 112 116就是每个值分别对应的地址 xff1b 给每个内存地址起个别名 xff0c 就是 xff1a 变量 2 值和类型 如下
  • 亲测有用!完美关闭win10不断自动更新

    自从更新到win10以来 xff0c 每次开关机都会遇到win10更新的问题 试过CSDN和其他很多种方法都没有用 xff0c 最后在知乎上看到一个大神写的 用以下方法完美解决 xff0c 再没出现过自动更新的问题 如何完美解决win10自
  • 一文解决所有PCA问题——这是我看过最好的讲解PCA理论文章

    转载 xff1a http blog codinglabs org articles pca tutorial html PCA xff08 Principal Component Analysis xff09 是一种常用的数据分析方法 P
  • C语言解析http协议

    C语言解析http协议 1 关键解析函数1 1 strstr xff08 xff09 1 2 strncmp 2 代码 1 关键解析函数 1 1 strstr xff08 xff09 函数原型 xff1a span class token
  • 大小端问题

    本来我想说 xff0c Windows平台一般是小端 xff0c Linux一般是大端 xff1b 但是 实际上大小端CPU架构有关 xff0c 当然和系统也可能有关 xff0c 可以配置大小端 xff1b 对于CPU框架 xff0c AR
  • android socket通讯

    项目中要用到进程间通讯 xff0c 服务端接收应用的请求数据 xff0c 对串口进行读写操作 考虑到android的socket服务比较实用 xff0c 并且可以支持多个客户端同时连接 服务端写成一个服务 xff0c 在init rc中启动
  • LwIP之套接字接口

    套接字结构体 struct lwip sock API连接指针 struct netconn conn 前一次读剩下的数据 void lastdata 前一次读数据的偏移量 u16 t lastoffset 接收数据的次数 s16 t rc
  • Simulink之功率场效应晶体管(P-MOSFET)

    功率场效应管 xff08 P MOSFET xff09 属于电压全控型器件 xff0c 门极静态电阻极高 驱动功率小 工作频率高 热稳定性好 xff1b 但是电流容量小 耐压低 功率不易做大 xff0c 常用于中小功率开关电路 电气符号 外
  • Simulink之变压器隔离的直流-直流变换器

    半桥式隔离降压变压器 全桥式隔离降压变压器
  • 动捕系统、ROS、SIMULINK的通信

    卓翼simulink控制源码 一 路径 xff1a droneyee ws src 下的功能包的作用 1 droneyee 包含无人机主要的起飞 降落的控制程序 xff1a Publisher的程序编写 matlab udp的IP和串口号的
  • USB描述符

    枚举过程 USB设备枚举一般会经过插入 供电 初始化 分配地址 xff0c 配置 xff0c 获取设备描述符 获取配置描述符 获取字符串和配置设备这么几个过程 xff08 第一次获取设备描述符就是为了获取最大包长 xff0c 在设备描述符的