设备模型之外,对于驱动程序的开发者来说,有三样东西是不可缺少的:第一是协议或标准的spec,也就是规范,比如usb协议规范;第二是硬件的datasheet,即你的驱动要支持的硬件的手册;第三就是内核里类似驱动的源代码,比如你要写触摸屏驱动的话,就可以参考内核里已经有的一些触摸屏驱动。
spec、datasheet、内核源代码这三样东西对于每个开发设备驱动的人来说都是再寻常不过了,但正是因为它们的普通,所以在很多人眼里都被归为被忽视的群体。于是大家开发驱动的过程中,遇到问题的时候首先想到的可能还是“问问牛人怎么解决吧”、“旁边要是有个牛人该多好”,因为牛人的稀有,所以知道牛人的价值,而又因为spec、datasheet和内核源代码的唾手可得,所以常常体会不到它们在解决问题时的重要性。
当然我并不是贬低牛人的价值,宣扬依赖牛人不好,如果你很幸运身边真就有牛人这种稀缺资源的话,自然是要好好利用,也可以少走很多弯路,节省很多摸索的时间。只是人生不如意十之八九,多数人还是没有这份幸运的,所以与其遍寻牛人讨教,不如多依赖依赖自己,多利用利用自己身边有的资源去寻找解决问题的途径。
对这三样看似普通的东西,关键在于很好的去利用,而不是拥有。就说USB吧,USB驱动和USB设备如何进行交流,交流的方式,交流过程中出现了什么问题是什么引起的等等都在USB spec里有描述,而你的USB设备支持多少种配置包含多少端点只有设备的datasheet才知道。协议的spec和设备的datasheet是最好的参考资料,驱动开发调试中出现的问题绝大部分都能在它们的某个角落里找到答案。而内核中类似设备的驱动源代码是最好的模版,对很多硬件设备,你都可以在内核找到同种设备的驱动代码进行参考实现,甚至于可以拷贝或共享大部分的代码,只进行局部的修改,比如说位于drivers/input/touchscreen目录下的各个触摸屏驱动,它们之间的代码很多都是类似的甚至是相同的。
如果你不仅仅只是打算写驱动,而是还想阅读内核中实现某种总线、设备的源代码,钻研它们的实现机制,那协议的spec就犹为重要,它们在代码里的体现无处不在,你需要在阅读代码前就对协议规范有个整体的理解。形象点说,spec是理论基础,内核代码是具体实现,理论懂了,看代码就和看故事会差不多了。