嵌入式之对学习Linux设备驱动的看法
从接触ARM到现在半年多了(准确地说应该是大三下学期才开始的),在这半年的时间里,有过快乐,也有过痛苦,有过成功的高兴,也有过失败的难过,总之,在这个程中,所尝到了应该尝到的,由于在大二的时候学习过DSP,对嵌入式的概念有一点了解,所以,在接触ARM时,并没有花大多的时间去入门,直接一边看手册,一边写驱动了。开发板一到手就开始了对ARM驱动程序的开发。没有多久就一边学习裸机驱动,一边学习基于Linux操作系的驱动,因为这样可以一起学习,其实,裸机驱动开发成功,再移植到Linux操作系统上不难,难的是怎样写出一个可移植的,稳定的驱动。
很多人认为只学习Linux驱动就可以了,完全看不起裸机驱动。不然,Linux驱动是在你对裸机的了解的基础上实现的,如果连裸机驱动的写不对,何以对理解、修改,书写基于Linux系统的驱动呢?比如,SPI总线系统,如果你连SPI协议都不清楚,你需要驱动的是一般的SPI接口的EEPROM,还是CAN总线驱动器,还是其它SPI接口的硬件,需要怎么样的时序都不懂(在嵌入式领域,时序很重要,我在写DS18B20驱动时,因为几个ns的时序,折腾了三天)。你能看懂内核SPI总线子系统下的源码,你能真正的应用?所以,裸机也一样的重要,在真正了解裸机驱动的基础上来了解Linux驱动,会更加内容。
没有开始写基于Linux驱动程序之前,在网上听说《LDD3》这本书不错,但是,还好,在网上下载到相应的chm格式文档,也许是由于个人的原因为吧,总喜欢看PDF格式的,所以花了点时间把它转化为PDF格式,刚开始看的时候,怎么也看不懂,说实在的,《LDD3》这本书不太适合初学者看,有幸在图书馆借到《Linux设备驱动开发技术与应用》,才慢慢的走进基于Linux操作系统的驱动的门,这本书这一学期来一直在我的手里,一直没有还回去,继借了一次,马上还了又马上借过来,暑假区间,手里的资金还可以,就把这本书给买下来了,对于《LDD3》,虽然也不错,还是看原版的吧,中文版看得不太明白,翻译太差了,有个电子版的就行了,这两本书在一起看的话,应该很好入门了,但是更多时候还是看看《Linux设备驱动开发技术与应用》,这是个人的认为,也许跟你的认为不一样,请原谅。
转眼间,暑假就快完了,这个暑假没有做多少事,很多时候是在看Linux内核相关驱动的源码,终于明白了别人告诉我一句话,如果真的想学好Linux设备驱动,去看内核相关的驱动吧,里面的东西太多了,能看懂,再写出相应的应用程序,那么证明你不错了。刚开始不以为然,后来,由于IIC总线的需要的,所以开始看内核提供的IIC总线子系统,也看到了自己的C与别人的差距,有时候,别说去了解某行代码的用途,连看懂是怎么声明的有点难,所以,这对C的要求有点高,但是,如果你的C够用,那么,看Linux内核源码可以使你的C更进一步,指针,特别是函数指针(非指针函数),在其中应用得最多;再者宏定义技术,内联函数,应用预定义处理控制调试信息,在源码中保留调试信息,为以后的维护提供方便。
好了,我们回到Linux驱动上来,在Linux内核中,有很多稳定的,很有价值的驱动源码,而且这些源码都可以为我们提供服务,我们直接应用,也可修改一下就可以应用的,所以,在商品化产品来说,还是直接应用或者修改内核提供的驱动最好,因为这在稳定性与可移植性上得到一定的认可,当然,前提是你能正确应用与修改,这就得要求去了解与懂这些驱动源码。当然,这不是一般的人都能懂的,你可以写一个LED驱动,应用register_chrdev_region或者register_chrdev进行注册,应用unregister_chrdev_region或者unregister_chrdev进行注销,也就可以应用输入子系统(input subsystem)所提供的 input_register_device来进行注册,应用input_unregister_device来进行注销,当然,你也可以应用其它的注册与注销方式来进行,只要是你掌握的,你想怎么做都行,前提是你必须掌握。
刚开始学习的时候,都是自己从头开始写驱动,自己实现read,write,ioctl,open等,没有想到Linux内核那么丰富而又稳定的代码,一般输入类型的驱动,现在知道尽量应用input subsystem来实现,比如usbmouse,触摸屏,游杆等应用输入子系统可以为我们提供很多东西,但是,前提是你必须了解输入子系统的构架,能看懂其源码。其实,看懂别人的源码,有时候是很困难的一件事,不过,还好,在内核的Documentation目录下有相关的帮助文档。在这些帮助文档的帮助下,应该可以看懂,到应用了吧,这需要时间,某些子系统内部的结构很复杂,没有一两天,或者更长的时间是搞不懂的,也许你会问,一个LED驱动,太简单了,我自己写一个也就一个小时不到的时间,何必花那么多时间去了解输入子系统呢,这就是Linux操作系在嵌入式之所以受欢迎的原因为,我是这样认为,当你真正的了解,懂了输入子系统的时候,你会的不只是LED驱动,在这个基础上,你可以很顺手地开发其它的输入型驱动了,这就是也许就是所谓的经验吧。
目前Linux中有多少子系统,我不太清楚,但是坚信,每一个子系统的存在,都是有用的,虽然没有必要去把每个子系统都搞懂,这也是不可能的,但是,尽量搞懂你目前正在学习的子系统,比如,一般IIC总线子系统,SPI子系统,CD卡,输入子系统,Framebuffer(LCD相关驱动构架)子系统这些比较常见的子系统,应该得去了解吧,在工作中,我们还会接很多子系统,硬件的发展,Linux内核也在不断更新其子系统的分类,所以,我认为,能快速看懂内核子系统,并能正确应用,这就是最终的目的,在Linux世界里,修改也是一种能力,能把内核中相近类型的硬件驱动修改为自己所用,这也是个人的修为。
很多人都喜欢最新的Linux内核,对于学习来说,我更加喜欢能应用目前资料中的例子能应行的,资料最多的内核版本(我用的内核版本还是Linux-2.6.13,还没有自己移植过Linux操作系统,在对Linux相关构架不了解的情况下,不会去做,真正了解了,移植应该不在话下),这样在学习过程中会减少很多不必要的事,如果真正的在一个内核版本中把想学的学好了,那么换个内核,也就是头文件所在的目录不大相同,某此内容不同罢了,看看一两个例子,或者直接到内核里面去看看,修改一下就行了,学习,不是学习某一内核版本下的驱动,学习是某一种操作系统下的思想,有了思想也就是所谓的神,还有什么不会的,在说,你在学校学习的是Linux2.6.32,但是,在公司,也许会让你应用2.6.13或者其它的版本来写驱动,那么,如果你只会你学习过的,你可以走人了,证明你更本就没有学会,因为你没有思候。
好了,这是个人的一点看法,也许你有你自己的看法,有不对的地放,请给予指正,让我也有学习的机会。
舒稳
2010-8-18于长沙理工大学
阅读(3961) | 评论(1) | 转发(0) |