开发平台: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 | 工程说明 |