分类: LINUX
2014-01-03 13:54:26
原文地址:USB设备驱动开发-USB协议相关(三) 作者:visualfan
一、USB设备标准请求
USB设备标准请求是为所有USB设备定义的操作,即使设备还没有被分配地址或还没有被配置都必须相应设备标准请求。
标准特性选择子
特性选择子用于对特性使能或设置特性,若一个不支持或非法的请求发送给USB设备,设备将在数据或状态传输阶段返回STALL作为响应。若设备的默认控制通道由于错误不能通信,则设备将被reset来清除错误状态并重启默认控制通道。
1. Clear Feature
wValue中的特性选择子必须和操作对象匹配,即设备特性对应设备,接口特性对应接口,端点特性对应端点。
若对应的特性不存在或不能被清除,或者操作的接口或端点不存在,将返回一个请求错误状态。
在Default状态:设备接收到这个请求后的操作是未定义的;
在Address状态:对设备操作是有效的,但对接口和端点的操作将返回请求错误;
在Configured状态:所有的请求都是有效的。
其中TEST_MODE特性不能被ClearFeature请求清除。
2. Set Feature
设置或使能特性
3. Get Configuration
返回当前的设备配置值(一个字节),在配置状态下,返回非0的bConfigurationValue值。若设备没有配置则返回0。
4. Set Configuration
设置设备的配置
在wValue的低字节是配置值,若配置值为0,则设备将仍处于Address状态。
5. Set Descriptor
用于更新已有的描述符或新增描述符。
6. Get Descriptor
其中wValue的高字节表示描述符的类型,如下表所示;低字节表示描述符的索引。一个设备可以实现多个配置描述符和字符串描述符,因此只有这两种描述符才会用到索引值。
7. Get Interface
这个请求返回接口目前选择的可选设置(Alernate Setting)。
8. Set Interface
设置接口
9. Get Status
返回操作对象的状态。
10. Set Address
设置设备的地址
只允许对设备描述符、配置描述符和字符串描述符进行操作。
11. Synch Frame
在等时传输方式中,用于设置并返回端点的同步帧。
二、描述符
USB设备使用描述符来报告属性,一个描述符即预先定义好的数据结构。每个描述符的第一个字节表示描述符的长度,第二个字节表示描述符的类型。
在描述符中可能包含有对字符串描述符的引用来描述这个描述符,若设备不支持字符串描述符,则其他描述符中字符串描述符引用域必须存储,但需要设置为0来描述没有可用字符串描述符。
1. 设备描述符
设备描述符用于描述一个设备的通用信息,一个USB设备只具有一个设备描述符。高速设备的设备描述符有一个版本号bcdUSB,0200H来表示USB 2.0
struct usb_device_descriptor {
__u8 bLength;
__u8 bDescriptorType;
__le16 bcdUSB;
__u8 bDeviceClass;
__u8 bDeviceSubClass;
__u8 bDeviceProtocol;
__u8 bMaxPacketSize0;
__le16 idVendor;
__le16 idProduct;
__le16 bcdDevice;
__u8 iManufacturer;
__u8 iProduct;
__u8 iSerialNumber;
__u8 bNumConfigurations;
} __attribute__ ((packed));
2. Device_Qualifier
对于高速设备,若在其他速度下需要更改一些配置,这需要定义这个描述符。
3. 配置描述符
配置描述符描述一个设备配置的信息,其中的bConfigurationValue值作为传输传递给SetConfiguration()请求,使设备采用这个配置。
一个USB设备有一个或多个配置描述符,一个配置描述符拥有一个或多个接口,一个接口拥有0个或多个端点。在同一个配置中,一个端点不能在不同的接口之间共用,但可以在同一个接口的不同设置共有。但在不同的配置中,端点可以在接口之间共用。
一旦配置选定,则设备一般仅少有的可变设置,即接口拥有可选设置则才可能更改设置。
4. 接口描述符
接口描述符描述一个配置中的接口。一个配置提供一个或多个接口。当一个配置支持一个或多个接口时,接口描述将作为配置描述符的一部分返回,端点描述符将紧跟着接口描述符返回。接口描述符不能通过GetDescriptor()或SetDescriptor访问。
一个接口包含可变设置来允许在设备配置后允许端点或一些特性做一定的改变。接口默认的设置都为0,SetInterface()请求用于选择一个设置或返回默认的设置。GetInterface()请求返回选择的设置。
如果一个设备配置支持单个接口并此接口有两个可选设置,配置描述表返回以后会紧跟着返回bInterfaceNumber与bAlternateSetting域皆为0的第一个设置的接口描述表及相关的结点描述表,而随之后是另一个设置接口描述表与结点描述表第二个接口描述表的bInterfaceNumber域也应为0但bAlternate Setting域应为1 。
如果一个接口仅使用节点0则接口描述表以后就不再返回节点描述表并且此接口表示的是一个请求接口它使用连在节点0上的缺省通道在这种情况下bNumberEndpoints域应被设置成0 ,一个接口描述表的节点个数不把结点0计在内。
5. 端点描述符
接口的端点拥有自己的描述符,描述符包含主机分配每个端点带宽的信息。每个端点描述符是作为配置信息的一部分在GetDescriptor请求中返回的。端点描述符不能直接通过GetDescriptor()或SetDescriptor()请求访问,这点与接口描述符一致。端点0没有端点描述符。
6. 字符串描述符
字符串描述符是可选的,但若设备不支持字符串描述符,则设备中配置描述符、接口描述符中对字符串描述符的引用值必须设置为0。字符串描述符使用UNICODE编码方式。USB设备可能需要支持多种语言,字符串描述符中16位的LANGID来表示支持的语言。