|
【文件名】:11212@52RD_usb_linux系统开发.pdf
【格 式】:pdf
【大 小】:1342K
【简 介】:
【目 录】:
简述:
USB出自豪门,一问世便有IBM,Microsoft,compaq等前呼后拥,不红实在是没有道理,以致于连三岁小毛孩都知道买游戏手柄要买USB的。
USB名气这么大,但USB是什么呢?要是想找份写驱动的活谋生,常会被问到这样的要求:“给我讲讲USB。”
无论你是谁,遇到这样的问题一定要扭头就跑,不然一定被雷死。
USB使用方便,硬件设计也简单,但开发人员还是谈USB色变。为什么呢,因为USB简单方便的外表下面是一个十分复杂的USB系统。简单方便和成本低廉的代价就是逻辑上的复杂,这里的逻辑指的就是USB协议。USB的协议之多之杂在IT界内绝对是史无前例的,数据传输的协议,控制协议,主控制器协议,设备相关的协议,硬件接口的协议,这些都要和USB扯上关系,都称自己是USB协议,以至于有很多人雄心勃勃的研读了几年的USB协议才发现所研读的内容和自己要想了解的东西扯不上关系。
在我看来,USB的成功主得益于两点:
首先是集成电路技术的发展,使得控制器能集成更复杂的逻辑(USB协议)的同进价格还能降下来。一个产品要想推广开,首先是要足够便宜,要让大众能买得起用得起,其次是功能强大,集成电路技术的发展 给了usb这两个条件。
但集成电路的发展带来的好处也被USB同时代的其它接口标准(如1394)所共享,USB绝对不是成本最低,性格比最高,协议设计的最完美的接口,但USB为什么能独霸天下,这就是USB之所以能成名的第二点,出生好。
有了Intel,IBM,Microsoft,compaq这群好爹妈的支持,就算是阿斗也能坐上皇位,向况USB不是阿斗。这群好爹妈运用自己强大的影响力,给USB制定了一系列的标准,要想跟他们混就得尊守这个标准,其它团体也是敢怒不敢言,屁踮屁踮的就奔着USB去了。
USB系统概述
首先,我们来回答一下面试官的问题,USB是什么,usb就是Universal Serial Bus(通用串行总线)。什么是Universal Serial Bus呢。这个用语言就难以表达了,请看下面两张图:
少许的艺术细胞加上平时的使用经验就能理解第一张图的含义,一个USB主机可以通过hub可以连接许多的从设备,组成像树一样的结构。
关键是第二张图,详细的描述的linux USB系统的几大板块,这种结构基本上适用所有操作系统的USB架构。
可能是USB这三个字母看起来比较酷,稍和USB沾边的开发人员都会吹自己做过USB开发,特别是那些介绍USB的垃圾书,从头到尾扯了一通他也没有告诉读者他讲的是USB技术的那一部份,在USB的整个架构中的作用。
首先,USB分为主从两大体系,一般而言,PC中的USB系统就是作主,而一般的USB鼠标,U盘则是典型的USB从系统。即使是一个USB鼠标,也不要小看它,它其中也有很精深的USB技术。作为USB鼠标的第一大生产国,我们实在没有什么好骄傲的,如果从零开始,花个十年八年我们国家也不一定能研发出一个像样的USB鼠标。
先说控制器这一块,我们至少要开发出USB的主控制器与从控制器,鼠标是低速设备,所需的是最简单的一类从控制器。主控制器则复杂得多,因为太过于复杂了,所以就形成了一些标准。在一个复杂的系统中,标准的好处就是可以让开发者把精力集中在自己负责的一块中来,只需要向外界提供最标准的接口,而免于陷于技术的汪洋大海中。
USB主控制器主要有1.1时代的OHCI和UHCI,2.0进代的EHCI,这些标准规定了主控制器的功能和接口(寄存器的序列及功能),对我们驱动工程师而言,这样的好处就是只要你的驱动符合标某一标准,你就能轻而易举的驱动所有这个标准的主控制器。要想把主控制器驱动起来,本来是一件很难的事情,估计全球的IT工程师没几个能有这样的水平,但有了标准,我们就可以轻松的占有这几个高水平的IT工程师的劳动成果。
主控制器和驱动有了,我们还需要USB协议栈,这就是整个USB系统的软件部分的核心(有的资料中直接把其称为USB核心),USB协议栈一方面向使用USB总线的设备驱动提供操作USB总线的API,另一方面则管理上层驱动传下来的的数据流,按USB主控制器的要求放在控制器驱动规定的位置,USB主控制器会调度这些数据。
我们这里用到了调度这个词,USB主控制器的调度其实和火车的调度CPU的调度有相似之处,物理上的通路只有一条,但USB中规定的逻辑上的通路却有许多条,有时一个设备就会占用几条逻辑通道,而USB系统中又会有多个设备同时运行。这就好像是只有一条铁路线,但来来往往的火车却有许多,USB主控制器的作用就是调度这些火车,而USB协议栈的作用则向上层的USB设备驱动提供不同的车次。
有了以上的这些模块,才能为USB鼠标设计驱动,这一点上ps/2鼠标的驱动和USB鼠标的驱动结构基本一样,只不过我们的数据通路是USB总线。
USB系统甚至把设备驱动都给标准化了,只要是支持USB的主机,就可以支持任何一个厂商的USB鼠标,任何一个厂商的U盘,只要是被USB系统包函的设备,只要这些设备支持相应的标准,就无需重新设计驱动而直接使用。
下是简单的列出了USB设备类型,理想的情况USB系统要对这些设备作完整的支持,设备也必须符合USB规范中的要求。
1-audio:表示一个音频设 备。
2-communication device:通讯设备,如电话,moden等等。
3-HID:人机交互设备,如键盘,鼠标等。
6-image图象设备,如扫描仪,摄像头等,有时数码相 机也可归到这一类。
7-打印机类。如单向,双向打印机等。
8-mass storage海量存储类。所有带有一定存储功能的都可以归到这一类。如数码相机大多数都归这一类。
9-hub类。
11-chip card/smart card。
13 --Content Security
14--Video (Interface)
15--Personal Healthcare
220--Diagnostic Device
224--Wireless Controller (Interface)
239--Miscellaneous
254--Application Specific (Interface)
255-vendor specific.厂家的自定义类,主要用于一些特殊的设备。如接口转接卡等。
理解了这两张图,基本能应付一下面试官了,但我建议还是随身带着这两张张图,因为USB系统确实太复杂,言语难以表达,很可能他说的USB和你讲的USB压根就不是一个东西,只是都和USB相关。
但这两张图也不能回答所有的问题,随着USB技术的发展,USB系统中的一些不足也逐渐被承认,OTG就是这种情况下的主要产物。
现在市面上有些设备(比如一些MP4)即能插上电脑当U盘使,也能被U盘插上读取U盘。这样的设备在USB系统中是作主还是作从呢?
这就是OTG(On-The-Go),即可以作主也可以作从,传说中的雌雄同体。这主要是为嵌入式设备准备的,因为USB是一种主从系统,不能支持点对点平等的传输数据,OTG正是在这种需求下产生的,OTG不仅支持控制器的主从切换,在一定层度上,也支持相同设备之间的数据交换。
USB连接的基本知识
USB信号线
信号线名称 颜色
1 Vbus 红
2 D- 白
3 D+ 绿
4 GNU 黑
shell(金属壳) 屏敝层
有了上面的表,剥开USB线看看花花绿绿的信号线都是有来头的,这些色彩也是USB规范中的一部份。
USB线览倒没有什么名堂,倒是USB接插件在这几年搞出不少事。
随着USB OTG技术的发展,对接插件有了新的要求,STD标准的东西尺寸太大,于是有了MINI标准,但有人觉得MINI标准的接插件还是太大,又忽悠出mirco标准,而且MINI和mirco标准的接插件由4pin变成了5pin。
一 般而言,靠近host一则的插头和插座称作A,靠近从设备的则称B,在OTG中,A则是指供电方。
Connector Color
mirco/mini-A receptacle White
mirco/min-AB receptacle Gray
mirco/min-B receptacle Black
mirco/min-A plug White
mirco/min-B plug Black
mirco/mini标准的接插件都是5pin,除了传统的vbus,D+,D-,GNU外,还多了一个ID pin。
细的的人都会发现,mirco/mini的接插件定义是5 pin,但线缆的信号线却是4根。这就是OTG的玄机。
OTG规范中要求设备即能作主,也能作从,要实现这个功能,必须有寻找一种方法来区别设备是作主还是作从。OTG的作方就是增来一个ID pin来判断设备是接入设备的是主还是从,按OTG的要求,同时作主和从的设备要使用mirco/min-AB receptacle,这样可以接入A型的plug,也可以接入B型的plug。
在a型plug中,ID线与地线相连,这样A型plug接入时ID线就被拉低,OTG控制器切换到主模式,当B型plug中,ID线悬空,这样ID线就为默认值(高电平),OTG控制器就处于从状态。
下图是两种常用的联接方式:
上图中pin脚的序列是vbus,D-,D+,ID,GND,我们要注意上图中pin4(ID)的连接方法,OTG需要通过这个PIN脚来判断控制器是作主还是作从。
对驱动而言,OTG中的ID脚是我们需要主要关注的,至于其它的,了解一下就可以了,vbus主要是供电,D+/D-则是用来传输数据,就是我们前面所讲的主设备和从设备间唯一的一条铁路。USB中用差分信号来传送数据,这就增加了传输的的抗干扰能力,高频率传输成为可能,usb2.0最高速度可以达到480Mbps/s。数据的传输主要由主控制器和从控制器来控制,这就回到了前面所说的,IC技术的发展给USB技术铺平了道路,USB的主从控制器实际上是一个专用的CPU,专门负责编解码USB数据和搬运数据,如果这些工作全交给cpu去做,CPU早就瘫了。在2.0问世之初,480Mbps/s的频率远远超出许多CPU的极限速度。
OTG控制器
首先,提出一个问题,OTG和EHCI/OHCI/UHCI是同一类概念吗?
那我们先看一看OTG能做些什么。
在OTG中,我们一般不把设备叫做主设备或从设备,而称作A-DEVICE和B-DEVICE。一般而言,A-DEVICE作主,B-DEVICE作从,但也不能这样绑定,A-DEVICE也可以作从,这时A-DEVICE仍要为总线提供电力。
OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,为连接时候的USB Host,A-Device始终为总线提供电力。ID悬空被称作为B-Device,为连接时候的USB Device(作从),设备的USB Host/USB Device角色可以通过HNP切换。
OTG Device:使用Micro AB插座,可以在运行时切换Host/Device。
仅外设B-Device:仅仅能作为外设的B-Device(分为插头一体和插头线缆分离的)。
可见,OTG主要是负责控制器状态的切换,这种切换要根据接入的设备来判断。OTG主要使用在嵌入式设备中,说到嵌入式不能不提降低功耗了,所以仅有ID线的检测还是不够的。
OTG中的三大协议
SRP(Session Request Protocol):
B-Device使用。通过数据线上的脉冲,请求A-Device打开VBUS并且开始
-个Session。Session为从VBUS打开到关闭这一段时间。
支持:A-Device允许回应SRP,B-Device(包括仅能作为外设的B-Device),允许发起SRP。一个能够支持HNP的B- Device应该能够发起SRP。当A插头插入时关闭VBus的Host必须支持回应SRP,VBus总是打开的Host不必响应SRP。
ADP(Attach Detection Protocol):
提供设备检测是否有对端设备插入。
HNP(Host Negotiation Protocol):
OTG设备通过HNP来切换Host/Device角色。
OTG不同连接方式的不同过程
OTG Device /Embedded Host 与 仅作为外设的B-device(带A插头型)
Host端检测到A插头插入,停止ADP,打开VBus,因为B-Device的A插头与设备作为一体,此时B-Device必定与A插头连接,Host检测到外设连接,开始枚举。
OTG Device/Embedded Host 与 仅作为外设的B-device(A插头为线缆连接)
Host段检测到A插头插入,停止ADP,打开VBus,如果B-Device是线缆连接完毕在将A插头插入则整个连接过程与上面无异,因为此 时B-Device可能还没有插入插头,则设备连接超时,VBus再次关闭,等待下一次ADP的改变(线缆连接完毕),再次打开VBus,此时开始正常总 线枚举。
OTG Device 与 OTG Device
Host端检测到插头插入,则打开VBus,如果没有外设检测到,则关闭VBus,打开ADP Probing,Device端检测到插头插入,则打开SRP,如果线缆没有插入,则SRP超时,Device端开始进行ADP Probing,当线缆连接完毕,Device端侦测到ADP变化,发送SRP请求Host打开VBus,Host回应SRP并且打开VBus,完成设备 连接。
从上面的过程可以看出,ADP和SRP的目的都是为了节能,平时VBus上的供电是并没有打开的,这就需要靠ADP和SRP来检测外设并打开VBus的供电。如果VBus上一直有电流供应,ADP和SRP就无用武之地了。可见,在嵌入式的世界里,确实要精打细算,ADP和SRP是何等的复杂,这么复杂的设计仅是为了省几毫安的电流。
回来我们前面的问题,OTG和EHCI/UHCI/OHCI是同一类的概念吗?
OTG的作用只是负责切换主从状态的切换,同时,在功耗方面也有要求,OTG要求vbus不能像PC那样永远供电,所以这样就需要有一套设备发现机制,这就是SRP和ADP了。OTG也允许同进充许同类设备进行数据传输(A TO A),这就是HNP发挥作用的时候了。
当OTG己经发现设备,VBUS供电开启,系统处于HOST或DEVICE状态,这时OTG的使命就完成了,接下来的工作就交给主控制器(EHCI/OHCI/UHIC)或从控制器了。
所以OTG的主要是在设备接入的那一刻起作用,此后USB还是要按传统的HOST/DEVICE的方式来通讯。当然,有些OTG控制器会集成一些HOST控制器的功能,这些控制器并不符合任何一种标准,一旦遇到这种OTG控制器,驱动开发人员就要倒霉了。USB系统中最复杂的就是主控制器了,如果与主控制器与USB标准有出入,就无法重用大量成熟的控制代码,驱动开发人员就需要重新去研究整个USB协义,这无疑是一份耗时耗力不讨好的活。
Linux下的OTG架构
内核 定义了一个struct otg_transceiver的结构体,这个结构体描述的OTG需要支持的接口
struct otg_transceiver {
struct device *dev;
const char *label;
u8 default_a;
enum usb_otg_state state; //记录OTG控制器的状态,在实际的处理中这个比较重要。
struct usb_bus *host;
struct usb_gadget *gadget;
/* to pass extra port status to the root hub */
u16 port_status;
u16 port_change;
/* bind/unbind the host controller */
int (*set_host)(struct otg_transceiver *otg,
struct usb_bus *host);//这个接口用来启用或禁用主控制器,是关键的接口
/* bind/unbind the peripheral controller */
int (*set_peripheral)(struct otg_transceiver *otg,
struct usb_gadget *gadget);
/* effective for B devices, ignored for A-peripheral */
int (*set_power)(struct otg_transceiver *otg,
unsigned mA);//一般用来设置vbus上的供电
/* for non-OTG B devices: set transceiver into suspend mode */
int (*set_suspend)(struct otg_transceiver *otg,
int suspend);
//下面是OTG的三大高级功能的接口。
/* for B devices only: start session with A-Host */
int (*start_srp)(struct otg_transceiver *otg);
/* start or continue HNP role switch */
int (*start_hnp)(struct otg_transceiver *otg);
/* b device disconnect during hnp */
int (*disconnect)(struct otg_transceiver *otg);
/* b device connect */
int (*connect)(struct otg_transceiver *otg, struct usb_device *udev);
/* host suspend the bus during hnp */
int (*host_suspend)(struct otg_transceiver *otg);
/* hand interrupt related to usb otg */
int (*otg_interrupt)(struct otg_transceiver *otg);//中断处理接口
};
上表的结构体很清晰的描述了OTG的功能,只要实现几个重要的接口,就能把你的OTG控制器和linux系统联接起来。
系统中作了如下定义:
struct otg_transceiver *xceiv;
这个定义就是一个 OTG控制器的对像,然后使用otg_set_transceiver来实现这两者之间的联接。 |
|