0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于驱动设备调试和移植一些经验总结

5RJg_mcuworld 来源:互联网 作者:佚名 2017-10-23 09:05 次阅读

对设备驱动最通俗的解释就是“驱使硬件设备行动”。设备驱动与底层硬件直接打交道,按照硬件设备的具体工作方式读写设备寄存器,完成设备的轮询、中断处理、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等)、寄存器的配置、甚至驱动代码的框架都得修改。等你这一步做好了,接着进行上文谈到的第三步,然后一步一步往下走完即可。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测试测量
    +关注

    关注

    25

    文章

    884

    浏览量

    90577
  • 嵌入式
    +关注

    关注

    5072

    文章

    19026

    浏览量

    303522
  • 智能硬件
    +关注

    关注

    205

    文章

    2346

    浏览量

    107441

原文标题:少走弯路!嵌入式Linux设备驱动调试移植的一些套路

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    老司机带你学嵌入式Linux设备驱动调试移植

    驱动,这样,设备驱动才能良好地整合到操作系统的内核中。下面是位嵌入式驱动工程师关于
    发表于 10-22 10:44

    少走弯路系列!嵌入式linux设备驱动调试移植一些套路

    地整合到操作系统的内核中。 下面是位嵌入式驱动工程师关于驱动设备调试
    发表于 11-10 16:20

    伺服调试一些经验总结

    安川伺服调试一些经验在查找惯量比的过程中看到的,这是伺服电机的驱动过程中发生的问题,首先应当匹配惯量,伺服电机应当考虑刚性,还有速度,速度高,惯量还会大。再生电阻还是不知道怎么配置。
    发表于 09-07 08:05

    C嵌入式程序项目经验总结相关资料分享

    C嵌入式程序项目经验总结这里总结一些项目经验,比如程序调试经验,代码设计模式
    发表于 12-21 06:04

    SOPC Builder/Nios 学习经验总结

    SOPC Builder/Nios 学习经验总结
    发表于 07-22 15:32 0次下载
    SOPC Builder/Nios 学习<b class='flag-5'>经验总结</b>

    单端甲类小胆机的制作经验总结

    单端甲类小胆机的制作经验总结 1、现在很多自己动手制作胆机的朋友很多都是按照一些参考电路来仿制,其对参考电路中的很多技术
    发表于 07-31 21:56 1.2w次阅读
    单端甲类小胆机的制作<b class='flag-5'>经验总结</b>

    线圈天线设计经验总结

    线圈天线设计经验总结
    发表于 09-12 17:21 224次下载

    开关电源测量的经验总结

    开关电源测量的经验总结,感兴趣的小伙伴们可以瞧瞧。
    发表于 09-18 17:34 0次下载

    模拟电路设计经验总结

    模拟电子的相关知识学习教材资料——模拟电路设计经验总结
    发表于 09-27 15:19 0次下载

    指针经验总结

    指针经验总结
    发表于 10-27 15:44 19次下载
    指针<b class='flag-5'>经验总结</b>

    名开发工程师的七年工作经验总结

    这是在网上看到的篇文章,写的是个从事软件工程开发的大牛对从业七年的一些经验总结。感觉挺不错,转来与大家分享了,下面是正文。
    的头像 发表于 08-16 11:55 4358次阅读

    电路设计的一些经验总结

    电路设计的一些经验总结
    发表于 12-02 13:57 42次下载

    EMI整改经验总结

    EMI整改经验总结
    发表于 12-20 15:55 45次下载

    硬件调试经验总结

    这是我个人的第篇博客,在此记录下做北斗杯比赛的一些小经验总结方面留作自己的备份,另方面希望可以帮到和我遇到类似问题的人。MS561
    发表于 01-12 19:54 2次下载
    硬件<b class='flag-5'>调试</b><b class='flag-5'>经验总结</b>

    选择烧结银的经验总结

    选择烧结银的经验总结
    的头像 发表于 12-17 15:46 1316次阅读
    选择烧结银的<b class='flag-5'>经验总结</b>