前段时间准备写非操作系统的USB主机的驱动,裸奔ARM9,驱动U盘,网上找了好久,翻了大量资料,却也没发觉有一个好的例程,所以决定研究USB Specification,可那东西让人看着一头雾水,无奈!后来看了OHCI Specification,里面也是协议一类的东西,要自己写一个完整的驱动程序简直是找罪受,不写个一年半载估计是搞不定的!
差点就放弃裸奔了,直接上OS!后来在翻阅Uboot和Linux代码时知道了这两个下面也是有USB Host Driver的,所以决定从这两部分代码入手,整理出一份U盘裸机驱动来!
前面在查找资料时曾看到过fudan_abc写的关于“Linux那些事儿”,牛B的人啊,为了看A能够一晚上看完LINUX下的U盘那几万行代码,要是我早见周公去了!呵呵
转回话题,linux下的USB Host Driver很多都是内核相关的,所以想到移植起来肯定很麻烦,光看懂里面的东西就得花去好几天甚至是几个星期的时间;而Uboot下的代码是近似裸奔的,或者说就是一个单任务的程序,负责加载内核的,可以从很多存储器中读取出内核文件来,当然也包括了USB Storage,所以从这里入手,应该是正确的!
Uboot下包括了很多底层驱动,还有一些命令。在cmd_usb.c下面有关于操作U盘的命令,一步步链接下去,就可以看到Uboot操作USB的整个过程了。还有cmd_fat.c这个文件,会有涉及到USB Storage的文件操作。顺便先说一下,我看的是u-boot-1.1.5。
我是从cmd_usb.c下面的"start"这个命令下面开始寻根的,收到start命令,开始进行usb_init(),usb_init里面包含了对硬件寄存器的初始化usb_lowlevel_init(),初始化完成之后开始usb_scan_devices(),当执行到usb_new_device()时就是开始对usb协议执行的一个过程了,里面有很多很多函数,都是关于usb底层的一些东西,我就不多说了,直接copy过来就可以用的。
由于本人水平有限,不能很好的细说这一移植的过程,只是给大家提供一个可行的方法呵。
我从uboot下取出来操作U盘的文件包括了
common/usb.c & usb_storage.c & cmd_usb.c & cmd_fat.c
fs/fat/fat.c & file.c
cpu/arm926ejs/at91sam926x/usb_ohci.c & interrupts.c
disk/part.c & part_dos.c
以及相关的.h头文件,有兴趣的朋友也可以一起讨论讨论!