开发平台:Ubuntu 18.04.6
目标平台:imx-6ull
kernel 版本:linux-imx-imx_5.4.70_2.3.0
编译工具链:gcc versions 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07 (arm-10.29))
# 环境搭建
# 交叉编译器
关于 arm linux 交叉编译工具链的搭建,这里就再不展开说明了,毕竟在此之前如果有移植过 uboot,那么这里就可以省略了,对于没有搭过交叉编译工具链的,可以查看上一篇 imx-6ULL uboot 移植 的交叉编译搭建的环节。
# kernel 源码
NXP 维护的 kernel 仓库地址:https://github.com/nxp-imx/linux-imx
获取 NXP kernel 5.4.70_2.3.0 版本的源码:
# 直接拉取 5.4.70_2.3.0 版本源码文件 | |
git clone -b imx_5.4.70_2.3.0 https://github.com/nxp-imx/linux-imx  | 
# 编译验证
sudo -s  | ||
export ARCH=arm  | ||
export CROSS_COMPILE=arm-none-linux-gnueabihf-  | ||
make distclean | ||
make imx_v7_defconfig | ||
make | 
第一次编译可能不会通过,如果出现以下报错:
HOSTCC scripts/extract-cert  | |
scripts/extract-cert.c:21:10: fatal error: openssl/bio.h: 没有那个文件或目录  | |
 #include <openssl/bio.h> | |
^~~~~~~~~~~~~~~  | 
则需要安装相应的依赖库:
sudo apt install libssl-dev  | 
出现:
/bin/sh: 1: lzop: not found | 
安装:
sudo apt install lzop  | 
最后再次编译验证,最后得到 arch/arm/boot 目录下的 zImage 内核文件以及 arch/arm/boot/dts 目录下所需的 .dtb 设备树文件。
# 移植
# 设备树文件
1、 imx6ull-14x14-lanjut-emmc.dts 文件:
ls arch/arm/boot/dts/*6ull*.dts | ||
arch/arm/boot/dts/imx6ull-14x14-evk-btwifi.dts  | ||
arch/arm/boot/dts/imx6ull-14x14-evk-btwifi-oob.dts  | ||
arch/arm/boot/dts/imx6ull-14x14-evk.dts  | ||
arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dts  | ||
arch/arm/boot/dts/imx6ull-14x14-evk-gpmi-weim.dts  | ||
arch/arm/boot/dts/imx6ull-9x9-evk-btwifi.dts  | ||
arch/arm/boot/dts/imx6ull-9x9-evk-btwifi-oob.dts  | ||
arch/arm/boot/dts/imx6ull-9x9-evk.dts  | ||
arch/arm/boot/dts/imx6ull-9x9-evk-ldo.dts  | ||
arch/arm/boot/dts/imx6ull-colibri-eval-v3.dts  | ||
arch/arm/boot/dts/imx6ull-colibri-wifi-eval-v3.dts  | ||
arch/arm/boot/dts/imx6ull-phytec-segin-ff-rdk-emmc.dts  | ||
arch/arm/boot/dts/imx6ull-phytec-segin-ff-rdk-nand.dts  | ||
arch/arm/boot/dts/imx6ull-phytec-segin-lc-rdk-nand.dts  | ||
cp arch/arm/boot/dts/imx6ull-14x14-evk-emmc.dts arch/arm/boot/dts/imx6ull-14x14-lanjut-emmc.dts | ||
vim arch/arm/boot/dts/imx6ull-14x14-lanjut-emmc.dts | 
修改:
把 #include "imx6ull-14x14-evk.dts" 更改为 #include "imx6ull-14x14-lanjut.dts" 。
2、 imx6ull-14x14-lanjut.dts 文件:
cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-14x14-lanjut.dts | ||
vim arch/arm/boot/dts/imx6ull-14x14-lanjut.dts | 
修改:
把 #include "imx6ul-14x14-evk.dtsi" 更改为 #include "imx6ull-14x14-lanjut.dtsi" ;
同时更改以下内容:
/ { | |
model = "i.MX6 ULL 14x14 EVK Board";  | |
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";  | |
};  | |
改为  | |
/ { | |
model = "i.MX6 ULL 14x14 LANJUT Board";  | |
compatible = "fsl,imx6ull-14x14-lanjut", "fsl,imx6ull";  | |
};  | 
把两个 status = "okay"; 改为 status = "disabled"; ,这里暂不需要摄像头驱动。
3、 imx6ull-14x14-lanjut.dtsi 文件:
cp arch/arm/boot/dts/imx6ul-14x14-evk.dtsi arch/arm/boot/dts/imx6ull-14x14-lanjut.dtsi | 
# 配置文件
在这里,imx6ull 的 kernel 默认配置文件为 imx_v7_defconfig ,因此,我们独立一个专属自己的配置文件:
cp arch/arm/configs/imx_v7_defconfig arch/arm/configs/imx_v7_lanjut_defconfig | 
修改:
去除其它芯片类型的设备树的生成  | |
CONFIG_SOC_IMX50=y  | |
CONFIG_SOC_IMX51=y  | |
CONFIG_SOC_IMX53=y  | |
CONFIG_SOC_IMX6Q=y  | |
CONFIG_SOC_IMX6SL=y  | |
CONFIG_SOC_IMX6SLL=y  | |
CONFIG_SOC_IMX6SX=y  | |
CONFIG_SOC_IMX6UL=y  | |
CONFIG_SOC_IMX7D=y  | |
CONFIG_SOC_IMX7ULP=y  | |
CONFIG_SOC_VF610=y  | |
改为  | |
# CONFIG_SOC_IMX50 is not set  | |
# CONFIG_SOC_IMX51 is not set  | |
# CONFIG_SOC_IMX53 is not set  | |
CONFIG_SOC_IMX6Q=y  | |
# CONFIG_SOC_IMX6SL is not set  | |
# CONFIG_SOC_IMX6SLL is not set  | |
CONFIG_SOC_IMX6SX=y  | |
CONFIG_SOC_IMX6UL=y  | |
CONFIG_SOC_IMX7D=y  | |
CONFIG_SOC_IMX7ULP=y  | |
# CONFIG_SOC_VF610 is not set  | 
这里除了 CONFIG_SOC_IMX6UL 还有几个是必须的,否则编译不过,还有其它关联的直接屏蔽:
# CONFIG_MTD_NAND_VF610_NFC=y  | |
# CONFIG_NVMEM_VF610_OCOTP=y  | 
最后,添加一个热插拔管理:
CONFIG_UEVENT_HELPER=y  | 
然后,这个配置文件其它东西我们就先不去更改了,因为内核配置太多太复杂了,它们之间的功能关系也很难分清,后面我们使用图形配置操作对需要的功能进行增删。
# 其它文件
为 Makefile 添加新增的文件编译:
vim arch/arm/boot/dts/Makefile | 
修改:
dtb-$(CONFIG_SOC_IMX6UL) += \  | |
imx6ul-14x14-evk.dtb \  | |
imx6ul-14x14-evk-csi.dtb \  | |
imx6ul-14x14-evk-emmc.dtb \  | |
imx6ul-14x14-evk-btwifi.dtb \  | |
imx6ul-14x14-evk-btwifi-oob.dtb \  | |
imx6ul-14x14-evk-ecspi-slave.dtb \  | |
imx6ul-14x14-evk-ecspi.dtb \  | |
imx6ul-14x14-evk-gpmi-weim.dtb \  | |
imx6ul-9x9-evk.dtb \  | |
imx6ul-9x9-evk-ldo.dtb \  | |
imx6ul-9x9-evk-btwifi.dtb \  | |
imx6ul-9x9-evk-btwifi-oob.dtb \  | |
imx6ul-ccimx6ulsbcexpress.dtb \  | |
imx6ul-ccimx6ulsbcpro.dtb \  | |
imx6ul-geam.dtb \  | |
imx6ul-isiot-emmc.dtb \  | |
imx6ul-isiot-nand.dtb \  | |
imx6ul-kontron-n6310-s.dtb \  | |
imx6ul-kontron-n6310-s-43.dtb \  | |
imx6ul-liteboard.dtb \  | |
imx6ul-opos6uldev.dtb \  | |
imx6ul-pico-hobbit.dtb \  | |
imx6ul-pico-pi.dtb \  | |
imx6ul-phytec-segin-ff-rdk-nand.dtb \  | |
imx6ul-tx6ul-0010.dtb \  | |
imx6ul-tx6ul-0011.dtb \  | |
imx6ul-tx6ul-mainboard.dtb \  | |
imx6ull-14x14-evk.dtb \  | |
imx6ull-14x14-evk-emmc.dtb \  | |
imx6ull-14x14-evk-btwifi.dtb \  | |
imx6ull-14x14-evk-btwifi-oob.dtb \  | |
imx6ull-14x14-evk-gpmi-weim.dtb \  | |
	imx6ull-14x14-lanjut-emmc.dtb \  # 将设备树文件添加进编译项 | |
imx6ull-9x9-evk.dtb \  | |
imx6ull-9x9-evk-ldo.dtb \  | |
imx6ull-9x9-evk-btwifi.dtb \  | |
imx6ull-9x9-evk-btwifi-oob.dtb \  | |
imx6ull-colibri-eval-v3.dtb \  | |
imx6ull-colibri-wifi-eval-v3.dtb \  | |
imx6ull-phytec-segin-ff-rdk-nand.dtb \  | |
imx6ull-phytec-segin-ff-rdk-emmc.dtb \  | |
imx6ull-phytec-segin-lc-rdk-nand.dtb \  | |
imx6ulz-14x14-evk.dtb \  | |
imx6ulz-14x14-evk-btwifi.dtb \  | |
imx6ulz-14x14-evk-gpmi-weim.dtb \  | |
imx6ulz-14x14-evk-emmc.dtb  | 
# 外设配置
这里不多阐述了,主要是根据你的硬件进行修改,是对设备树、功能配置、函数修改的操作。
# 配置内核
# 图形配置
需要先 make xxx_config 生成 .config 。
使用 make menuconfig 调出图形配置界面进行配置;如果 make menuconfig 失败,说明缺少 ncurses 库 ,需要安装 libncurses-dev ,在安装前则需要加载 libncurses-dev 的源镜像,然后通过 apt update 更新,然后再次使用命令 apt install libncurses-dev 安装,若安装后还不行,可能是由于某些库可能没安装好,或者被 auto remove 掉了,可以尝试以下安装:
apt install lib32ncurses5 lib32ncurses5-dev lib32ncursesw5 lib32ncursesw5-dev lib32tinfo-dev lib32tinfo5 libcunit1-ncurses libcunit1-ncurses-dev libncurses5 libncurses5-dbg libncurses5-dev libncursesw5 libncursesw5-dbg libncursesw5-dev  | 
当进入图形菜单后,可以通过以下热键进行选择:
Y显示为 [*] 。模块驱动编译到内核中,启动时自动加载。N显示为 [ ] 。移除该模块驱动。M显示为 [M] 。模块会被编译,但是不会被编译到内核中,只是生成.o/.ko文件,通过insmod命令实现动态加载。
note:如果想要 Load 加载原有的配置信息,那么需要先 make zImage 才能获取回来。
# 添加编译脚本
touch build.sh | ||
vim build.sh | 
写入:
#!/bin/bash | |
# 若之前已经导入到环境变量则不需要 | |
export PATH=$PATH:/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin  | |
# 若已经在顶层 Makefile 文件中指定则不需要 | |
export ARCH=arm  | |
# 若已经在顶层 Makefile 文件中指定则不需要 | |
export CROSS_COMPILE=arm-none-linux-gnueabihf-  | |
make distclean | |
make mx6ull_14x14_lanjut_emmc_defconfig | |
make zImage -j$(nproc)  | |
make dtbs -j$(nproc)  | |
make modules -j$(nproc)  | 
# 附
kernel 文件结构:
| 类型 | 名称 | 说明 | 
|---|---|---|
| 文件夹 | arch | 与架构体系相关 | 
| block | 块设备相关 | |
| certs | 内核签名相关 | |
| crypto | 加密相关 | |
| Documentation | 各说明文档 | |
| drivers | 驱动相关 | |
| fs | 文件系统相关 | |
| include | 头文件相关 | |
| init | 初始化相关 | |
| ipc | 进程间通信相关 | |
| kernel | 内核相关 | |
| lib | lib 库文件 | |
| LICENSES | 许可证相关 | |
| mm | 内存管理相关 | |
| net | 网络相关 | |
| samples | 例程相关 | |
| scripts | 相关脚本 | |
| security | 内核安全模型相关 | |
| sound | 音频处理相关 | |
| tools | kernel 构建工具相关 | |
| usr | 早期用户空间代码(与 initramfs 文件相关) | |
| virt | 内核虚拟机 KVM | |
| 文件 | COPYING | 版权声明 | 
| CREDITS | 贡献者名单 | |
| Kbuild | Makefile 引用文件 | |
| Kconfig | 图形配置界面相关文件 | |
| MAINTAINERS | 开发及维护记录 | |
| Makefile | 主 Makefile 脚本 | |
| README | 工程说明 |