在学习USB驱动之前,先来了解下USB相关的一些知识点,比如:USB接口类型 USB主控制器 USB协议(其中最重要的是USB协议),了解了USB协议才能去很好的阅读Linux内核源码中USB驱动中的实现,好了,废话不多说。咱们直接进入正题。
一、USB接口类型
USB接口有A口、B口和mini口,分别如下图所示:
二、USB构成与拓扑图
咱们在使用U盘、USB鼠标的时候,都是很简单直接插入电脑中的USB接口,那么可以想象到的是在整个USB构成中,USB设备是其中不可缺少的。而能够去识别并且让USB设备通信的器件是USB主机控制器。但是很多的时候咱们会发现USB接口不够用,那么小伙伴们就会去淘个USB hub来让更多的USB设备接入。
简单的总结下上面所讲:也就是USB构成由下面组成
1、USB主机控制器
2、USB HUB
3、USB 设备
注意:每一个USB主机控制器都连接着USB根集线器,USB根集线器可以插入USB设备或者USB HUB。
下面为USB的拓扑图:
三、驱动USB设备
从上面的构成可以看出来,如果想要去驱动一个U盘,那么就需要用USB主机控制器去控制USB设备(可以把根集线器和HUB只是看成用来通信的线)。USB有其相对应的USB协议规范。USB主机控制器使用USB1.0、USB2.0、USB3.0去控制USB设备(U盘)。在Linux系统中对于USB主机控制器就有其对应的三种协议分别为:
UHCI : Intel用在自家芯片上的USB1.1主机控制器协议(用于PC方面的USB主机控制器)
OHCI : 微软等公司使用的USB1.1主机控制器协议(用于非PC方面的主机控制器,比如:嵌入式中的arm等)
EHCI : USB2.0的主机控制器协议,兼容USB1.1
XHCI : USB3.0的主机控制器协议,兼容以前的版本
四、USB设备插入PC机过程
想必大家都试过把U盘或者手机插入到PC机中的时候,PC会提示正在安装驱动......
好的,那么可以想象一下:
问:为什么U盘插入就会帮咱们把U盘的驱动安装,而不是安装了USB鼠标的驱动呢?
答:就像RTC时钟芯片,我们可以去读取寄存器获取时间。而U盘没有寄存器说法,只有USB设备描述符。通过获取USB设备描述符中的信息PC机就能知道安装时什么类型的驱动程序了。
那么USB设备描述符中都有什么,请参照http://blog.csdn.net/lidroid/article/details/46885103这篇文章。
阅读完上面那篇文章大家想必就知道,USB设备中都有下面的描述符:
USB设备描述符
配置描述符
接口描述符
端点描述符
简单的说下上面各种描述符的作用:
USB设备描述符里面决定了该设备有多少种配置,每种配置描述符中对应了多少个接口,接口描述符中对于多个端点。
咱们先来看下接口描述符:这里的接口是逻辑上的接口,比如买回来了一个USB摄像头,基本上都有两个接口,一个是摄像头,一个是麦。那么这个USB设备就有两个接口。
而配置描述符是指这个USB设备有什么功能:还是USB摄像头为例子,可以配置下面:
功能1:摄像头
功能2:麦
功能3:摄像头+麦
最后是端点描述符:在描述符中有端点,主要是用来传输数据的。
五、USB主机控制器和USB设备数据传输
USB主机控制器和USB设备数据传输是靠端点来传输的,端点可以通过端点描述符去获取。既然是用来传输数据的,那么就有输入和输出数据,咱们可以将其理解成串口的tx或者rx缓冲区。端点是有方向的,而且是单向的(除了端点0是双向)。
对于众多的USB设备,划分了4种USB数据传输的类型:
控制传输:USB主机控制器根据USB协议或者USB设备硬件发送数据
中断传输: 以USB鼠标为例子,中断传输的特点是,数据稳定、数据实时(总不能再玩cs的时候,USB鼠标点击开枪的时候,子弹没出去,被对方爆头了吧)
实时传输:以USB摄像头为例子,实时传输的特点是,数据可以不稳定,数据实时(在和人视频的时候,总不能数据出错,就让其不断重发达到稳定,那样对面走了都不知道)
批量传输:以U盘为例子,批量传输的特点是,数据稳定,数据不实时(在把文件复制到U盘时候,如果没有安全退出,可能会遇到文件只复制一部分)
六、其他和USB相关的知识
在USB主机控制器和USB设备之间交流信息,一切以USB主机控制器为主导地位,也就是只能USB主机控制器去访问USB设备,而USB设备只能等待USB主机控制器访问。
上面讲到USB设备和USB主机控制器是通过端点来传输的,实际上在USB主机控制到USB设备端点之间有一个通道,我们叫管道。如下图:
对于USB的简介,就写到这里。