搞好linux usb设备驱动,吃尽linux设备都不怕 --写在前面
话说基础要打牢,莫要闲扯蛋,那好本节的usb基础入门学习,咱们就不打岔了。请听我慢慢绕来----
蛋疼的术语usb设备基础
usb设备是非常复杂的,它由许多不同的逻辑单元组成,这些逻辑单元是设备 (device)、功能(function)、配置 (configration) 、接口 (interfaces) 和端点 (End Points)。
1.设备与功能
device可以是连接到USB总线上的任何东西,比如摄像头、U盘等等。而每一个设备,又可能由多个功能单元组成,从而提供多个功能 (function) 。 每个功能单元,都可能有各自的驱动。
2.配置
设备通常具有一个或者更多的配置。
一个usb设备可以有多个配置,而且可以在配置之间切换以改变设备的状态。例如,一些允许下载固件到其他设备包含多个配置以完成这个工作,而一个时刻只能激活一个配置。Linux对多个配置的usb设备处理的不是很好,不过这种情况很少发生。
3.接口
配置经常具有一个或者更多的接口。
usb接口本身被捆绑成为配置。usb接口只处理一种usb逻辑连接,例如鼠标,键盘或者音频流。一些usb设备具有多个接口,例如usb扬声器可以包括两个接口:一个usb键盘用于按键和一个usb音频流。因为一个usb接口代表了一个基本功能,而每个usb驱动程序控制一个接口,因此,以扬声器为例,Linux需要两个不同的驱动程序来处理一个硬件设备。
4.端点
接口没有或者有一个以上的端点。
usb端点被捆绑成接口。usb通信最基本的形式是通过端点。usb端点只能往一个方向传送数据,从主机到设备(称为输出端点)或者从设备到主机(称为输入端点)。端点可以看作是单向的管道。
端点的四种传输模式
控制传输:
控制传输用来在对设备进行配置的时候,传输控制信息, 占用的带宽较小。 该过程中控制信息通过预先定义的命令 (Commands) 来表示,这些命令包括 GET_STATUS, SET_INTERFACE 等等, 这些命令可以在 USB 标准中查到。 Linux 内核代码中,这些命令都是预先定义的,以 USB_REQ_ 开头的变量, 位于 include/usb/ch9.h 中。 例如:
/*
* Standard requests, for the bRequest field of a SETUP packet.
*
* These are qualified by the bRequestType field, so that for example
* TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
* by a GET_STATUS request.
*/
#define USB_REQ_GET_STATUS 0x00
#define USB_REQ_CLEAR_FEATURE 0x01
#define USB_REQ_SET_FEATURE 0x03
#define USB_REQ_SET_ADDRESS 0x05
#define USB_REQ_GET_DESCRIPTOR 0x06
#define USB_REQ_SET_DESCRIPTOR 0x07
USB Standard 中仅定义了所有设备都需要支持的的命令的最小集, 在此之外,厂商还可以根据自己的设备来自行添加所需的命令。
批量传输 (Bulk transfer:)
批量传输一般用于数据传输,该传输可能会占用所有的带宽。这种操作下,数据的传输必需在由总线保证的安全情况下进行, 换句话说, 一块数据必需不变地传输到目的设备上。 U 盘和扫描仪等设备都大量的使用批量传输。
中断传输 (Interrupt transfer)
中断传输与批量传输类似,但是它会定期的发生。两次中断传输的间隔,在一定的范围内,可以由驱动自行设置。
等时传输 (Isochronous transfer)
等时传输是几种传输模式中比较特殊的一种。这种模式下,数据的传输采用了一个固定的、预定义的带宽。该传输适用于需要持续的数据流,同时可以容忍偶尔的数据丢失的情况下, 比如摄像头。
资料准备
一个设备,一本经书,请准备好usb spec。usb系类讲解使用2.6.32.21kermel。