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 开发板

相关推荐
AlfredZhao5 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346611 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪12 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
凡人叶枫1 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++
2601_961875241 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant