向 Linux 内核中添加 mach-xxx 记录( 从零配置SOC内核支持 )
前言
在linux内核arch/arm目录下添加 mach-xxx 的记录。mach-xxx芯片厂商添加的硬件平台,每一个mach-xxx都是一个设备。(下文以 imx6ull 开发板的 mach-imx 为基础修改而来)
1. 添加流程
-
创建 mach-xxx
在arch/arm目录下创建mach-asu文件夹,将修改后的 mach-imx文件内容复制到mach-xxx中(记得备份mach-imx)。
-
在 arch/arm/Kconfig 中添加 mach-xxx 地址,如下图所示
3. 在 arch/arm/mach-xxx/Mackfile 的 obj-$(CONFIG_SOC_IMX6UL) 中添加 编译脚本生成文件asu-clk-imx6ull.o,如下图所示(Makefile修改过,NXP行数在118行)
注:因为 asu-clk-imx6ull.c 是我写的时钟驱动所以需要添加编译出.o文件,直接使用NXP时钟驱动不需要修改第3点。
- 在 arch/arm/mach-xxx/Kconfig 中修改 source 地址,如下图所示:
5. 在arch/arm/Makefile 中搜索 imx 替换为 asu 即可
2. debug过程
上述第一节的1-4步比较简单,根据报错信息进行修改即可,主要是第5步相较多了一个弯弯,下面把第5步debug过程记录一下,首先看下第5步的报错信息,如下图:
从上图看出设备树已经编译完成,并且经过1-4步的修改后内核中已经没有 mach-imx 目录,但是编译还是进入到该目录。进入到报错提示的Makefile.modbuiltin文件中查看,内容如下所示:
这里的 kbuild-dir 和 kbuild-file 就是寻找地址中(地址来源后面去说)的Makefile,然后 include $(kbuild-file) 包含起来。
这里打印详细的 $(kbuild-file) 信息,添加 $(warning warn: $(kbuild-file)) 重新编译,如下:
打印内容如下:
打印信息可以看出,是在 arch/arm/mach-imx/Makefile 这块卡住了,把路径转向mach-asu才可以。
既然问题是在 mach-imx 这一层,那定义这个路径的定义肯定在它的上层,所以这次从 arch/arm 下开始debug。
在 arch/arm/Makefile 中发现对机器目录名的定义:
# Machine directory name. This list is sorted alphanumerically
# by CONFIG_* macro name.
machine-$(CONFIG_ARCH_ALPINE) += alpine
machine-$(CONFIG_ARCH_AT91) += at91
...
machine-$(CONFIG_ARCH_MXC) += imx
...
ifneq ($(machine-y),)
MACHINE := arch/arm/mach-$(word 1,$(machine-y))/
...
在 .config 文件中 CONFIG_ARCH_MXC = y
MACHINE := arch/arm/mach-$(word 1,$(machine-y))
#可以解析为:
MACHINE :=arch/arm/mach-imx
# 将 imx 换为 asu 机器目录就转为了 arch/arm/mach-xxx
machine-$(CONFIG_ARCH_MXC) += xxx
上述步骤修改完后就将Linux内核中的 mach-imx 更换为 mach-xxx 了。