本文章主要来自《圈圈教你玩USB》的学习笔记
本章节属于控制传输的范畴,控制传输的过程如下:
主机在设置阶段,发出setup令牌包后,数据请求在DATA0中,详细说明可以看看之前的文章USB的四种传输类型-优快云博客
USB标准设备请求结构
这里只介绍USB协议定义的标准请求,既bmRequestType的D6~5位00的请求。
不同的请求对于其接收者,wValue和wIndex,其各字段的意义是不一样的。
下表是各个标准请求的结构以及数据过程需要传输的数据。其中第一列有的有多个,主要是最低5位的不同,即表示接收者不同。有的请求只能发送到设备,而有的请求可以发送到设备、接口和端点。
常用的几个请求为GET_DESCRIPTOP、SET_ADDRESS和SET_CONFIGURATION。
GET_DESCRIPTOP请求
主机通过发送获取获取描述符请求读取设备的的各种描述符。
wValue域的第一个字节(低字节)表示的是索引号,用来选择同一种描述符中具体的哪一项。第二个字节表示描述符的类型编号。各种描述符类型编号如下定义:
wIndex域只在获取字符串描述符中有用,它表示字符串的语言ID号,获取除字符串描述符的其它描述符时,wIndex的值为0。
wLength域为请求设备返回数据的字节数,设备实际返回的字节数可以比该域指定的字节数少。
设备在收到获取描述符请求后,应按照所请求的描述符类型编号,在数据过程中返回响应的描述符。
对于全速模式和低速模式,获取描述符的标准请求只有三种:获取设备描述符、获取配置描述符、获取字符串描述符。另外的接口描述符和端点描述符是跟随配置描述符一并返回的,不能单独请求返回。
SET_ADDRESS请求
设置地址请求是主机请求设备使用指定地址的请求
指定的地址就包含在wValue字段中第一个字节。(第一个字节为设备地址)
设置地址请求没有数据过程,所以wLength的值为0。wIndex也用不着,值为0。
当设备收到设置地址请求后,就直接进入状态过程,等待上位机读取0长度的状态数据包。主机成功读取到状态数据包(用ACK响应设备)后,设备将启动新的地址。
SET_CONFIGURATION请求
设置配置请求和设置地址请求很类似。区别在于wValue域的含义。第一个字节为配置的值,当该值与某配置描述符中的配置编号一致时,表示选中该配置。
该值通常为1,因为大多数USB设备只有一种配置,配置编号为1;如果该值为0,则会让设备进入设置地址状态。设备只有收到非0配置后,才会启用它的非0端点。