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

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

3天内不再提示

i.MX6ULL嵌入式Linux开发3-Kernel移植

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-03-14 08:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文进行Linux内核的移植。

1 Linux内核简介

NXP 会从linux内核官网下载某个版本,然后将其移植到自己的 CPU上,测试成功后就会将其开放给NXP的CPU开发者。开发者下载 NXP 提供的 Linux 内核,然后将其移植到自己的产品上。

本文我们就使用NXP提供的Linux源码,文件名为:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

2 Linux内核编译

编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为:

sudo apt-get install lzop
sudo apt-get install build-essential 
sudo apt-get install libncurses5-dev 

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

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

解压完成后

进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下:

#!/bin/sh 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8 

给予该脚本可执行权限,然后运行,编译的时候会弹出Linux图形配置界面, 这里不需要做任何的配置, 直接按两下ESC键退出图形界面

之后会自动开始编译Linux内核。

编译完成以后就会在arch/arm/boot这个目录下生成一个zImage文件,该文件就是要用的Linux镜像文件。另外也会在arch/arm/boot/dts下生成很多.dtb 文件,这些.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了。

3 Linux内核源码结构

Linux内核编译过程会生成一些文件,下面来看一下编译后的内核源码结构,可以看出多出了一些编译文件

具体描述如下:

arch目录

这个目录是和架构有关的目录,比如arm、arm64、avr32、x86等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如boot、common、configs等等。

block目录 block是Linux下块设备目录, 像SD卡、EMMC、NAND、硬盘等存储设备就属于块设备,block目录中存放着管理块设备的相关文件。

crypto目录 crypto目录里面存放着加密文件,比如常见的crc、crc32、md4、md5、hash等加密算法

Documentation目录 此目录里面存放着Linux相关的文档,如果要想了解Linux某个功能模块或驱动架构的功能,就可以在Documentation目录中查找有没有对应的文档。

drivers目录 驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c就是I2C相关驱动目录,drivers/gpio就是GPIO相关的驱动目录,这是我们学习的重点。

firmware 目录 此目录用于存放固件。

fs目录 此目录存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs等,分别是ext2、ext4 和 f2fs等文件系统。

4 Linux内核启动测试

将编译出来的zImage和imx6ull-14x14-evk.dtb复制到Ubuntu中的tftp目录下,之后会通过uboot 的tftp命令将其下载到开发板中。

在测试之前确保uboot中的环境变量bootargs内容如下(使用print指令查看):

console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw

如果不是的话,可以使用如下指令设置一下:

setenv bootargs 

'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'

saveenv

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

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

可以看到内核启动了

pYYBAGIuABOALPHAAAFTAW9ilIA490.png

最后到了系统登录处,说明Linux系统正常启动了(这次LCD上没有了野火的图形界面,可能是某些固件不匹配吧,先忽略)

pYYBAGIuABqABpwJAAEgTQI9bnE679.png

4.1 根文件系统缺失的错误

Linux内核启动以后是需要根文件系统的,根文件系统存在哪里是由uboot的bootargs环境变量指定, bootargs会传递给Linux内核作为命令行参数 。 比如之前设置的root=/dev/mmcblk1p2,也就是说根文件系统存储在/dev/mmcblk1p2中,即EMMC的分区2中。

因为上一篇的测试时,EMMC的分区2中烧写好了根文件系统,所以设置root=/dev/mmcblk1p2,并且内核正常启动。如果我们不设置根文件系统路径,或者说根文件系统路径设置错误的话会出现什么问题?

我们将uboot中的bootargs环境变量改为“console=ttymxc0,115200” ,也就是不填写root的内容了,命令如下:

setenv bootargs 'console=ttymxc0,115200' 
saveenv      

修改完成以后重新从网络启动,可以看到也是先启动了内核:

pYYBAGIuACKAehbbAAEXR-f7qEU106.png

但启动以后会有类似如下的错误:

poYBAGIuACiAQSkVAAE5D4JJaug678.png

最后会有下面这一行:

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

提示内核崩溃,因为VFS(虚拟文件系统)不能挂载根文件系统,目录不存在。即使目录存在,如果根文件系统目录里面是空的依旧会提示内核崩溃。

5 Linux中添加自己的开发板

编译NXP官方I.MX6ULL EVK开发板对应的Linux内核,发现其可以在野火的EMMC版本开发板启动。为了进一步了解Linux内核,我们可以参考官方开发板的设置,在Linux内核中添加自己的开发板。

5.1 添加开发板默认配置文件

arch/arm/configs目录下的imx_v7_mfg_defconfig重新复制一份 , 命名为自己开发板,如imx_myboard_defconfig

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

进入arch/arm/boot/dts目录中,复制一份imx6ull-14x14-evk.dts,然后将其重命名为imx6ull-myboard.dts

然后还需要修改文件arch/arm/boot/dts/Makefile,找到 dtb-$(CONFIG_SOC_IMX6ULL)配置项,在此配置项中加入“imx6ull-myboard.dtb” :

poYBAGIuADCAWtJ7AAGKQk_K8UM881.png

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

总结一下以上的修改主要包括:

pYYBAGIuADWAb4aVAACdByBSXsw903.png

主要就是对文件复制一份并重命名,唯一修改的是Makefile文件。

5.3 添加新的编译脚本

新建一个build_myboard.sh,写入如下内容:

#!/bin/sh 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_myboard_defconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8

编译出zImage(arch/arm/boot目录)和imx6ull-myboard.dtb (arch/arm/boot/dts目录)后再次进行Linux启动测试,可以到登录提示,说明Linux内核启动成功。

审核编辑:汤梓红

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

    关注

    5186

    文章

    20146

    浏览量

    328795
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217965
  • 移植
    +关注

    关注

    1

    文章

    407

    浏览量

    29211
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微RK3506 vs NXP i.MX6ULL

    NXPi.MX6ULL核心板进行多方面对比。性能与能效对比性能优势对比:RK3506在接口方面比i.MX6ULL少2个UART,其他性能方面,RK3506以三核A7(1.
    的头像 发表于 06-19 16:26 967次阅读
    瑞芯微RK3506 vs NXP <b class='flag-5'>i.MX6ULL</b>

    飞凌嵌入式ElfBoard ELF 1板卡-uboot移植之IOMUX介绍

    本章节主要讲,如何将NXP官方i.MX6ULL EVK评估板的uboot源码移植适配到ELF 1开发板。本身uboot的作用就是启动内核,只要能成功启动内核,uboot使命便已完成。但是从开发
    发表于 05-30 09:28

    新品!米尔NXP i.MX 91核心板,赋能新一代入门级Linux应用

    米尔电子基于与NXP长期合作的嵌入式处理器开发经验,在i.MX6i.MX8系列核心板领域已形成完整产品矩阵,米尔累计推出5个平台共计二十余款NXP核心板,涵盖工业物联网、新能源、医疗
    的头像 发表于 05-29 08:01 2504次阅读
    新品!米尔NXP <b class='flag-5'>i.MX</b> 91核心板,赋能新一代入门级<b class='flag-5'>Linux</b>应用

    飞凌嵌入式ElfBoard ELF 1板卡-Uboot

    /SourceCode下载。不过我们目前使用的uboot源码不是在这个网站下载的,而是由NXP公司提供的。NXP公司在推广i.MX6ULL芯片时,会开发出一套i.MX6ULL EVK评估板给客户进行评估,同时也有
    发表于 05-22 10:44

    「2025恩智浦创新技术峰会」飞凌嵌入式亮相上海首站

    ,展示其在低成本人工智能、工业物联网等领域的创新成果。此次峰会,飞凌嵌入式带来了基于恩智浦i.MX95xx、i.MX9352、i.MX8MPlus和
    的头像 发表于 05-15 13:38 1059次阅读
    「2025恩智浦创新技术峰会」飞凌<b class='flag-5'>嵌入式</b>亮相上海首站

    ECB20-PG6Y28C-I 单板机深度测评报告 ——工业级嵌入式开发的强力助手

    ECB20-PG6Y28C-I 是成都亿佰特电子科技基于 i.MX6ULL 处理器推出的工业级测试底板,搭配 ECK20-6Y28C 系列核心板,专为高性能嵌入式场景设计。其核心亮点在
    的头像 发表于 04-22 11:49 891次阅读

    如何在i.MX6ULL睡眠时停止刷新LCD?

    为了更好的 EMC,我们需要在 i.MX6ULL 进入睡眠状态时停止 LCD 刷新。 能否实现 ? 平台: i.MX6ULL 系统: Linux
    发表于 04-03 07:14

    如何维护i.MX6ULL的安全内核?

    随着即将出台的 EU RED 33)def 和 EN 18031 法规,修复已知的漏洞至关重要。对于基于 i.MX 6ULL 的系统,在实践中如何做到这一点? 我们目前
    发表于 04-01 08:28

    如何在i.MX6ULL定制板上启用IO Expander PCA6416A的控制?

    我想知道如何在 i.MX6ULL 定制板上启用 IO Expander PCA6416A 的控制。 我尝试修改 imx6ul-14x14-evk.dtsi,将 pca6416 节点添加到 i
    发表于 03-26 07:10

    GoPoint嵌入式开发平台 释放i.MX潜力 简化Linux开发

    地进行创新。 在快节奏的嵌入式系统时代,时间是开发人员最宝贵的资源。GoPoint (过去名为NXP Demo Experience) 重新定义了评估和探索过程,开发人员能够快速评估i.MX
    发表于 02-28 10:07 1068次阅读
    GoPoint<b class='flag-5'>嵌入式开发</b>平台 释放<b class='flag-5'>i.MX</b>潜力 简化<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之USB_OTG

    i.MX6ULL通过检测TYPE C类型的插头内的CC引脚线的高低,来判断自己是工作在host模式还是device模式,ELF 1开发板直接将CC(TYPE C座的CC1和CC2还有检测插入方向的功能
    发表于 02-28 09:29

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之USB_OTG

    i.MX6ULL通过检测TYPE C类型的插头内的CC引脚线的高低,来判断自己是工作在host模式还是device模式,ELF 1开发板直接将CC(TYPE C座的CC1和CC2还有检测插入方向的功能,这里不
    发表于 02-27 09:16

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之ENET

    ELF 1开发板网络方案跟NXP i.MX6ULL EVK评估板的一样,所以这里就简单说明一下网络在内核设备树的配置。 硬件原理 由于两个网口涉及的引脚较多,而ELF 1开发板跟i.MX6UL
    发表于 02-21 09:32

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之ENET

    ELF 1开发板网络方案跟NXP i.MX6ULL EVK评估板的一样,所以这里就简单说明一下网络在内核设备树的配置。 硬件原理 由于两个网口涉及的引脚较多,而ELF 1开发板跟i.MX6UL
    发表于 02-20 08:47

    3.1s启动!飞凌嵌入式i.MX93开发板部署LVGL,打造更高效的GUI

    近期,飞凌嵌入式为基于NXP i.MX93系列处理器打造的OK-MX9352-C开发板成功移植了LVGL v8.3,不仅界面美观精致,启动速
    的头像 发表于 01-16 11:52 1060次阅读
    3.1s启动!飞凌<b class='flag-5'>嵌入式</b><b class='flag-5'>i.MX</b>93<b class='flag-5'>开发</b>板部署LVGL,打造更高效的GUI