设备驱动调试和移植的一般方法-程序员宅基地

技术标签: 操作系统  嵌入式  

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

 

 

一、 检查应用程序是否可以正常使用

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

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

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

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

行添加、删除和修改。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

补充说明

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

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

这句话有点拗口了,举个例子来讲吧。例如,你现在要移植一份驱动到g-sensor(BMA250E)上,你现在就应该尽可能

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

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

l   开发板的原理图

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

l   万用表和示波器

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

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

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

转载于:https://www.cnblogs.com/welhzh/p/4786934.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dielucui7698/article/details/101400960

智能推荐

hive使用适用场景_大数据入门:Hive应用场景-程序员宅基地

文章浏览阅读5.8k次。在大数据的发展当中,大数据技术生态的组件,也在不断地拓展开来,而其中的Hive组件,作为Hadoop的数据仓库工具,可以实现对Hadoop集群当中的大规模数据进行相应的数据处理。今天我们的大数据入门分享,就主要来讲讲,Hive应用场景。关于Hive,首先需要明确的一点就是,Hive并非数据库,Hive所提供的数据存储、查询和分析功能,本质上来说,并非传统数据库所提供的存储、查询、分析功能。Hive..._hive应用场景

zblog采集-织梦全自动采集插件-织梦免费采集插件_zblog 网页采集插件-程序员宅基地

文章浏览阅读496次。Zblog是由Zblog开发团队开发的一款小巧而强大的基于Asp和PHP平台的开源程序,但是插件市场上的Zblog采集插件,没有一款能打的,要么就是没有SEO文章内容处理,要么就是功能单一。很少有适合SEO站长的Zblog采集。人们都知道Zblog采集接口都是对Zblog采集不熟悉的人做的,很多人采取模拟登陆的方法进行发布文章,也有很多人直接操作数据库发布文章,然而这些都或多或少的产生各种问题,发布速度慢、文章内容未经严格过滤,导致安全性问题、不能发Tag、不能自动创建分类等。但是使用Zblog采._zblog 网页采集插件

Flink学习四:提交Flink运行job_flink定时运行job-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏2次。restUI页面提交1.1 添加上传jar包1.2 提交任务job1.3 查看提交的任务2. 命令行提交./flink-1.9.3/bin/flink run -c com.qu.wc.StreamWordCount -p 2 FlinkTutorial-1.0-SNAPSHOT.jar3. 命令行查看正在运行的job./flink-1.9.3/bin/flink list4. 命令行查看所有job./flink-1.9.3/bin/flink list --all._flink定时运行job

STM32-LED闪烁项目总结_嵌入式stm32闪烁led实验总结-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏6次。这个项目是基于STM32的LED闪烁项目,主要目的是让学习者熟悉STM32的基本操作和编程方法。在这个项目中,我们将使用STM32作为控制器,通过对GPIO口的控制实现LED灯的闪烁。这个STM32 LED闪烁的项目是一个非常简单的入门项目,但它可以帮助学习者熟悉STM32的编程方法和GPIO口的使用。在这个项目中,我们通过对GPIO口的控制实现了LED灯的闪烁。LED闪烁是STM32入门课程的基础操作之一,它旨在教学生如何使用STM32开发板控制LED灯的闪烁。_嵌入式stm32闪烁led实验总结

Debezium安装部署和将服务托管到systemctl-程序员宅基地

文章浏览阅读63次。本文介绍了安装和部署Debezium的详细步骤,并演示了如何将Debezium服务托管到systemctl以进行方便的管理。本文将详细介绍如何安装和部署Debezium,并将其服务托管到systemctl。解压缩后,将得到一个名为"debezium"的目录,其中包含Debezium的二进制文件和其他必要的资源。注意替换"ExecStart"中的"/path/to/debezium"为实际的Debezium目录路径。接下来,需要下载Debezium的压缩包,并将其解压到所需的目录。

Android 控制屏幕唤醒常亮或熄灭_android实现拿起手机亮屏-程序员宅基地

文章浏览阅读4.4k次。需求:在诗词曲文项目中,诗词整篇朗读的时候,文章没有读完会因为屏幕熄灭停止朗读。要求:在文章没有朗读完毕之前屏幕常亮,读完以后屏幕常亮关闭;1.权限配置:设置电源管理的权限。

随便推点

目标检测简介-程序员宅基地

文章浏览阅读2.3k次。目标检测简介、评估标准、经典算法_目标检测

记SQL server安装后无法连接127.0.0.1解决方法_sqlserver 127 0 01 无法连接-程序员宅基地

文章浏览阅读6.3k次,点赞4次,收藏9次。实训时需要安装SQL server2008 R所以我上网上找了一个.exe 的安装包链接:https://pan.baidu.com/s/1_FkhB8XJy3Js_rFADhdtmA提取码:ztki注:解压后1.04G安装时Microsoft需下载.NET,更新安装后会自动安装如下:点击第一个傻瓜式安装,唯一注意的是在修改路径的时候如下不可修改:到安装实例的时候就可以修改啦数据..._sqlserver 127 0 01 无法连接

js 获取对象的所有key值,用来遍历_js 遍历对象的key-程序员宅基地

文章浏览阅读7.4k次。1. Object.keys(item); 获取到了key之后就可以遍历的时候直接使用这个进行遍历所有的key跟valuevar infoItem={ name:'xiaowu', age:'18',}//的出来的keys就是[name,age]var keys=Object.keys(infoItem);2. 通常用于以下实力中 <div *ngFor="let item of keys"> <div>{{item}}.._js 遍历对象的key

粒子群算法(PSO)求解路径规划_粒子群算法路径规划-程序员宅基地

文章浏览阅读2.2w次,点赞51次,收藏310次。粒子群算法求解路径规划路径规划问题描述    给定环境信息,如果该环境内有障碍物,寻求起始点到目标点的最短路径, 并且路径不能与障碍物相交,如图 1.1.1 所示。1.2 粒子群算法求解1.2.1 求解思路    粒子群优化算法(PSO),粒子群中的每一个粒子都代表一个问题的可能解, 通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性。    在路径规划中,我们将每一条路径规划为一个粒子,每个粒子群群有 n 个粒 子,即有 n 条路径,同时,每个粒子又有 m 个染色体,即中间过渡点的_粒子群算法路径规划

量化评价:稳健的业绩评价指标_rar 海龟-程序员宅基地

文章浏览阅读353次。所谓稳健的评估指标,是指在评估的过程中数据的轻微变化并不会显著的影响一个统计指标。而不稳健的评估指标则相反,在对交易系统进行回测时,参数值的轻微变化会带来不稳健指标的大幅变化。对于不稳健的评估指标,任何对数据有影响的因素都会对测试结果产生过大的影响,这很容易导致数据过拟合。_rar 海龟

IAP在ARM Cortex-M3微控制器实现原理_value line devices connectivity line devices-程序员宅基地

文章浏览阅读607次,点赞2次,收藏7次。–基于STM32F103ZET6的UART通讯实现一、什么是IAP,为什么要IAPIAP即为In Application Programming(在应用中编程),一般情况下,以STM32F10x系列芯片为主控制器的设备在出厂时就已经使用J-Link仿真器将应用代码烧录了,如果在设备使用过程中需要进行应用代码的更换、升级等操作的话,则可能需要将设备返回原厂并拆解出来再使用J-Link重新烧录代码,这就增加了很多不必要的麻烦。站在用户的角度来说,就是能让用户自己来更换设备里边的代码程序而厂家这边只需要提供给_value line devices connectivity line devices