USB设备请求种类
- 格式:xlsx
- 大小:16.50 KB
- 文档页数:1
usb标准请求命令USB标准请求命令。
USB标准请求命令(Standard Request)是USB设备与主机之间进行通信的重要方式之一。
在USB通信协议中,设备可以通过发送请求命令向主机请求特定的操作,比如获取设备描述信息、设置设备参数等。
本文将对USB标准请求命令进行详细介绍,包括其格式、常见的请求类型以及具体的应用场景。
USB标准请求命令的格式。
USB标准请求命令由8个字节组成,其中包括以下几个字段:1. bmRequestType:请求类型字段,占据1个字节。
该字段包括以下几个部分:D7,数据传输方向,0表示主机到设备,1表示设备到主机。
D6~D5,请求类型,00表示标准请求,01表示类请求,10表示厂商请求。
D4~D0,接口号,用于指定设备的接口。
2. bRequest,请求码字段,占据1个字节。
该字段用于指定具体的请求操作,比如获取设备描述信息、设置设备地址等。
3. wValue,值字段,占据2个字节。
该字段用于传递请求操作的参数,具体含义由请求码决定。
4. wIndex,索引字段,占据2个字节。
该字段用于指定操作对象的索引,比如接口号、端点号等。
5. wLength,长度字段,占据2个字节。
该字段用于指定数据传输的长度。
常见的请求类型。
USB标准请求命令中,常见的请求类型包括以下几种:1. GET_DESCRIPTOR,获取设备描述信息。
设备可以通过该请求向主机获取设备的描述信息,比如设备的类别、厂商信息、产品信息等。
2. SET_ADDRESS,设置设备地址。
在设备初始化阶段,设备需要通过该请求向主机申请一个地址,以便主机能够识别该设备。
3. SET_CONFIGURATION,设置设备配置。
设备可以通过该请求通知主机其支持的配置,并请求主机进行配置。
4. GET_STATUS,获取设备状态。
设备可以通过该请求向主机获取设备的状态信息,比如连接状态、工作状态等。
5. SET_INTERFACE,设置设备接口。
一.标准设备请求标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成)。
标准USB设备请求命令共有11个,大小都是8个字节,具有相同的结构,由5 个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):bmRequestType(1)+bRequest(1)+wvalue(2)+wIndex(2)+wLength(2)各字段的意义如下:1、bmRequestType:D7D6D5D4D3D2D1D0D7=0主机到设备=1设备到主机;D6D5=00标准请求命令=01 类请求命令=10用户定义的命令=11保留值D4D3D2D1D0=00000 接收者为设备=00001 接收者为设备=00010 接收者为端点=00011 接收者为其他接收者=其他其他值保留2、bRequest:请求命令代码,在标准的USB命令中,每一个命令都定义了编号,编号的值就为字段的值,编号与命令名称如下(要注意这里的命令代码要与其他字段结合使用,可以说命令代码是标准请求命令代码的核心,正是因为这些命令代码而决定了11个USB标准请求命令):1.获取状态Get Status (00H)A:[To Device]获取设备的状态:*.位0:自供电(0表示总线供电;1表示自供电).*.位1:远程唤醒(0表示不支持远程唤醒;1表示远程唤醒).*.位2~15:保留.*.一般选择总线供电,不支持远程唤醒,所以返回数据就是0x0000.B:[To Interface]获取接口的状态:*.接口状态的16位字节全部保留,所以返回数据就是0x0000.C:[To Endpoint]获取端点的状态:*.位0:Halt(0表示端点允许;1表示端点禁止).*.位1~15:保留(复位为0).2.清除特性Clear Feature (01H)A:[To Device]清除设备的远程唤醒功能,并返回一个空包.B:[To Endpoint]解禁端点.3.设置特性Set Feature (03H)A:[To Device]设置设备的远程唤醒功能,并返回一个空包.B:[To Endpoint]禁止端点.4.设置地址Set Address (05H)A:设置设备地址.5.获取描述符Get Descriptor (06H)A:[To Device]获取设备描述符:*.描述当前USB协议的版本号.设备端点0的FIFO大小.USB设备的ID号等. B:[To Configuration]获取配置描述符:*.描述USB设备接口个数及是否有自供电能力等.C:[To Interface]获取接口描述符:*.描述端点0以外的物理端点个数等信息.D:[To Endpoint]获取端点描述符:*.描述端点0各端点的传输类型和最大信息包大小和端点的传输方向(IN/OUT).6.设置描述符(可选,无法更新) Set Descriptor (07H)7.获取配置信息Get Configuration (08H)8.设置配置Set Configuration (09H)A:[To Configuration]设置配置描述符.B:[To Interface]设置接口描述符.C:[To Endpoint]设置端点描述符.9.获取接口信息Get Interface (0AH)10.设置接口Set Interface (0BH)11.SYNCH_FRAME(0CH)用于设备设置和报告一个端点的同步帧.标准的USB请求命令中的DescriptorDescriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。
USB HID 类设备属于人机交互操作的设备,是一个比较大的类,用于控制计算机操作的某些方面,如USB 鼠标、USB 键盘、USB 游戏操作杆、USB 触摸板、USB 轨迹球、电话拨号设备、VCR 遥控等等设备。
另外,使用HID 设备的一个好处就是操作系统自带了HID 类的驱动程序,用户无需开发很麻烦的驱动程序,只有直接使用API 调用即可完成通信,所有很多简单的USB 设备喜欢枚举成HID 设备,这样就可以不用安装驱动而直接使用。
1、HID 设备描述符当插入USB 设备后,主机会向设备请求各种描述符来识别设备。
为了把一个设备识别为HID 类,设备在定义描述符的时候必须遵守HID 规范。
HID 设备的描述符除了 5 个USB 的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符)外,还包括 3 个HID 设备类特定描述符:HID 描述符、报告描述符、物理描述符。
HID 描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID 描述符。
设备和主机的通信是通过报告的形式来实现的。
而物理描述符不是必需的。
5 个标准描述符中与HID 设备有关的部分有:设备描述符中bDeviceClass 、bDeviceSubClass 和bDeviceProtocol 三个字段的值必须为0。
接口描述符中bInterfaceClass 的值必须为0x03 ,bInterfaceSubClass 的值为0 或1,为1 表示HID 设备是一个启动设备(Boot Device ,一般对PC 机而言才有意义,意思是BIOS 启动时能识别并使用您的HID 设备,且只有标准鼠标或键盘类设备才能成为Boot Device 。
如果为0 则只有在操作系统启动后才能识别并使用您的HID 设备)。
HID 接口描述符中bInterfaceProtocol 的含义bInterfaceProtocol 的取值含NO1键2鼠3~255保1.1 HID 描述符HID 描述符关联于接口描述符,因而如果一个设备只有一个接口描述符,则无论它有几个端点描述符,HID 设备只有一个HID 描述符。
USB 2.0 规范USB体系简介USB是一种支持热插拔的高速串行传输总线,它使用差分信号来传输数据,最高速度可达480Mb/S。
USB支持“总线供电”和“自供电”两种供电模式。
在总线供电模式下,设备最多可以获得500mA的电流。
USB2.0 被设计成为向下兼容的模式,当有全速(USB 1.1)或者低速(USB 1.0)设备连接到高速(USB 2.0)主机时,主机可以通过分离传输来支持它们。
一条USB总线上,可达到的最高传输速度等级由该总线上最慢的“设备”决定,该设备包括主机、HUB以及USB功能设备。
USB体系包括“主机”、“设备”以及“物理连接”三个部分。
其中主机是一个提供USB 接口及接口管理能力的硬件、软件及固件的复合体,可以是PC,也可以是OTG设备。
一个USB系统中仅有一个USB主机;设备包括USB功能设备和USB HUB,最多支持127个设备;物理连接即指的是USB的传输线。
在USB 2.0系统中,要求使用屏蔽的双绞线。
一个USB HOST最多可以同时支持128个地址,地址0作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST最多可以同时支持127个地址,如果一个设备只占用一个地址,那么可最多支持127个USB设备。
在实际的USB体系中,如果要连接127个USB 设备,必须要使用USB HUB,而USB HUB也是需要占用地址的,所以实际可支持的USB功能设备的数量将小于127。
USB体系采用分层的星型拓扑来连接所有USB设备,如下图所示:以HOST-ROOT HUB为起点,最多支持7层(Tier),也就是说任何一个USB系统中最多可以允许5个USB HUB级联。
一个复合设备(Compound Device)将同时占据两层或更多的层。
ROOT HUB是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。
ROOT HUB不但实现了普通USB HUB的功能,还包括其他一些功能,具体在增强型主机控制器的规范中有详细的介绍。
USB定义了4中传输类型控制传输:可靠的、非周期的、由主机软件发起的请求或者回应的传输,通常用于命令事物和状态事物。
同步传输:在主机与设备之间的周期性的、连续的通信,一般用于传输与时间相关的信息。
这种类型保留了将时间概念包含于数据总的能力。
但这并不意味着传输这样的数据的时间总是很重要,基传输并不一定很紧急。
中断传输:小规模数据的、低速的、固定延迟的传输。
批量传输:非周期的、打包的、可靠地传输。
一般用于传输那些可以利用任何带宽,以及在没有可用带宽时,可以容忍等待的数据。
控制传输:控制传输允许访问一个设备的不同部分。
控制传输用于支持在客户软件和他的应用之间关于设置信息、命令信息、状态信息的传输。
控制传输由以下几个事物组成:a.建立联系,把请求信息从主机传到他的应用设备;b.零个或多个数据传输事物,按照a事物中致命的方向传输数据;c.状态信息回传,将状态信息从应用设备传到主机。
Setup包的数据格式属于一个命令集,这个集合能保证主机和设备之间正常通信。
这个格式允许一些销售商对设备命令进行扩展。
Setup包后的数据应具有USB定义的格式,除非这个数据是销售商提供的信息,回传的状态信息荏苒具有USB定义的格式。
控制传输使用的是消息通道上的双向信息流。
所以,一旦一个控制通道被确认之后,这个通道就试用了具有某个端点号的两个端点,两个断电,一个输入,一个输出。
控制传输的端点决定了他所能接收或发送的最大数据静净负荷区长度。
Setup后的所有数据包都要遵守这个约定,这个约定是针对这些数据包中的数据净负荷区的,不包括包中的协议要求的额外信息。
对于缺省控制通道的最大数据区长度,USB系统软件要从设备描述器的头8个字节中读出,设备将这8个字节放在一个包中发出,其中7个字节包含了缺省通道的wMaxPackSize。
对其他的控制端点来说,USB系统软件在他们被设置后,获得此长度,然后USB系统软件就会保证数据净负荷区不会超长。
USB的数据格式概述和其他的一样,USBUSB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。
下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。
(一)域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:1、同步域(SYNC),八位,值固定为0000 0001,用于本地时钟与输入同步2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种,具体分类请看问题五。
3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。
4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。
5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(同步传输为四种传输类型之一,请看下面)。
6、数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度7、校验域(CRC):对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。
(二)包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的)其中输入包、输出包和设置包的格式都是一样的:SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)(上面的缩写解释请看上面域的介绍,PID码的具体定义请看问题五)帧起始包的格式:SYNC+PID+11位FRAM+CRC5(五位的校验码)2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。