简介:
香橙派官方github下载的全志sun50iw9系列Linux6.1内核下使用默认的配置文件linux_sunxi64_defconfig生成.config后编译会报错ac200_enable,sun50i_ehpy_calibrate_value等函数未定义。
链接:orangepi-xunlong/linux-orangepi at orange-pi-6.1-sun50iw9
现象:
下载解压缩以后生成默认.config
编译后就会看见如图报错
分析:
不想看碎碎念的话可以直接跳到下一节看怎么解决,这里主要提供一点debug思路
这个报错是以太网物理层的问题,根据图示的文件报错位置可以知道报错文件目录
打开这个文件可以知道报错的两个函数是通过这个头文件引入的,而这个头文件的位置在
内核根目录/include/linux/mfd
打开该头文件,发现具体的两个函数有其定义,如图
那么问题必定出在.c文件上,<linux/mfd/xxx>的头文件对应的驱动.c文件存放在
内核根目录/drivers/mfd
初步看是没有ac200.c这个文件的
但是不一定就没有这个定义了,因为ac200.h对应的源文件不一定叫做ac200.c,调用关系与文件名称无关,主要取决于.c文件里是否有include这个头文件,所以我们需要在当前目录搜索一下
grep -rn "ac200.h" ./*
发现这个头文件在sunxi-ac200.c中被引用,这个就是我们要找的文件
经搜索,其中确实有相应的定义(calibrate也一样定义了,这里不再放图
如果所有函数都有其定义,但是整合却找不到,那么就是编译规则有一定问题,经ls列举文件可以发现,我们要找的这个对应的文件并没有被编译成.o文件,所以问题出在Kconfig或者Makefile或者menuconfig上,我们依次查看
首先看Makefile中是否有对应内容
确定Makefile中有其内容,再查看Kconfig是否将其列举到了menuconfig进行配置编译,
回到内核根目录进入menuconfig,搜索对应的标签(有时候完整名称不一定能搜得出来,分别尝试一下AC200,MFD,X-Power之类的关键词即可)
可以看到叫做MFD_AC200的布尔量,其标签为"X-Powers AC200",就是我们想要的,并且此条没有被勾选,所以这就是问题所在
当然,如果不清楚这里为什么要这么排查的话,请阅读此篇内容
【Spiffo】知识细节:Kconfig、Menuconfig和Makefile之间的关系-CSDN博客
解决:
了解问题根源后就可以进行解决了,但是在debug的过程中还发现了其他的一些问题,也顺带修改一下
进入出现问题的目录
cd 内核源码根目录/drivers/net/phy
之前打开报错的sunxi-ephy.c这个文件,可以看到其逻辑并非协议级别,更像是特定设备的特定驱动,但是该目录下的Makefile如图,把它放在libphy这里就不是很合理,我们稍微修改一下
把这个删掉
在最后一行再补上
除此之外还需要在Kconfig中配置相应的内容,为了相对有条理,跟Makefile一样,把这个驱动的条目放在紧跟Xilinx驱动的后面,如图,tristate很有必要,其一是方便待会menuconfig查找,help则随意
完成上述步骤以后,回到内核源码根目录,menuconfig修改配置
同时,还需要勾选我们刚才查看的缺少的前置驱动,
配置完成以后保存并退出,清理目标路径,再次编译就能编译过了
编译通过并生成了对应的镜像
附加:
如果是用zero3、zero2w之类的板子,刚才配置menuconfig还需要勾选这个,不然网口物理层驱动还勾选编译以后才能用以太网口