目录
一、前言
二、 问题现象
三、问题排查思路1:问题所在处向上排查
3.1 整体思路
3.2 排查过程
3.3 资料查询
3.4 尝试动作1:开启相应配置项
3.4.1 检查内核配置项
3.4.2 开启配置项
3.4.3 尝试编译
四、问题排查思路2:从上向下排查
4.1 整体思路
4.2 对比linux内核工程
4.3 对比文件
4.4 尝试排查问题
4.4.1 尝试关闭 CPU idle PM support
五、写在最后
5.1 问题解决
5.2 总结
一、前言
二、 问题现象
三、问题排查思路1:问题所在处向上排查
3.1 整体思路
3.2 排查过程
1、make manuconfig内检索ldo2p5、ldo2等。
2、定位出错文件
内核代码目录下检索调用ldo2p5_dummy_probe函数的文件
grep -R "ldo2p5_dummy_probe"
3.3 资料查询
-
1. 缺少相关的头文件:确保你的代码中包含了正确的头文件。regulator_register 函数的原型通常在 <linux/regulator/consumer.h> 或者 <linux/regulator/regulator.h> 中声明。请检查你的代码中是否包含了这些头文件。
-
2. 配置选项未启用:某些内核配置选项可能会禁用电压调节器子系统,导致 regulator_register 函数未定义。确保你的内核配置中启用了相关的配置选项,例如 CONFIG_REGULATOR 或 CONFIG_REGULATOR_USERSPACE_CONSUMER。你可以通过 make menuconfig 或者 make xconfig 等命令来打开内核配置界面,检查并启用相应的选项。
-
3. 编译顺序问题:如果你的代码是作为内核模块进行编译的,并且依赖于 regulator_register 函数,确保你正确地在 Makefile 中指定了依赖的模块。在 Makefile 中,你需要将依赖的模块添加到 obj-m 或 obj-y 变量中,以确保编译顺序正确。
-
4. 内核版本问题:某些函数或符号可能在不同的内核版本中有所不同。如果你使用的是较旧的内核版本,而你的代码是基于较新的内核版本编写的,那么 regulator_register 可能不存在。请确保你的代码与当前使用的内核版本兼容。
3.4 尝试动作1:开启相应配置项
3.4.1 检查内核配置项
可以看到显然该项配置没有开启。通过检查该项的开启条件,针对imx平台需要满足如下依赖配置
DRM_MSM [=n] && HAS_IOMEM [=y] && DRM [=y] && (ARCH_QCOM [=n] || ARM [=y] && COMPILE_TEST [=n]) && OF [=y] && COMMON_CLK [=y]
逐项解释一下各依赖项的作用
-
COMPILE_TEST 编译不能加载的驱动程序
-
DRM_MSM (没明白什么作用)
3.4.2 开启配置项
1、COMPILE_TEST配置项
通过General setup -> Compile also drivers which will not load 即可开启该配置
2、DRM_MSM 配置项
开启COMPILE_TEST后,DRM_MSM自动也开启了配置项
3、CONFIG_REGULATOR配置项
开启COMPILE_TEST后,CONFIG_REGULATOR自动也开启了配置项
3.4.3 尝试编译
修改完上述内核配置后,尝试编译内核看能否编译通过。
四、问题排查思路2:从上向下排查
4.1 整体思路
4.2 对比linux内核工程
-
原厂提供的正常编译的工程:{dir}/alientek_linux/
-
修改过的编译不通过的工程:{dir}/temp_20221223/
cd {dir}
diff -r alientek_linux/ temp_20221223/ > diff.log
4.3 对比文件
4.4 尝试排查问题
由于根据两个工程的对比文件diff.log,能够看出修改的内容,将异常工程一步步修改并且编译测试,知道内核异常消除。
这个过程比较漫长,下面仅列出两个个测试项目,后续不再赘述。
4.4.1 尝试关闭 CPU idle PM support
1、内核配置路径:通过关闭→ CPU Power Management → CPU Idle ->CPU idle PM support。再次编译
2、结果:仍然存在同样的报错
4.4.2 尝试关闭Suspend to RAM and standby、 Device power management core functionality
1、内核配置项路径:
→ Power management options -> Suspend to RAM and standby
→ Power management options-> Device power management core functionality
2、结果:
会报如下错误,显然关闭pm(power manager)相关功能,需要有相应的修改。
-
wl_cfg80211是什么? 在 Linux 内核中,cfg80211 是一个用于无线配置的 API 接口。它提供了与无线设备和无线网络配置相关的功能和接口
-
'struct wiphy'在无线配置中起到的作用? struct wiphy 是用于表示无线设备的结构体,在 Linux 内核中负责管理无线网络的配置和操作
-
'wowlan'在其中起到什么作用? wowlan 是其中的一个成员,用于配置和管理设备的 Wake-on-Wireless LAN(WoWLAN)功能,即通过无线网络唤醒设备
五、写在最后
5.1 问题解决
经过通过排查思路二,即自上向下的排查,经过漫长的排查后,终于内核工程编译通过。
5.2 总结
这篇文章针对内核配置后编译异常提出了两个不同的排查思路,各位同学开发过程中显然会遇到各式各样的问题,看文章过程中,其实很多情况下与自身遇到的问题还是有一些不同的,所以我们更应该从文章中学习其排查方式、排查思路、思考逻辑,这样才能更具有通用性。而且遇到问题时,多思考是否有不同的路,多尝试。
当然上面的排查过程路子也是有点不正规,欢迎各位老哥进行交流指教!