微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

驱动移植中遇到的问题

仅限于学习用,不足之处,请多多指教

        最近因为项目需求,第一次进行不同linux系统间的驱动移植,想和大家分享一下这个过程中遇到的问题。(下文中的B、xx等均是代号)

任务:把AD公司linux的ad7173.c驱动移植到B-linux

        (获取驱动的途径:https://github.com/analogdevicesinc/linux/blob/2017_R1/drivers/iio/adc/ad7173.c)

        把ad7173.c和相应的Makefile放在文件夹aa下,对ad7173.c进行模块编译,发现有很多error(如图一,只截取了部分) 。

图一

        将报错的地方复制到github(analogdevicesinc/linux)上,查找它们最开始被定义的地方,发现均在头文件xx.h处被定义。于是对比了AD公司linux上的xx.h和B-linux上的xx.h,发现两个xx.h代码有些许差别,如:同名函数的形参个数不同。遵循不修改linux内核的原则,我尝试修改了ad7173.c,消除几个error之后,发现无法再通过修改ad7173.c让编译通过。于是在老工程师的指导下,我把xx.h拉到了文件夹aa,并在ad7173.c里修改了xx.h的include路径,这次编译没有红色error,但是出现了warning(如图二)。

图二

        尝试忽略这些warning,然后把编译好的ad7173.ko文件移到板卡上,使用指令“insmod ad7173.ko”安装模块,有error(如图三),意思是“模块中有未知符号”,应该就是编译时显示的warning所致。在板卡处使用指令“dmesg | grep ad7173”可以查询到报错的详细原因(如图四),发现就是waring里提到的几个没有定义的函数,说明编译时出现的warning必须解决,无法忽略。

图三

图四

        提示warning的原因是驱动在内核里找不到这几个函数的定义,一开始我怀疑是B-linux里又少了东西,于是在 github(analogdevicesinc/linux)上又查了下warning提到的函数在哪个文件被定义,发现均在xx.c文件下定义,以为是xx.c include的头文件问题,进行排查,发现不是头文件的问题。

        在网上查了下“UnkNown symbol”的情况该怎么处理,看到一篇文章,里面说得比较详细,包括了标志已经编进内核、标志尚未编进内核两种情况该怎么处理,根据里面的步骤,我是属于第二种情况——标志尚未被编进内核。

(文章链接https://blog.csdn.net/gatieme/article/details/48979427#:~:text=%E5%87%BA%E7%8E%B0Unknown%20symbol%20in%20module%EF%BC%8C%E5%85%B6%E6%9C%AC%E8%B4%A8%E5%B0%B1%E6%98%AF%E6%A8%A1%E5%9D%97%E5%9C%A8%E5%8A%A0%E8%BD%BD%E8%BF%87%E7%A8%8B%E4%B8%AD%EF%BC%8C%E6%89%BE%E4%B8%8D%E5%88%B0%E5%87%BD%E6%95%B0%E7%9A%84%E5%9C%B0%E5%9D%80,%E9%82%A3%E4%B9%88%E6%88%91%E4%BB%AC%E5%B0%B1%E6%9F%A5%E6%89%BE%20System.map%20%E5%92%8C%E5%87%BD%E6%95%B0%E5%A3%B0%E6%98%8E%E5%92%8C%E5%AE%9A%E4%B9%89%E7%9A%84%E5%9C%B0%E6%96%B9%E6%97%B6%E5%80%99%E7%94%A8%20EXPORT_SYMBOL)

        打开xx.c所在文件夹中的Kconfig,找到“config xx”,在原有的内容后面加上一句“default y”,然后重新编译内核,再重新编译ad7173.c,得到新的ad7173.ko,没有warning(编译结果如图五)。

图五

         把新的ad7173.ko移到板卡上,再次使用指令“insmod ad7173.ko”,还是提示“UnkNown symbol”,为什么呢?猛地想起,没有给板卡更换内核uImage。加载模块时,板卡的内核需要与编译内核模块时使用的内核一致。于是麻溜地更新了板卡内核并reboot,再次加载内核就成功了,使用指令“lsmod”查看(如图六)。

图六

         最后还是动了linux内核里的东西,再找找有没有不动内核的解决办法。

本贴仅供学习研究使用,请勿将其用作任何实际用途,否则后果自负,作者将不为其承担任何法律责任

原文地址:https://www.jb51.cc/wenti/3281471.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐