正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言:
本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。
引用:
正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com
《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》
正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档
正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)-CSDN博客
正文:
本文是 “Arm(iMX6U)Linux系统移植和根文件系统构键篇--2.1讲uboot简介。本节将参考正点原子的视频教程和配套的正点原子开发指南文档进行学习。
0. 概述
Linux系统要启动就必须需要一个 bootloader程序,也就说芯片上电以后先运行一段bootloader程序。程序。
这段 bootloader程序会先初始化 DDR等外设,然后将 Linux内核从 flash(NAND NOR FLASH SD MMC等 )拷贝到 DDR中,最后启动 Linux内核。
当然了,bootloader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux内核, bootloader和 Linux内核的系就跟 PC上的 BIOS和 Windows的关系一样, bootloader就相当于 BIOS。。所以我们要先搞定bootloader,很庆幸,有很多现成的 bootloader软件可以使用,比如 U-Boot、 vivi、 RedBoot等等,其中以 U-Boot使最为广泛,为了方便书写,本书会将 U-Boot写为 uboot。
uboot的全称是 Universal Boot Loader uboot是一个遵循 GPL协议的开源软件, uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot已经支持液晶屏、网络、 USB等高级功能。 uboot官网为
The U-Boot Documentation — Das U-Boot unknown version documentation
我们可以在 uboot官网下载 uboot源码,点击图 30.1.1中左侧 Topics中的“ Source Code
打开如图 30.1.2所示界面:
但是我们一般不会直接用 uboot 官方的 U-Boot 源码的。uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然 uboot 官网的源码中一般也会支持他们的芯片,但是决议是没有半导体厂商自己维护的 uboot 全面。
- u-boot网站的源码
- SoC芯片厂家从u-boot网站上下载源码,然后把自家的芯片SoC移植进去,SoC厂家自己维护了一个版本的bu-boot,与原始u-boot相比,对自家的芯片支持更全面。
NXP 就 维 护 的 2016.03 这 个 版 本 的 uboot , 下 载 地 址 为 :
http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git/tag/?h=imx_v2016.03_4.1.15_2.0.0_ga&id=
rel_imx_4.1.15_2.1.0_ga
下载界面如图 30.1.4 所示
图 30.1.4 中的 uboot-imx_rel_imx4.1.15_2.1.0_ga.xx(xx 为 zip、 tar.gz 或 tar.bz2)就是 NXP 官方维护的 uboot,后面我们学习 uboot 移植的时候就是使用的图 30.1.4 中的 uboot,下载ubootimx-rel_imx_4.1.15_2.1.0_ga.tar.bz2。图 30.1.4中的 uboot 基本支持了 NXP 当前所有可以跑 Linux 的芯片,而且支持各种启动方式,比如 EMMC、NAND、 NOR FLASH 等等,这些都是 uboot 官方所不支持的。
但是图 30.1.4 中的 uboot 是针对NXP 自家评估板的,如果是我们自己做的板子就需要修改 NXP 官方的 uboot,使其支持我们自己做的板子,正点原子的 I.MX6U 开发板就是自己做的板子,虽然大部分都参考了 NXP 官方的I.MX6ULL EVK 开发板,但是还是有很多不同的地方,所以需要修改 NXP 官方的 uboot,使其适配正点原子的 I.MX6U 开发板。所以当我们拿到开发板以后,是有三种 uboot 的,这三种 uboot的区别如下表所示:
那么这三种 uboot 该如何选择呢?首先 uboot 官方的基本是不会用的,因为支持太弱了。最常用的就是半导体厂商或者开发板厂商的 uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的 uboot,如果你是购买的第三方开发板,比如正点原子的 I.MX6ULL 开发板,那么就使用正点原子提供的 uboot 源码(也是在半导体厂商的 uboot 上修改的)。当然了,你也可以在购买了第三方开发板以后使用半导体厂商提供的 uboot, 只不过有些外设驱动可能不支持, 需要自己移植,这个就是我们常说的 uboot 移植。
本节是 uboot 的使用,所以就直接使用正点原子已经移植好的 uboot,这个已经放到了开发
板光盘中了。
1.U-Boot 初次编译
在 Ubuntu 中创建存放 uboot 的目录,比如我的是/home/chen/linux/uboot,然后在此目录下新建一个名为“alientek_uboot”的文件夹用于存放正点原子提供的 uboot 源码。(从正点原子网站上百度网盘链接下载)
dimon@dimon-VirtualBox:~/I.MX6ULL/uboot_altek$ lsuboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2dimon@dimon-VirtualBox:~/I.MX6ULL/uboot_altek$
使用如下命令对其进行解压缩
dimon@dimon-VirtualBox:~/I.MX6ULL/uboot_altek$ tar -xf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2
解压之后得到了整点原子修改移植过得针对正点原子 I.MX6ULL Alpha开发板的u-boot的源码。解压完成以后 alientek_uboot 文件夹内容如图 30.2.2 所示。
图 30.2.2 中除了 uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2 这个正点原子提供的 uboot 源码压缩包以外,其他的文件和文件夹都是解压出来的 uboot 源码。
512MB(DDR3)+8GB(EMMC)核心板
如果使用的是 512MB+8GB 的 EMMC 核心板,使用如下命令来编译对应的 uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
这三条命令中 ARCH=arm 设置目标为 arm 架构, CROSS_COMPILE 指定所使用的交叉编译器。第一条命令相当于“make distclean”,目的是清除工程,一般在第一次编译的时候最好清理一下工程。第二条指令相当于“make mx6ull_14x14_ddr512_emmc_defconfig”,用于配置 uboot,配置文件为 mx6ull_14x14_ddr512_emmc_defconfig。最后一条指令相当于 “make -j12”也就是使用 12 核来编译 uboot。当这三条命令执行完以后 uboot 也就编译成功了,如图 30.2.3 所示
编译完成以后的 alentek_uboot 文件夹内容如图
可以看出,编译完成以后 uboot 源码多了一些文件,其中 u-boot.bin 就是编译出来的 uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,图 30.2.4 中的 u-boot.imx 文件就是添加头部以后的 u-boot.bin, u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件.
每次编译 uboot 都要输入一长串命令,为了简单起见,我们可以新建一个 shell 脚本文件,将这些命令写到 shell 脚本文件里面,然后每次只需要执行 shell 脚本即可完成编译工作。新建名为 mx6ull_alientek_emmc.sh 的 shell 脚本文件,然后在里面输入如下内容.
##我购买的是正点原子I.MX6ULL Alpha Mini开发板,是256MB的DDR EMMC开发板
##所以选择的 xxx_defconfig 是256MB emmc的 defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
第 1 行是 shell 脚本要求的,必须是“#!/bin/bash”或者“#!/bin/sh”。
第 2 行使用了 make 命令,用于清理工程,也就是每次在编译 uboot 之前都清理一下工程。这里的 make 命令带有三个参数,第一个是 ARCH,也就是指定架构,这里肯定是 arm;第二个参数 CROSS_COMPILE 用于指定编译器,只需要指明编译器前缀就行了,比如 arm-linuxgnueabihf-gcc 编译器的前缀就是“arm-linux-gnueabihf-”;最后一个参数 distclean 就是清除工程.
第 3 行也使用了 make 命令,用于配置 uboot。同样有三个参数,不同的是,最后一个参数
是 mx6ull_14x14_ddr512_emmc_defconfig。
前面说了 uboot 是 bootloader 的一种,可以用来引导Linux,但是 uboot 除了引导 Linux 以外还可以引导其它的系统,而且 uboot 还支持其它的架构和外设, 比如 USB、 网络、 SD 卡等。这些都是可以配置的,需要什么功能就使能什么功能。所以在编译 uboot 之前,一定要根据自己的需求配置 uboot。
mx6ull_14x14_ddr512_emmc_defconfig就是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件,这个配置文件在 uboot源码的 configs 目录中。在 uboot 中,通过“make xxx_defconfig”来配置 uboot, xxx_defconfig就是不同板子的配置文件,这些配置文件都在 uboot/configs 目录中.
在u-boot源码目录下, u-boot/configs/ 目录下有非常多的 xxx_defconfig 的默认配置文件,一般一个xxx_defconfig 配置文件对应着一种硬件开发板(不同硬件开发板有不同的外设,所以u-boot的默认配置有所差异)。
第 4 行有 4 个参数,用于编译 uboot,通过第 3 行配置好 uboot 以后就可以直接“make”编译 uboot 了。其中 V=1 用于设置编译过程的信息输出级别; -j 用于设置主机使用多少线程编译uboot,最好设置成我们虚拟机所设置的核心数,如果在 VMware 里面给虚拟就分配了 4 个核,那么使用-j4 是最合适的,这样 4 个核都会一起编译。
使用 chmod 命令给予 mx6ull_alientek_emmc.sh 文件可执行权限,然后就可以使用这个 shell
脚本文件来重新编译 uboot,命令如下
chmod +x build_im6ull_emmc.sh
bash build_im6ull_emmc.sh
2.U-Boot 烧写与启动
uboot 编译好以后就可以烧写到板子上使用了, 这里我们跟前面裸机例程一样,将 uboot烧写到 SD 卡中,然后通过 SD 卡来启动来运行 uboot。使用 imxdownload 软件烧写,命令如下:
chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload u-boot.bin /dev/sdd //烧写到 SD 卡,不能烧写到/dev/sda 或 sda1 设备里面
等待烧写完成,完成以后将 SD 卡插到 I.MX6U-ALPHA 开发板上, BOOT 设置从 SD 卡启动,使用 USB 线将 USB_TTL 和电脑连接,也就是将开发板的串口 1 连接到电脑上。打开MobaXterm,设置好串口参数并打开,最后复位开发板。在 MobaXterm 上出现“Hit any key to stop autoboot: ”倒计时的时候按下键盘上的回车键,默认是 3 秒倒计时,在 3 秒倒计时结束以后如果没有按下回车键的话 uboot 就会使用默认参数来启动 Linux 内核了。如果在 3 秒倒计时结束之前按下回车键,那么就会进入 uboot 的命令行模式,如图 30.3.1 所示