分类: LINUX
2014-01-03 13:53:54
原文地址:USB设备驱动开发-USB协议相关(二) 作者:visualfan
一、USB设备通用操作
1. 热插拔
在热插拔中,USB HUB扮演着很重要的角色,HUB向主机报告端口的状态改变,主机才能对相应的动作采取相应的操作;
2. 地址分派
当USB设备插入后,主机会对USB设备分配一个独一无二的地址,同时resetUSB设备并对HUB的相应端口使能;
3. 配置(Configuration):
在USB设备的功能可用之前必须被配置,主机首先获取设备的配置信息了解设备的功能进而进行配置。主机将设置设备的配置(configuration),并且可能对接口(Interface)选择可变的设置(setting).
在一个配置中,设备可能支持多个接口,一个接口就是相关的一些端点(Endpoint) ,通过这些端点提供一个功能。因此,一个接口就向主机提供一个功能,在一个配置中,一个USB设备可以向主机提供多个不同的功能。接口中端点的特性和端点与主机通信的协议可以通过设备类(device class)或厂商自定义的标记来标示。
接口可以有一些设置来重定义接口关联的端点的编号和特性,但这需要设备支持GetInterface()请求来报告接口的当前设置,并通过SetInterface()请求来为接口选则可变的设置。
接口配置符(Interface Descriptor)数据结构包含表示接口号和可变设置的域,其中接口号是从0至n-1(n表示当前配置所支持的接口数),可变设置也是编号从0至n-1编号,当设备初始化配置中接口的默认设置是0号设置。
为了支持通用性驱动程序,设备描述符和接口描述符中都包含Class、SubClass和Protocol域,来标示USB设备提供的功能和利用这些功能主机和设备的通信协议。
4. 数据传输
USB设备和主机之间有四种数据传输方式(控制、中断、批量和等时),端口号可以在不同的接口设置中使用不同的传输方式。但一旦这种接口设置选定,在这种接口设置期间相应的端口就只能使用这种设置中指定的数据传输方式。
5. 请求响应
在USB设备处理请求时,为了保证处理的及时性,设置了一个时间上限5秒。在5秒内任何请求都必须被处理完成,但这不是强制性的规定。一个设备标准的请求包括三个阶段:发出请求,传输数据,返回状态。
在设备标准请求中,若没有数据阶段,则设备必须在50ms内完成请求处理并返回状态,这个限制适用于设备、接口和端点。
若需要在数据阶段传输数据给主机,则设备必须在接收到请求50ms内发出第一个数据包,并在500ms内传输完其他数据包,然后在最后一个数据传输完50ms内返回状态,完成状态阶段。也就是说,主机获取数据的请求必须在600ms内完成。
若主机需要发送数据到设备,则是5秒的限制。设备需要在5秒内完成数据的接收和状态阶段。
二、USB设备请求(USB Device Request)
所有的USB设备请求都是通过设备的默认控制通道(0号控制端点)完成的,使用控制传输协议。这些请求和请求的参数通过Setup包发送,每个Setup包都是8个字节。
Setup包的格式:
bmRequestType:请求类型相关信息,一个字节
其中的Direction表示第二阶段数据传输的方向,若wLength字段为0,表示没有数据传输,则这个位可以忽略。
Type位(两位)表示请求的类型,USB设备规范定义了一些所有设备必须支持的标准设备请求,用Standard。或者这类设备定义了一些请求,用class表示,或这个厂商自定义的请求,用vendor。
Recipient位(5位)表示请求的对象,请求对象可以是设备、设备上的接口或指定的端点。若操作的对象是接口或端点,则wIndex域来表示接口号或端点号。
bRequest:是具体的请求,一个字节
具体的请求操作,标准设备请求将在后表列出
wValue:根据请求的不同有不同的含义,两个字节
与具体的请求相关,将在后表列出
wIndex:根据请求的不同有不同的含义,一般表示索引或便宜量,两个字节
当请求操作对象是设备时,可用于传递给设备的参数;
当请求操作对象是接口或端点时,用于表示操作的接口号或端点号
Direction位设为0,表示OUT端点,设为1表示IN端点。在控制通道中,应当将其设置为0。
wLength:若请求有数据传输,则表示传输数据的长度
表示在第二阶段数据传输的长度,bmRequestType字段中指示了数据传输的方向。若wlength表示为0,则没有数据传输阶段。
在一个获取数据的请求中,设备不能返回多于wLength的数据,但可以返回少于wLength的数据。而在输出数据的请求猪,wLength总是发出数据的准确长度,若发出的数据长度超过wLength,则设备的行为是不可知。
设备标准请求指令和Setup包中相关字段对应的值