USB驱动(一)

来源:互联网 发布:乌鲁木齐网络赛 编辑:程序博客网 时间:2024/04/27 21:01

一直以来都想研究一下linux USB驱动,之前也买过《linux那些事儿——我是USB》这本书。但是发现这本书并没有我想象中的那么精彩。可能是因为这本书把原作者的博客原文再版了一遍,原来的一些内容跟排版都不同了。我还记得原作者说是为了在linux系统上看A片,而去学习了usb驱动的。看来A片用得恰当的话,也是一种促使人学习的动力啊。但在书上什么片都没有提及到。唉,这就是中国的书本啊,这就是中国的教育啊。

不过呢,这书本介绍的还算挺不错吧,讲得挺清晰。因为国内的好书已经不多了。你想在国内出书的话,去找一些国外的摘抄一下就可以了。跟出版社再拉下关系。

USB协议听说很复杂,我下载过文档,不过没怎么看过,我不会讲。而且我们也不用去care。学驱动嘛,你不研究得很深的话,就去了解一下器件的物理特性,了解这类器件在linux下的驱动框架,也就是说哪些代码是内核已经写好的,哪些是需要自己去写的,或者换句说法是哪些需要自己去填充的就行了。当然,像我这种菜鸟才会这样学习啦,想做大牛的就肯定要研究的深入一点,而不是敷衍了事就行了。但菜鸟变大牛也是需要过程的嘛,所以大家不用急。

USB是四线电缆。我自己剪过很多USB线,确实证实是四线的。两根是电源的,叫做VBUS和GND。不管他叫VBUS还是什么啦,理解为电压和地就行了。另外两根是数据线,分别是D+,D-。这两根是怎么传输数据的呢?不要问我,哥也不知道,初学者一个。你知道的话请回贴。

另外,还有很多概念要理解的。主机控制器,root hub, hub, usb设备。hub我就不多说了,混过大学的你懂的。主机控制器就是用来控制的啦,控制什么呢?控制外围的USB 设备。也就是说,CPU要跟外围的USB设备都是通过USB控制器来作中断通信的,CPU就只管跟主机控制器打交道就行了,然后主机控制器会跟外部的USB设备通信。

主机控制器一般都是跟root hub捆绑在一起,我也不知道怎么捆绑,反正把它们都当作是主机控制器吧。其它的hub也当作是usb设备。

我刚开始看USB驱动时有个疑惑,我想不少人也有这样的疑惑。看一些书说USB驱动分主机控制器驱动(USB host driver),又分USB设备驱动(也就是USB device driver),有时又冒出个USB驱动,说不清楚。好,我在这里说一下,看大家理不理解。

主机控制器驱动好理解,不用说啦,肯定是控制主机控制器行为的。也就是主机控制器跟外围的USB设备通信时,都要通过这个主机控制器驱动来跟外围设备打交道。而USB设备驱动呢?这就要声明很重要的一点,USB传输是分主从的,当我们是作为主设备时,那些挂在我们上面的USB设备,比如U盘,就称之为一个USB从设备,也就是USB设备啦。主机和U盘传输都是必须由主机控制器发起。那么这时候要有一个U盘的USB设备驱动。这个U盘的设备驱动肯定是用来控制插入的U盘行为的啦。其中在drivers/usb/目录下已经有很多写好的USB设备驱动。比如U盘的驱动在storage目录下,触摸屏和USB键盘鼠标的驱动在input目录下,usb转串口的serial目录等。但大家要记住,这时我们是作为主设备来理解。

那我们作为从设备的时候呢?从如我是一个手机,要插入电脑。此时电脑是主设备的,而手机(也就是我们)是从设备。这时候就不要去跟usb设备驱动扯上什么联系了,怕大家会混淆。当我们作为从设备时,有个专门驱动负责去跟外部的主设备通信,称之为gadget,代码在drivers/usb/gadget/下。有就人把gadget翻译为配件。不管翻译成什么了,配件也不好理解。反正gadget就是你作为从设备时与外部主设备之间通信的驱动就好了。

所以理解的关键点就是你是作为主设备还是从设备。

本来这是我写USB驱动的第一篇文章,不想涉及代码的,只想讲一下大概性的东西。但是没办法啊,本人组织水平低下。而且我讲得也不全面,我自己写文章会偏重自己以前不理解的地方来写。所以大家体谅一下咯。

接下来应该就可以做学习内核必经的一条路了——reading the f**king source code !

原创粉丝点击