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

DDZZ669   2021-7-26 22:11 楼主

 

本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括嵌入式Linux移植,嵌入式Linux驱动开发,嵌入式Linux应用开发等。

 

 

本系列教程将以野火的i.MX6ULL eMMC开发板为硬件基础,以野火EBF6ULL Pro开发板教程正点原子i.MX6ULL阿尔法开发板教程为参考,进行学习实践。

 

 

1 嵌入式Linux移植概述

 

 

Linux 的移植主要包括3部分:

 

 


  •        

  •        

    移植bootloader 代码, Linux 系统要启动就必须需要一个 bootloader 程序,也就说芯片上电以后先运行一段bootloader程序。 这段bootloader程序会先初始化DDR等外设, 然后将Linux内核从flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。 bootloader 有很多,常用的就是 U-Boot。


           

    bootloader 和 Linux 内核的关系就跟 PC 上的 BIOS 和 Windows 的关系一样,bootloader 就相当于 BIOS。


           

  •        

  •        

    移植Linux 内核,Linux内核由一系列程序组成,包括负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序、负责管理地址空间的内存管理程序、网络、进程间通信的系统服务程序等。内核负责管理系统的硬件设备。


           

  •        

  •        

    移植根文件系统(rootfs),Linux 中的根文件系统更像是一个文件夹或者叫做目录,在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是 Linux 运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。根文件系统里面包含了一些最常用的命令和文件。


           

    U-Boot、Linux kernel 和 rootfs这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。


           


  •  

 

 

2 实验开发板简介

 

 

本测试使用的开发板为野火的i.MX6ULL eMMC开发板。

 

 

 

 

 

 

3 U-Boot简介

 

 

uboot 的全称是Universal Boot Loader,遵循 GPL 协议的开源软件。

 

 

uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。uboot 官网为 https://www.denx.de/wiki/U-Boot/

 

 

 

 

 

 

可以在uboot官网下载uboot源码,点击左侧Topics中的Source Code,然后点击的FTP Server,进入其 FTP 服务器即可看到 uboot 源码。

 

 

但我们移植uboot时一般不会直接用 uboot 官方的源码的,官方的源码是给半导体厂商准备的,半导 体厂商会根据自家的芯片,维护自己芯片对应的uboot。

 

 

NXP(freescale)维护的的uboot地址: https://github.com/Freescale/u-boot-fslc

 

 

 

 

 

 

 

 

 

4 NXP uboot测试

 

 

uboot移植并不需要从零开始将 uboot 移植到我们现在所使用的开发板上。因为半导体厂商通常都会自己做一个开发板(原厂开发板), 将uboot移植到他们自己的原厂开发板上,再将这个uboot(原厂BSP 包)发布出去。

 

 

市面上的开发板,通常会参考原厂的开发板做硬件,然后在原厂提供的 BSP 包上做修改,如正点原子和野火的 I.MX6ULL 开发板参考的就是NXP官方的 I.MX6ULL EVK 开发板做的硬件:

 

 

 

 

 

 

4.1 编译环境搭建

 

 

4.1.1 交叉编译器下载

 

 

嵌入式Linux开发,程序编译通常在电脑端的Linux(如虚拟机中的Ubuntu)下进行编译,Ubuntu 自带gcc 编译器,但该编译器是针对 X86 架构的!而嵌入式Linux是ARM架构的, 所以需要一个在 X86 架构上可以编译 ARM 架构代码的 gcc编译器,即交叉编译器

 

 

交叉编译器有很多,本实验使用 Linaro 出品的交叉编译器,下载地址:

 

 

https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/

 

 

 

 

 

 

 

 

 

4.1.2 交叉编译器安装

 

 

在Ubuntu中创建目录:/usr/local/arm,并将下载的gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz复制到此文件中,然后解压,解压命令如下:

 

 


sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

 


解压完成以后会生成一个名为“gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。

 

 

然后,需要将该目录添加到环境变量中。打开/etc/profile 以后,在最后面输入如下所示内容:

 

 


export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin 

 

 

 

 

 

使用交叉编译器之前还需要安装其它的库,命令如下:

 

 


sudo apt-get install lsb-core lib32stdc++6 

 

安装完之后,可以查看交叉编译工具的版本号,输入如下命令:

 

 


arm-linux-gnueabihf-gcc -v 

 

可以看到类似如下打印

 

 

 

 

 

 

以看出当前交叉编译器的版本号为 4.9.4,说明交叉编译工具链安装成功。

 

 

 

 

 

4.2 编译原厂uboot

 

 

编译前还要在Ubuntu 中安装ncurses 库,安装命令如下:

 

 


sudo apt-get install libncurses5-dev 

 

在Ubuntu中创建存放uboot的目录,如我的目录是: /home/xxpcb/myTest/imx6ull/uboot/nxp_uboot,

 

 

然后,将NXP(freescale)的uboot源码复制进来,这里使用的是正点原子提供的NXP官方原版Uboot源码包( uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)

 

 

然后进行解压:

 

 


tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

 

解压后的源码文件如下:

 

 

 

 

 

 

 

 

 

首先看下uboot的配置,configs 目录下有很多跟 I.MX6UL/6ULL 有关的配置,找到与mx6ull相同的,如下图。

 

 

因为我这个开发板是emmc版本的,所有就使用这个mx6ull_14x14_evk_emmc_defconfig。

 

 

 

 

 

 

编译uboot使用下面3条指令:

 

 

 

提示词:如果您需要查看本帖隐藏内容,请登录或者注册
  • 14.png

回复评论 (3)

图挂啦

默认摸鱼,再摸鱼。2022、9、28
点赞  2021-7-26 22:42

刚好在看uboot,不过是STM32MP157系列的,不过都一样哈!

点赞  2021-7-27 11:05

已修复

点赞  2021-7-27 23:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复