2 USB标准设备请求的结构

2.1 标准请求

bmRequestType 的D6~D5为00的请求,USB协议定义了11个标准请求(bRequest),其名字与相应的bRequest的值如下表:

表3.5.3是各个标准请求的结构及需要传输的数据,常用的几个请求有:GET_DESCRIPTOR、SET_ADDRESS和SET_CONFIGURATION。下面详细介绍这几个请求:

2.1.1 GET_DESCRIPTOR 请求

需要注意的是 wValue, wIndex, wLength 这三个域都是两字节的,在USB协议中规定,使用的是小段结构,即第字节在先,高字节在后。

  • wValue,的第一字节(字符)表示同一中描述类型(比如字符串描述符)中具体的某个描述符(如厂商或者产品字符),第二字节表示描述类型的编号。
  • wIndex,只在获取字符串描述符中表示语言的ID号,除此之外为0。
  • wLength,表示要求设备返回数据的字节数,设备实际返回可以比它小。

对于全速和低速模式 ,获取描述符的标准请求只有三种:获取设备、配置、字符串的描述符,另外的接口和端点描述符是跟随配置描述符一并返回的,不能单独请求返回。

2.1.2 SET_ADDRESS 请求

当设备复位后,都使用默认地址0。主机从地址0的设备获取设备描述符,一旦收到第一次设备描述符之后,主机就会发送设置地址的请求,以尽量减少设备使用公共地址0的时间。

2.1.3 SET_CONFIGURATION 请求

SET_CONFIGURATION和SET_ADDRESS请求很类似,区别是wValue的意义:SET_ADDRESS中,wValue的第一字节(低字节)表示设备的地址;SET_CONFIGURATION则为配置的值。该值与配置描述符的配置编号一致时,表示选中该配置,通常为1,因为大多数USB设备只有一种设置;若为0,则设备进入地址设置状态。

获取描述符请求是在枚举过程中用得最多的一个请求,举一个主机的例子:

0x80, 0x06, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00

它是一个请求设备描述符的标准请求,请求的数据长度64字节。

2.2 描述符类型的实现

2.2.1 设备描述符的实现

每个设备必须有且仅有一个设备描述符,结构如表3.6.1所示。

  • bLength,表示该描述符的长度,固定的,共18字节。
  • bDescriptorType,描述符的类型,取值如表3.5.5所示。
  • bcdUSB,设备使用的USB协议版本。USB1.1可以写成0x0110,小端结构:0x10,0x01;同理USB2.0可以写成0x0200,小端结构:0x00,0x02。
  • bDeviceClass,设备使用的类代码,一般为0。当为0时,bDeviceSubClass必须为0,且bDeviceProtocol也应该为0。当为0xff,表示使用自定义设备类。
  • bDeviceSubClass,设备使用的子类代码。
  • bDeviceProtocol,设备使用的协议,为0时不用类所定义的协议,为0xff时使用自定义协议。需要结合设备类和设备子类使用才有意义。
  • bMaxPackSize0,端点0的最大包长。取值可以是8、16、32、64。
  • idVender,厂商ID。由USB协会分配,不能随意使用,此外主机驱动一般根据厂商ID、产品ID已经产品序列号来安装驱动程序。
  • idProduct,产品ID。
  • iManufacturer、iProduct、iSerialNumber,相应字符串的索引值,放在wValue的第一字节。为0时,表示没有。
  • bNumConfigurations,大部分USB设备只有一个配置,即该字段值为1。

代码如下:

/* USB Standard Device Descriptor,设备描述符 */
const uint8_t Virtual_Com_Port_DeviceDescriptor[] = {
0x12, /* bLength,该描述符长度(18字节) */
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType,设备描述符为0x01 */
0x00, 0x02, /* bcdUSB = 2.00, 本设备使用的USB版本 */
0x02, /* bDeviceClass: CDC,类代码 */
0x00, /* bDeviceSubClass:子类代码 */
0x00, /* bDeviceProtocol:设备所使用的协议 */
0x40, /* bMaxPacketSize0:端点0最大包长 */
0x83, 0x04, /* idVendor = 0x0483:厂商ID */
0x40, 0x57, /* idProduct = 0x5740: 产品ID */
0x00, 0x02, /* bcdDevice = 2.00: 设备版本号 */
, /* iManufacturer: 描述厂商的字符串索引 */
, /* iProduct: 描述产品的字符串索引 */
, /* iSerialNumber: 描述序列号的字符串索引 */
0x01 /* bNumConfigurations:可能的配置数 */
};

2.2.2 配置描述符的结构

  • bmAtrributes:D7,保留必须为1。D6为供电方式,1表示设备自供电,0表示设备是总线供电的。D5为1时表示支持远程唤醒,0不支持。D4~D0,保留设为0。

2.2.3 接口描述符

2.2.4 端点描述符

  • bEndPointAddress:最高位D7为该端点的传输方向,1为主机输入(像Input的首字母),0为主机输出(像Output首字母)
  • bmAttributes:最低位D1~D0:表示传输类型,0为控制传输,1为等时传输,2为批量传输,3为中断传输。
  • 如果该端点是非等时传输,D7~D2为0。否则,D3~D2表示同步的类型:0为无同步,1为异步,2为适配,3为同步。
  •         D5~D4表示用途:0为数据端点,1为反馈端点,2为暗含反馈的数据端点,3是保留值。D7~D6,保留。
  • bInterval:对于中断端点,表示查询的帧间隔数。

2.2.5 HID描述符的结构

USB鼠标属于HID类,HID类的设备在配置描述时还需要一个HID描述符,它是一个类描述符,应该跟在接口描述符后面。

  • bLength:是该描述符的总长度,它的大小与该描述符中下级描述符的个数有关。例如只有一个下级描述符时,总长为 1+1+2+1+1+1+2=9字节。
  • bcdHID:使用USB HID1.1协议,因此为0x0110。
  • bCountryCode:美式键盘为33,即0x21。
  • bNumDescriptors:下级描述符的数量,至少为1。
  • bDescriptorType:下级描述符的类型,报告描述符的编号为0x22,物理描述符的编号为0x23。

2 USB标准请求的更多相关文章

  1. USB设备请求命令详解

    USB设备请求命令 :bmRequestType + bRequest + wValue + wIndex + wLength 编号 值  名称 (0) 0  GET_STATUS:用来返回特定接收者 ...

  2. HTTP常用标准请求头字段

    常用标准请求头字段 Accept 设置接受的内容类型 Accept: text/plain Accept-Charset 设置接受的字符编码 Accept-Charset: utf-8 Accept- ...

  3. HTTP/1.1标准请求方法和状态码

    HTTP/1.1标准自从1999年制定以来至今仍然是一个应用广泛并且通行的标准 相关文档 RFC2616:Hypertext Transfer Protocol -- HTTP/1.1 在RFC658 ...

  4. USB传输协议。——Arvin

    问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源 ...

  5. USB协议[转]_基本上涵盖了所有最基础的USB协议相关知识。

    背景: 需要使用到USB协议,我一直尝试着去强记这个流程,现在看来,其实不用.看多了,把这个过程具象出来,就牢牢记住了. 正文: 正文转自:http://fangjian0518.blog.163.c ...

  6. USB设备架构

    USB设备,分为3层:1.底层为传送和接受数据的总线接口:2.中间层处理总线和不同端点的数据传输:3.最高层由串行总线设备提供.主要研究中间层. USB设备状态,主要研究外部可见状态. 1,连接态-- ...

  7. USB描述符解析-->枚举.

    枚举可以理解为主机按不定的顺序向USB设备讨要设备信息,好给它分配资源,若枚举不成功,就放弃分配资源,免得浪费资源.一般都是使用中断传输方式通信. 常用的描述符有以下几种:01H.设备描述符  02H ...

  8. USB的八个问题和答案(转)

    http://www.amobbs.com/thread-901041-1-1.html 问题一:USB的传输线结构是如何的呢? 答案一:一条USB的传输线分别由地线.电源线.D+.D-四条线构成,D ...

  9. USB入门基础知识(转)

    源:USB入门基础知识 相关名词: 主机(Host) 设备(Device) 接口(Interface) 管道(Pipe) 管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交 ...

随机推荐

  1. linux 安装memcache

    cd /usr/local/src  #进入软件包存放目录wget http://pecl.php.net/get/memcache-2.2.6.tgz  #下载tar zxvf memcache-2 ...

  2. linux基础--目录介绍

    Windows和Linux文件系统区别 在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: 在 Lin ...

  3. dcoker镜像的分层

    镜像分层的好处:复用节省磁盘空间,相同的内容只需加载一份到内存 修改dockerfile之后,再次构建速度加快 docker优化: 1.尽可能地选择体积小的linux发行版,比如alpine 2.尽可 ...

  4. 转 MySQL乐观锁和悲观锁

    悲观锁(Pessimistic Lock) 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库 ...

  5. 微信小程序 使用wxParse解析html

    微信小程序 加载 HTML 标签:https://blog.csdn.net/zclengendary/article/details/54312030 微信小程序 使用wxParse解析html:h ...

  6. python基础之基础数据类型1

    int 整形 数字用于计算和比较 python3没有long,python2有整形和长整型 十进制二进制转换方法 bin(10进制) ==二进制 0b(二进制) int("二进制" ...

  7. 14-python基础-列表

    列表常用操作: Ubuntu下进入ipython3中定义一个列表lst=[] 输入lst.TAB ipython会提示列表能够使用的方法. 1.增加列表数据 序号 关键字/函数/方法 说明 1 列表. ...

  8. ollvm 使用——“Cannot open /dev/random”错误的解决方法

    找到 \obfuscator-llvm-4.0\lib\Transforms\Obfuscation\CryptoUtils.cpp 这个文件, 新增两个头文件 #include <window ...

  9. Javascript高级程序设计--读书笔记之理解原型对象

    先上一段代码和关系图 function Person(){} Person.prototype.name = "Nic" Person.prototype.age = 22 Per ...

  10. DQN的第一次尝试 -- 软工结对编程第一次作业

    DQN的第一次尝试 在本篇博客中将为大家形象地介绍一下我对DQN的理解,以及我和我的队友如何利用DQN进行黄金点游戏.最后我会总结一下基于我在游戏中看到的结果,得到的dqn使用的注意事项和这次游戏中我 ...