2.落实到当前开发板
落实到当前开发板和当前内核中来分析,当前我们移植的目标开发板使用S5PV210的CPU,开发
板名字叫X210.我们在三星官方版本的内核中是找不到mach-x210.c的,所以我们又不想从零开始
去移植,因此我们的思路是在三星移植的mach-s5pv210目录下找一个mach-xx.c,这个开发板和我
们的X210开发板最为接近,然后以此为基础来移植。
经过查看,发现mach-s5pc110.c和mach-s5pv210.c和我们的X210开发板最为接近。我们一般确定
的一个原则是:看我们的开发板和三星官方的哪个开发板最为相似。我们的X210开发板抄的是三
星的SMDKV210,因此要找这个对应的那个文件。
结合mach-s5pv210目录下的Makefile来分析,得知.config中定义了CONFIG_MACH_SMDKV210
后,实际绑定的是mach-smdkc110.c这个文件。所以实际上mach-smdkv210.c这个文件根本没用
到。启示就是不要光看名字。
3.解决内核启动中的错误
内核启动后会有打印信息,打印信息中隐藏了问题所在。认真的去分析这个打印信息,从中找到对
的或者错误的一些信息片段,才能帮助我们找到问题,从而解决问题。
内核启动中的错误信息有一些特征:
Unable to handle kernel NULL pointer dereference at virtual address 00000060
Internal error: Oops: 5 [#1] PREEMPT (看到Oops说明内核已经死了)
出错的地方:
PC is at dev_driver_string+0xc/0x44
LR is at max8698_pmic_probe+0x150/0x32c
从以上错误信息中的PC和LR的值可以看出,程序是执行到dev_driver_string或者
max8698_pmic_probe(这两个是函数或者汇编中的标号)符号部分的时候出错了。
4.错误追溯及问题解决
max8698_pmic_probe看名字是max8698这个电源管理IC的驱动安装函数部分出错了,应该是我们
的开发板系统中配置了支持这个电源管理IC,于是乎启动时去加载他的驱动,结果驱动在加载执行
的过程中出错了OOPS了。
结合我们X210开发板的硬件实际情况来分析:我们X210开发板上根本就没有max8698这个电源管
理IC,既然硬件都没有驱动执行了肯定会出错。
在uboot中是直接改源代码屏蔽掉那个初始化函数解决的;在内核中不能这么干?因为linux kernel
是高度模块化高度可配置的,内核中每一个模块都是被配置项条件编译了的,因此要去掉某个模块
的支持,只需要重新配置去掉选项即可,不用改源代码。所以我们的关键就是要找它对应的配置
项。
make menuconfig,然后/搜索"MAX8698"这几个关键字
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!