linux 系统移植(第十二期)---Linux 内核移植(1)--- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

[一、解压NXP官方Linux 源码](#一、解压NXP官方Linux 源码)

[二、编译NXP 官方开发板 Linux 内核](#二、编译NXP 官方开发板 Linux 内核)

[2.1、修改顶层 Makefile](#2.1、修改顶层 Makefile)

[2.2、配置并编译 Linux 内核](#2.2、配置并编译 Linux 内核)

[2.3Linux 内核启动测试](#2.3Linux 内核启动测试)

2.4、根文件系统缺失错误

[三、在 Linux 中添加自己的开发板](#三、在 Linux 中添加自己的开发板)

3.1、添加开发板默认配置文件

3.2、添加开发板对应的设备树文件

3.3编译测试

总结


前言

前两期我们简单了解了一下 Linux 内核顶层 Makefile 和 Linux 内核的启动流程,

本期我们就来介绍一下如何将 NXP官方提供的 Linux 内核移植到 I.MX6U-ALPHA 开发板上。 以此掌握如何将半导体厂商提供的 Linux BSP 包移植到我们自己的平台上。


一、解压NXP官方Linux 源码

这是我下载的NXP官方Linux 源码的文件:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

使用如下命令解压:

复制代码
sudo tar -jxvf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

下图就是解压之后的文件:

再用vscode软件打开,如下图

二、编译NXP 官方开发板 Linux 内核

NXP 官方提供的 Linux 源码已针对其 I.MX6ULL EVK 开发板完成适配,可直接稳定运行。因此我们将以 I.MX6ULL EVK 开发板作为基准参考,完成 Linux 内核向 I.MX6U-ALPHA 开发板的移植工作。

2.1、修改顶层 Makefile

修改顶层 Makefile,直接在顶层 Makefile 文件里面定义 ARCH 和 CROSS_COMPILE 这两

个的变量值为 arm 和 arm-linux-gnueabihf-,结果如下图所示:

上图中第 252 和 253 行分别设置了 ARCH 和 CROSS_COMPILE 这两个变量的值,这样在编译的时候就不用输入很长的命令了。

2.2、配置并编译 Linux 内核

和配置 UBoot 一样,编译 Linux 内核前也要先做配置。各个板子的默认配置文件都放在arch/arm/configs目录里,I.MX6ULL EVK 开发板可以用imx_v7_defconfig或者imx_v7_mfg_defconfig这两个配置文件。不过更建议用imx_v7_mfg_defconfig:一是它默认支持 I.MX6UL 芯片,二是用它编译出来的 zImage 能通过 NXP 官方的 MfgTool 工具烧写 ------ 文件名里的 "mfg" 就是指 MfgTool。

进入到 Ubuntu 中的 Linux 源码根目录下,执行如下命令配置 Linux 内核:

复制代码
make clean //第一次编译 Linux 内核之前先清理一下
make imx_v7_mfg_defconfig //配置 Linux 内核

配置完成以后如下图所示:

配置完之后就可以编译了,使用以下命令进行编译:

复制代码
make -j16

等待编译完成,结果如下图所示:

Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树

的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件,比如 imx6ull-14x14-evk.dtb

就是 NXP 官方的 I.MX6ULL EVK 开发板对应的设备树文件。至此我们得到两个文件:

①、Linux 内核镜像文件:zImage。

②、NXP 官方 I.MX6ULL EVK 开发板对应的设备树文件:imx6ull-14x14-evk.dtb。

2.3Linux 内核启动测试

在上一小节我们已经得到了 NXP 官方 I.MX6ULL EVK 开发板对应的 zImage 和 imx6ull-

14x14-evk.dtb 这两个文件。这两个文件能不能在正点原子的 I.MX6U-ALPHA EMMC 版开发板

上启动呢?测试一下不就知道了,在测试之前确保 uboot 中的环境变量 bootargs 内容如下:

复制代码
console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

将上一小节编译出来的 zImage 和 imx6ull-14x14-evk.dtb 复制到 Ubuntu 中的 tftp 目录下, 因为我们要在 uboot 中使用 tftp 命令将其下载到开发板中,拷贝命令如下:

复制代码
cp arch/arm/boot/zImage /home/duan/linux/tftpboot/ -f
cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /home/duan/linux/tftpboot/ -f

拷贝完成以后就可以测试了,启动开发板,进入 uboot 命令行模式,然后输入如下命令将zImage 和 imx6ull-14x14-evk.dtb 下载到开发板中并启动:

复制代码
tftp 80800000 zImage 
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

会发现报以下错误:

Linux启动遇到上述错误,那是因为没有根文件系统。

2.4、根文件系统缺失错误

Linux 内核启动后必须依赖根文件系统才能正常运行,而根文件系统的位置由 U-Boot 的 bootargs 环境变量指定。bootargs 会作为命令行参数传递给 Linux 内核,例如上一小节中我们设置的root=/dev/mmcblk1p2,就表示根文件系统存储在 EMMC 的第 2 个分区 /dev/mmcblk1p2 中。正点原子的 EMMC 版本开发板在出厂时,已在该分区预烧写了根文件系统,因此可以直接使用这个配置。

如果根文件系统缺失会报以下错误:

复制代码
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在。即使根文件系统目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。这个就是根文件系统缺失导致的内核崩溃,但是内核是启动了的,只是根文件系统不存在而已。

三、在 Linux 中添加自己的开发板

在上一小节中我们通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在I.MX6U-ALPHA 开发板的 EMMC 版本开发板启动,所以我们就参考 I.MX6ULL EVK 开发板的设置, 在 Linux 内核中添加 I.MX6U-ALPHA 开发板。

3.1、添加开发板默认配置文件

将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为

imx_alientek_emmc_defconfig,命令如下:

复制代码
cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig

打开 imx_alientek_emmc_defconfig 文件,找到"CONFIG_ARCH_MULTI_V6=y"这一行, 将其屏蔽掉,如下图所示:

因为 I.MX6ULL 是ARMV7架构的,因此要屏蔽掉V6 相关选项,否则后面做驱动实验的时候可能会遇到驱动模块无法加载的情况。

就可以用如下命令来配置 I.MX6U-ALPHA 开发板对应的Linux内核:

复制代码
make imx_alientek_emmc_defconfig

3.2、添加开发板对应的设备树文件

添加适合正点原子 EMMC 版开发板的设备树文件,进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-alientek-emmc.dts,命令如下:

复制代码
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-alientek-emmc.dts

创 建 好 以 后 我 们 还 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 " dtb-

$(CONFIG_SOC_IMX6ULL)"配置项,在此配置项中加入"imx6ull-alientek-emmc.dtb" ,如下

所示:

复制代码
400 dtb-$(CONFIG_SOC_IMX6ULL) += \
401 	imx6ull-14x14-ddr3-arm2.dtb \
402 	imx6ull-14x14-ddr3-arm2-adc.dtb \
403 	imx6ull-14x14-ddr3-arm2-cs42888.dtb \
404 	imx6ull-14x14-ddr3-arm2-ecspi.dtb \
405 	imx6ull-14x14-ddr3-arm2-emmc.dtb \
406 	imx6ull-14x14-ddr3-arm2-epdc.dtb \
407 	imx6ull-14x14-ddr3-arm2-flexcan2.dtb \
408 	imx6ull-14x14-ddr3-arm2-gpmi-weim.dtb \
409 	imx6ull-14x14-ddr3-arm2-lcdif.dtb \
410 	imx6ull-14x14-ddr3-arm2-ldo.dtb \
411 	imx6ull-14x14-ddr3-arm2-qspi.dtb \
412 	imx6ull-14x14-ddr3-arm2-qspi-all.dtb \
413 	imx6ull-14x14-ddr3-arm2-tsc.dtb \
414 	imx6ull-14x14-ddr3-arm2-uart2.dtb \
415 	imx6ull-14x14-ddr3-arm2-usb.dtb \
416 	imx6ull-14x14-ddr3-arm2-wm8958.dtb \
417 	imx6ull-14x14-evk.dtb \
418 	imx6ull-14x14-evk-btwifi.dtb \
419 	imx6ull-14x14-evk-emmc.dtb \
420 	imx6ull-14x14-evk-gpmi-weim.dtb \
421 	imx6ull-14x14-evk-usb-certi.dtb \
422 	imx6ull-alientek-emmc.dtb \
423 	imx6ull-9x9-evk.dtb \
424 	imx6ull-9x9-evk-btwifi.dtb \
425 	imx6ull-9x9-evk-ldo.dtb

第 422 行为"imx6ull-alientek-emmc.dtb",这样编译 Linux 的时候就可以从 imx6ull-alientek

emmc.dts 编译出 imx6ull-alientek-emmc.dtb 文件了。

3.3编译测试

接下来可以编译测试了,

可 以 创 建 一 个 编 译 脚 本 , imx6ull_alientek_emmc.sh,脚本内容如下:

复制代码
#!/bin/sh

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

第 2 行,清理工程。

第 3 行,使用默认配置文件 imx_alientek_emmc_defconfig 来配置 Linux 内核。

第 4 行,打开 Linux 的图形配置界面,如果不需要每次都打开图形配置界面可以删除此行。

第 5 行,编译 Linux。
执行 shell 脚本 imx6ull_alientek_emmc.sh 编译 Linux 内核,命令如下:

复制代码
chmod 777 imx6ull_alientek_emmc.sh  # 给予可执行权限
./imx6ull_alientek_emmc.sh          # 执行 shell 脚本编译内核

编译完成以后就会在目录 arch/arm/boot 下生成 zImage 镜像文件。在 arch/arm/boot/dts 目录

下生成 imx6ull-alientek-emmc.dtb 文件。将这两个文件拷贝到 tftp 目录下,然后重启开发板,在

uboot 命令模式中使用 tftp 命令下载这两个文件并启动,命令如下:

复制代码
tftp 80800000 zImage
tftp 83000000 imx6ull-alientek-emmc.dtb
bootz 80800000 -- 83000000

出现如下图所示,便是内核启动成功


Linux 内核启动成功,说明我们已经在 NXP 提供的 Linux 内核源码中添加了I.MX6UL-ALPHA 开发板。


总结

本期博客参考 I.MX6ULL EVK 开发板的设置, 在 Linux 内核中添加正点原子的 I.MX6U-ALPHA 开发板

相关推荐
chlk12320 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑21 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件21 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
崔小汤呀4 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端
何中应4 天前
vi编辑器使用
linux·后端·操作系统