设备驱动调试和移植的一般方法(一)

做linux底层软件工作也有两年了,算上研究生时期对底层软件的研究,加起来也快四年了。慢慢地发现有必要总结一些一般性的方法了。因为一般性的方法有宏观上的指导意义,以后调试和移植驱动时,经常性地回味这些一般性的方法可以防止自己犯同样的错误,进而少走弯路,以最高的效率完成工作。

当谈到底层软件,我们一般都会想到bootloader、BSP、device driver、linux kernel等等。这篇文章将会着重介绍linux device driver调试的一般性方法。另外,关于设备驱动移植的方法会在文章最后以补充说明的形式给出。

注意,这里说的一般方法不是固定套路,也就是说你不用把它当做教科书来读。你只需要根据具体情况灵活的选用其中某些步骤即可。

    一般情况下,进行设备驱动的调试之前,你必须具备以下条件:

l   设备驱动的代码和应用层测试软件(或者代码)

因为你做驱动的最终目的还是要给上层应用去操作的。所以,一个针对驱动的测试应用程序是必须的。这里的应用层测试软件一般都是供应商提供的,或者系统现有的可以用的应用,如果没有就必须自己写了。

l   你要调试的设备对应的datasheet、规格书和相关资料

尽可能地去搞到详尽的芯片相关资料和相关说明,因为这些都是你随后调试驱动的指引。

l   开发板的原理图和贴片图

一般情况下,你可能不需要贴片图,但是如果你们的硬件工程师对你的支持力度不够,那你就需要一个板子的贴片图。原因可能有以下几点:

(1)    如果是飞线过来的模块,而且你又不确定硬件工程师的操作是完全正确的,是不是每条线都接的是对的,这时候你就必须搞到贴片图和原理图,然后和板子上的飞线一条一条线的核对一遍。如果准确无误,那你就开工。

(2)    当你们的硬件工程师没有给你提供硬件板子的引脚具体在板子上的哪个位置的说明时,你就必须搞到贴片图。

(3)    此外,经常贴片图有助于提高一个驱动工程师的硬件素养。

l   万用表、示波器

万用表和示波器是必备的,其次,根据需要,你可能会用到频谱分析仪和逻辑分析仪。

OK!当你拿到这些资料后,你就可以大刀阔斧地进行设备驱动调试了。一般的,设备驱动的调试都会经历如下几个步骤:

一、 把设备驱动的代码添加进kernel

这一点要注意了,不同的方案提供商给出的添加方法是不同的。例如,对于Mediatek方案提供商,添加设备驱动的方法就和一般化的不一样,

因为Mediatek的体系架构不同于像telechips、Qualcomm等这样的kernel传统架构。所以,对于像Mediatek这样的特殊供应商,你必须遵循其提供的一套添加驱动的流程(mtk支持比较好,一般会提供sop)。传统架构的话,就很简单了,一般都会涉及到一下几步:

l   新建设备驱动目录

l   添加头文件

l   创建当前目录的Makefile

l   创建上层目录的Makefile

l   在上层目录添加Kconfig选项

l   在板文件添加对应项。  

l   如果不想每次都用menuconfig配置,就在kernel/arch/arm/configs/XXX_defconfig里面添加编译项

具体的实例我之类就不写了,google一下一大把,这篇文章也不会涉及到过多的细节问题。

二、 使得添加进去的设备驱动可以编译通过

设备驱动添加进来之后,一般的,都需要你添加、删除、修改一些内容,才能保证其编译通过。如果是调试,这里可能改动不大,因为驱动文

件一般是由芯片原厂提供的,他们已经修改的基本可以编译通过了。但如果是移植,在这里花费的精力一般是比较大的,这会在后文中的附加说明里面提及到。

三、 检查设备驱动是否正常初始化

进行到这一步,你需要检查设备驱动是否可以顺利初始化,这个很简单,你只需要在设备驱动的probe函数或者init函数里面添加一条打印

信息即可在串口观察是否有打印,如果没有打印,说明驱动根本就没有得到初始化。此时,你应该:

l   首先,你赶紧跑过去问和你合作的硬件工程师:“hi,我这块板子,那个XXX芯片是否贴上了?”,或者问他们:“这些飞线是不是都连接的OK了?”。 问这些问题都是很有必要的,因为很有可能硬件上没有准备好,或者硬件连线本来就有问题。所以,为了避免浪费时间,你还是主动去问下他们。

l   其次,如果芯片确实贴上了而且硬件连线都接对了(后来你不放心,自己也核对了一遍),这时候问题就在你喽。马上检查设备驱动的添加是否有什么问题,是否是板文件没有修改好,是否驱动本身就没有注册好等等。

你可能感兴趣的:(设备驱动调试和移植的一般方法(一))