驱动程序调试和移植的经验

姓名:刘伟 学号:17103223402

【嵌牛导读】

本文介绍了一些在驱动程序调试移植过程中注意的事项

【嵌牛鼻子】驱动程序调试移植

【嵌牛提问】安卓系统里驱动调试和移植有什么特点?

【嵌牛正文】

对设备驱动最通俗的解释就是“驱使硬件设备行动”。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、DMA 通信,进行物理内存向虚拟内存的映射,最终使通信设备能够收发数据,使显示设备能够显示文字和画面,使存储设备能够记录文件和数据。设备驱动充当了硬件和应用软件之间的纽带,它使得应用软件只需要调用系统软件的应用编程接口(API)就可让硬件去完成要求的工作。

在系统中没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口,如对串口定义SerialSend()、SerialRecv();对LED 定义LightOn()、LightOff();以及对Flash 定义FlashWrite()、FlashRead()等。而在有操作系统的情况下,设备驱动的架构则由相应的操作系统定义,驱动工程师必须按照相应的架构设计设备驱动,这样,设备驱动才能良好地整合到操作系统的内核中。

下面是一位嵌入式驱动工程师关于驱动设备的调试和移植的一些经验总结。

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

当谈到底层软件,我们一般都会想到bootloader、BSP、device driver、linux kernel等等。这里将会着重介绍linux device driver调试的一般性方法。

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

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

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

      2.你要调试的设备对应的datasheet、规格书和相关资料。尽可能地去搞到详尽的芯片相关资料和相关说明,因为这些都是你随后调试驱动的指引。

      3.开发板的原理图和贴片图。

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

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

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

万用表和示波器是必备的,其次,根据需要,你可能会用到频谱分析仪和逻辑分析仪。OK!当你拿到这些资料后,你就可以大刀阔斧地进行设备驱动调试了。一般的,设备驱动的调试都会经历如下几个步骤。

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

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

新建设备驱动目录

添加头文件

创建当前目录的Makefile

创建上层目录的Makefile

在上层目录添加Kconfig选项

在板文件添加对应项

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

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

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

设备驱动添加进来之后,一般的,都需要你添加、删除、修改一些内容,才能保证其编译通过。如果是调试,这里可能改动不大,因为驱动文件一般是由芯片原厂提供的,他们已经修改的基本可以编译通过了。但如果是移植,在这里花费的精力一般是比较大的,这会在后文中的附加说明里面提及到。

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

进行到这一步,你需要检查设备驱动是否可以顺利初始化,这个很简单,你只需要在设备驱动的probe函数或者init函数里面添加一条打印信息即可在串口观察是否有打印,如果没有打印,说明驱动根本就没有得到初始化。此时,你应该赶紧跑过去问和你合作的硬件工程师:“hi,我这块板子,那个XXX芯片是否贴上了?”,或者问他们:“这些飞线是不是都连接的OK了?”。 问这些问题都是很有必要的,因为很有可能硬件上没有准备好,或者硬件连线本来就有问题。所以,为了避免浪费时间,你还是主动去问下他们。

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

如果驱动得到了正常的初始化,这时候你开始检查该设备驱动对应的应用程序是否可以正常使用(或者自己写设备驱动的测试应用程序)。如果可以正常使用,那你太幸运了,这说明芯片原厂为你考虑的很周到,你可以节省N多时间干别的事儿了。

但遗憾的是,往往事情不会这么顺利,当你检查应用程序的时候,你发现应用程序没有做出应有的反应——例如当你辛苦把camera的驱动添加到kernel而且顺利初始化之后,你兴奋地进入系统打开camera发现:黑屏!你郁闷了,但是郁闷不能解决问题,这时候真正的所谓设备驱动的“调”和“试”才来了。赶紧去找一个万用表和一个示波器吧。

四、 设备驱动的“调”和“试”

所谓“调”,就是你依据设备芯片datasheet、主控datasheet、相关的规格书等资料,以及观察与测量的结果,不断地对设备驱动 code进行添加、删除和修改。

所谓“试”,就是你在添加、删除和修改的同时要不断地:

通过串口对反馈信息进行观察。

通过万用表对各电源引脚电压进行测量。

通过示波器对芯片的时钟(输入的和输出的)频率(包括测量晶振)、数据信号的波形、某种总线信号的波形,等各个引脚进行测量。

观察设备的上电时序,数据交互时序等等是否正常(参考datasheet)。

通过测试应用程序对驱动进行测试,并反复观察设备驱动的运行状态。

测试不光是测试员的事情,你必须保证自己调试的驱动可以运行稳定才可以提交代码,发给测试员进行大量测试。测试自己调试的设备驱动有以下几种:

(1)利用系统里面现有的应用程序进行测试

这个是最直接的测试,也省去了你自己编写测试程序的时间。

(2)自己编写linux应用程序来测试驱动

如果你对系统现有的应用程序不放心,或者不满意,就自己编写测试驱动吧。

(3) 利用proc或者sys文件系统的读和写函数

如果你在设备驱动里面添加了proc或者sys文件系统的读和写函数,你就可以在命令行通过cat或者echo命令来对设备驱动的各项参数进行手动测试。

注:以上测试方法是我习惯用的,除了这些,还是有其他一些测试方法我没有列举出来,感兴趣的话可以google一下。

此外,应该养成一个好习惯,那就是在测量各个引脚的同时,你最好创建一份excel表格,把各个引脚的电压、波形等情况记录下来,目的是在N多次修改之间作比较,也更有备忘的作用。

这里的“调”和“试”的过程是最耗时的,也是设备驱动调试的最关键的步骤,所以你应该非常有耐心的走好这一步。还应该注意的是,设备驱动的调试不光是你一个人的事情,有时候你闷头苦干一个星期都不一定能搞定。所以,进行调试的同时,必须有一个硬件工程师配合你,因为驱动不能正常运行也很有可能是硬件的设计纰漏导致的。此外,不要闭门造车,毕竟你在一个大的开发团队里面,你需要及时和同事进行有效的交流,避免走弯路。最后,如果还是存在问题,你就得邀请芯片原厂的FAE过来喽。

补充说明

要进行设备驱动的移植,一般的,你必须具备以下条件:

1.和当前设备芯片相近的或者相类似的芯片的现有驱动代码

举个例子来讲吧。例如,你现在要移植一份驱动到g-sensor(BMA250E)上,你现在就应该尽可能地去找到和芯片BMA250E相近的芯片所对应的驱动代码。这时候,你高兴的发现,咦?!手头上还有一份BMA250的代码,太幸运了。此时你就可以基于BMA250的代码来做移植。但有时候并没有这么幸运,那怎么办呢?这时候你完全可以去找其他类型的g-sensor啊,假如你手头上并没有BMA250的代码,但是你有一份ADXL345的代码,那当然也是可以的,你完全可以基于ADXL345的代码来做移植。至于为什么要选择与当前设备芯片相近的芯片所对应的驱动代码,原因就四个字“提高效率”。

2.当前芯片的详细datasheet,以及芯片的相关说明

3.开发板的原理图

如果有pads版本的原理图和贴片图,那是最好的了,方便以后测量引脚的各项参数。

4.万用表和示波器

这是调试、移植、开发设备驱动必不可少的设备。

具备了以上几个条件之后,接着走上文所讲的第一个和第二个步骤,尤其在第二个步骤,你可能得费好大力气来针对你当前的开发板进行驱动文件的修改。修改一般都包括IO配置、中断的设置、总线的配置(例如I2C、SPI、SDIO等)、寄存器的配置、甚至驱动代码的框架都得修改。等你这一步做好了,接着进行上文谈到的第三步,然后一步一步往下走完即可。

用一句话概括一下驱动移植吧。驱动的移植实际上就是:“通过添加、删除和修改,使现有的一份芯片相近的驱动代码可以在目标芯片和目标板上跑起来并且跑的很稳定!”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,917评论 25 707
  • 姓名:吴兆阳 学号:14020199009 转自韦东山 嵌牛导读:对嵌入式初学者,没有足够的视野选择一个合适投入方...
    吴兆阳阅读 2,381评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 我宁愿自己 是一个静默的舞者 跳跃在琴键上 呜咽于细弦中 踮起脚尖,踩出最美妙的音符 舞动臂腕,划出最优美的弧线 ...
    拾月和初一阅读 283评论 3 4
  • 文 /夏莲 但凡人只要有点自知之明,世界或许会简单很多,莫名其妙的双眼被遮蔽,心里蒙上一层尘埃。从前人人都具有的东...
    周小锦阅读 206评论 2 8