0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何移植Linux内核到I.MX6ULL开发板上

玩转单片机 来源:玩转单片机 作者:noah 2022-10-10 14:47 次阅读

上篇讲了如何移植 uboot 到 I.MX6ULL开发板上,现在开始学习如何移植 Linux 内核。

|获取Linux 内核

Linux 由 Linux 基金会管理与发布,所以你想获取最新的Linux 版本就可以在这个网站上下载;

32666e44-485a-11ed-a3b6-dac502259ad0.png

4.x 版本的 Linux 和 5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。

NXP 会从 https://www.kernel.org 下载某个版本的 Linux 内核,然后将其移植到自己的 CPU上,测试成功以后就会将其开放给 NXP 的 CPU 开发者

开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。

NXP 提供的 Linux 源码可以在原子公开资料包中找到,路径如下:

开发板光盘->1、例程源码->4、NXP 官方原版 Uboot和 Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

|编译Linux内核

编译内核之前需要先在 ubuntu 上安装 lzop 库,否则内核编译会失败!命令如下:

sudo apt-get install lzop


//下面两个库如果没安装也需要安装一下
sudoapt-getinstallbuild-essential
sudo apt-get install libncurses5-dev


// 查看是否安装
dpkg -s build-essential
dpkg -s libncurses5-dev

32913fa2-485a-11ed-a3b6-dac502259ad0.png

新建一个文件夹(nxp_linux),然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为:

tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

解压后的文件如下:

32b13d7a-485a-11ed-a3b6-dac502259ad0.png

编译Linux内核之前要先配置Linux内核。每个板子都有其对应的默认配置文件,这些配置文件保存在“arch/arm/configs”目录中。

imx_v7_defconfig和imx_v7_mfg_defconfig都可以作为NXP官方开发板IMX6ULL EVK的默认配置文件,但是一般都使用后者,因为后者编译出来的zImage可以通过NXP官方提供的MfgTool工具进行烧写;

在目录下新建一个脚本文件(build.sh),然后在这个 shell 脚本里面输入如下所示内容:

#!/bin/sh
#编译之前先清理
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean   
#配置Linux内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig 
#编译Linux内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

32c69c7e-485a-11ed-a3b6-dac502259ad0.png

给予该脚本可执行权限,命令如下:

chmod777build.sh

运行脚本编译内核,命令如下:

. build.sh

32f03a52-485a-11ed-a3b6-dac502259ad0.png

编译完成后,会得到两个重要文件:

Linux内核镜像文件:
存放路径为 arch/arm/boot/zImage


IMX6ULL EVK开发板对应的设备树文件:
存放路径为 arch/arm/boot/dts/imx6ull-14x14-evk.dtb

vmlinux 、Image ,zImage 、uImage 的区别:

vmlinux是ELF格式的文件,是编译出来的最原始的内核文件,编译出来差不多有16MB,是未压缩的。在实际中我们不会使用vmlinux,而是使用zImage或uImage这样的 Linux 内核镜像文件。


Image是Linux内核镜像文件,但是Image仅包含可执行的二进制数据。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的,Image保存在arch/arm/boot目录下,其大小大概在12MB 。


zImage是经过gzip压缩后的Image,经过压缩以后其大小大概在6MB左右。


uImage是老版本uboot专用的镜像文件,uImag是在zImage前面加了一个长度为 64字节的“头” ,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的uboot已经支持了 zImage 启动!所以已经很少用到uImage了

|内核启动测试

将生成的zImage和imx6ull-14x14-evk.dtb这两个文件下载到IMX6U开发板上进行测试。

首先检查uboot中的环境变量bootargs,如果环境变量异常请看上一篇推文配置:

33257b0e-485a-11ed-a3b6-dac502259ad0.png

然后拷贝zImage和imx6ull-14x14-evk.dtb这两个文件到Ubuntu的tftp目录下:

33450474-485a-11ed-a3b6-dac502259ad0.png

最后启动开发板,进入uboot命令行模式,输入如下命令以上两个文件下载到开发板中并启动:

tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-evk.dtb
bootz 80800000 - 83000000

336e1e2c-485a-11ed-a3b6-dac502259ad0.png

启动成功,但是触摸不能使用

|根文件系统缺失错误

Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的 bootargs环境变量指定,bootargs会传递给Linux内核作为命令行参数

上一篇推文设置root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2 中,也就是 EMMC 的分区2中。

在实际的工作中开发一个产品,这个产品的第一版硬件出来以后我们是没有对应的根文件系统可用的,必须要自己做根文件系统。

在构建出对应的根文件系统之前 Linux 内核是没有根文件系统可用的,此时 Linux 内核启动以后会出现下面提示:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
也就是提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统,因为根文件系统目录不存在。

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

|在 Linux 中添加自己的开发板

通过编译 NXP 官方 I.MX6ULL EVK 开发板对应的 Linux 内核,发现其可以在野火的 EMMC 版本开发板启动,所以就参考 I.MX6ULL EVK 开发板的设置,在 Linux 内核中添加自己的 I.MX6U 开发板。

先压缩备份NXP编译出来的内核源码文件,避免操作有误重新编译内核,毕竟编译一次内核比较耗时间;

340620be-485a-11ed-a3b6-dac502259ad0.png

添加开发板默认配置文件

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

cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_myboard_emmc_defconfig

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

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

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-myboard-emmc.dts

.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件。imx6ull-myboard-emmc.dts创 建 好 以 后还 需 要 修 改 文 件Makefile;

路径:arch/arm/boot/dts/Makefile
找到“ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-myboard-emmc.dtb” ,如下所示:

341ab934-485a-11ed-a3b6-dac502259ad0.png

这样编译 Linux 的时候就可以从imx6ull-myboard-emmc.dts编译出 imx6ull-myboard-emmc.dtb 文件了。

添加新的脚本

新建一个脚本文件(build_myboard.sh),脚本内容如下:

#!/bin/sh
#编译之前先清理
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
#配置Linux内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_emmc_defconfig
#编译Linux内核
makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf-all-j16

给予该脚本可执行权限,命令如下:

chmod777build_myboard.sh

运行脚本编译内核,命令如下:

. build_myboard.sh

编译完成后,会得到两个重要文件:

Linux内核镜像文件:
存放路径为 arch/arm/boot/zImage


IMX6ULL EVK开发板对应的设备树文件:
存放路径为 arch/arm/boot/dts/imx6ull-myboard-emmc.dtb

然后下载到开发板,启动内核即可,显示登陆提示就说明内核启动成功。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Uboot
    +关注

    关注

    4

    文章

    123

    浏览量

    27874
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • Ubuntu系统
    +关注

    关注

    0

    文章

    84

    浏览量

    3785

原文标题:i.MX6ULL|移植内核

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    i.MX6ULL嵌入式Linux开发1-uboot移植初探

    本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括嵌入式Linux
    的头像 发表于 03-07 08:57 3485次阅读
    <b class='flag-5'>i.MX6ULL</b>嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>1-uboot<b class='flag-5'>移植</b>初探

    移植NXP官方linux 5.4内核i.MX6ULL开发板

    本文描述移植NXP官方 linux 5.4 内核i.MX6ULL开发板
    发表于 12-19 11:10 1554次阅读

    i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?

    i.MX6UL/i.MX6ULL开发常见问题》基于米尔电子 i.MX6UL/i.MX6ULL产品(V.10)2.3单独编译
    发表于 07-01 17:50

    I.MX6ULL终结者开发板支持JTAG调试

    i.MX6ULL终结者开发板的JTAG接口,如下图所示: 由于i.MX6ULL芯片的JTAG接口和SAI(声卡)是复用的,所以我们使用JTAG接口的时候需要修改下开发板(V1.0的底板
    发表于 04-26 15:11

    迅为I.MX6ULL终结者开发板支持JTAG调试

    ”方式编译该工程。我们可以点击工具栏的“Make”按钮,编译该工程,如下图所示:从上图的编译结果输出信息,我们可以看到编译成功。然后我们连接JLNIK V9下载器i.MX6ULL终结者开发
    发表于 05-06 14:09

    移植5.4内核迅为I.MX6ULL开发板

    编译器的搭建,可以参考“i.mx6ull终结者开发板使用手册”的4.3章节“搭建交叉编译环境”和29.1章节 安装第三方库。编译内核为了编译方便,我们可以创建一个脚本,我们在命令行输入“vi
    发表于 06-29 10:13

    i.MX6ULL开发板Linux学习-资料详情一览表

    进行代码修改的完整过程,最终实现适配到IMX6ULL开发板。充分掌握Linux内核的具体移植
    发表于 07-02 11:24

    I.MX6ULL终结者开发板裸机仿真jlink调试

    I.MX6ULL‘终结者’开发板预留了JTAG仿真接口,并给出了开发文档,可以实现在JLINK仿真器条件下的单步跟踪、断点调试等功能,使得开发研究i
    发表于 07-07 10:56

    编译IMX6ULL开发板的Uboot和Linux内核

    I.MX6ULL终结者开发板对应的Linux内核源码在光盘资料的“i.MX6UL终结者光盘资料5_uboot
    发表于 07-15 10:47

    i.MX6ULL开发板硬件资源

    迅为i.MX6ULL 终结者开发板硬件资源非常丰富,几乎将 i.MX6ULL 芯片的所有资源都扩展引出到底板上了,底板提供了丰富的外设接口,开发板的尺寸是 190mm*125mm,充分
    发表于 12-29 06:18

    米尔i.MX6UL开发板Linux操作系统的应用开发介绍

    MYD-Y6ULX开发板i.MX6UL开发板)由MYC-Y6ULX核心和底板组成,基于NXP
    发表于 02-02 06:57

    迅为-i.MX6ULL开发板-Busybox移植DHCP(三)

    我们想要开发板上面烧写 busybox 文件系统,我们首先将 busybox 镜像拷贝 dhcp 目录下,busybox镜像在终结者 ULL 光盘资料\i.MX6ULL 终结者光盘资
    发表于 04-19 11:33

    Linux内核i.mx6ull中的编译运行

    Linux内核i.mx6ull的编译运行编译Linux Kernel需要使用lzop库,所以需要安装,否则编译内核会失败!!!sudo a
    发表于 11-05 07:14

    如何使用Linux版本在i.mx6ull启用USB网络共享?

    。 请告知如何使用此 Linux 版本在 i.mx6ull 启用 USB 网络共享。否则请告知如何构建一个支持此功能的?
    发表于 05-09 08:06

    【北京迅为】i.MX6ULL开发板移植 Debian 文件系统

    【北京迅为】i.MX6ULL开发板移植 Debian 文件系统
    的头像 发表于 02-10 15:34 751次阅读
    【北京迅为】<b class='flag-5'>i.MX6ULL</b><b class='flag-5'>开发板</b><b class='flag-5'>移植</b> Debian 文件系统