开发平台: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内核相关
liblib 库文件
LICENSES许可证相关
mm内存管理相关
net网络相关
samples例程相关
scripts相关脚本
security内核安全模型相关
sound音频处理相关
toolskernel 构建工具相关
usr早期用户空间代码(与 initramfs 文件相关)
virt内核虚拟机 KVM
文件COPYING版权声明
CREDITS贡献者名单
KbuildMakefile 引用文件
Kconfig图形配置界面相关文件
MAINTAINERS开发及维护记录
Makefile主 Makefile 脚本
README工程说明
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

夏沫の浅雨 微信支付

微信支付

夏沫の浅雨 支付宝

支付宝