一、uboot简介
uboot是一个逻辑程序,最主要的目的是启动内核。
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支持多种操作系统和架构的芯片。
uboot最主要就是DDR的初始化,因为系统是运行在DDR上的。一般Linux镜像(zImage)+设备树(.dtb)是存放在SD卡、EMMC、NAND、SPI FLASH等外置存储里面的,这就涉及到了将Linux镜像从flash中拷贝到DDR指定地址再去启动,所以这里也会涉及到FLASH驱动程序。
二、uboot源码
我们可以在 uboot 官网下载 uboot 源码
图 30.1.3 中就是 uboot 原汁原味的源码文件,是最初始得源码(一般是给soc厂商使用)(不全面)。
soc厂商对其修改得到适用于自己的uboot。
开发板厂商使用soc厂商的源码又经过修改,得到适用于自己开发板得uboot。
三、编译正点原子修改的uboot(在编译前要先安装好交叉编译工具链)
解压后得到:
一般在编译前先清理一下工程 :make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
这里的 make 命令带有三个参数,第一个是 ARCH ,也就是指定架构 ,这里肯定是 arm ;第二个参数 CROSS_COMPILE 用于指定编译器 ,只需要指明编译器前缀就行了,比如 arm-linuxgnueabihf-gcc 编译器的前缀就是**“arm-linux-gnueabihf-”** ;最后一个参数 distclean 就是清除工程 。
mx6ull_14x14_ddr512_emmc_defconfig : 是一个配置文件,由恩智浦官方提供(在路径uboot/configs),或经过其它开发商修改的。
配置 uboot: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- (加空格)mx6ull_14x14_ddr512_emmc_defconfig,会生成一个.config文件
同样有三个参数,不同的是,最后一个参数是 mx6ull_alientek_emmc_defconfig。前面说了 uboot 是 bootloader 的一种,可以用来引导 Linux,但是 uboot 除了引导 Linux 以外还可以引导其它的系统,而且 uboot 还支持其它的架构和外设,比如 USB、网络、SD 卡等。这些都是可以配置的,需要什么功能就使能什么功能。所以在编译uboot 之前,一定要根据自己的需求配置 uboot。
mx6ull_alientek_emmc_defconfig 就是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件。
编译uboot: make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
编译 uboot,通过第 3 行配置好 uboot 以后就可以直接“make”编译 uboot 了。
其中 V=1 用于设置编译过程的信息输出 级别;-j 用于设置主机使用多少线程编译uboot ,最好设置成我们虚拟机所设置的核心数,如果在 VMware 里面给虚拟就分配了 4 个核,那么使用-j4 是最合适的,这样 4 个核都会一起编译。
编译完成后会产生.bin文件,在编译中会添加I.MX6ULL的头部信息产生.imx文件。之后用OTG烧写系统,在第一行就可以发现uboot编译的时间,在倒数3秒前按下任一键可进入uboot命令行。
为了方便编译也可以配置Makefile的ARCH和CROSS_COMPILE变量的值,这样编译的时候就比较方便。也可以使用shell脚本。
shell脚本
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean //清理工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig //根据配置文件制作.config文件
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 //编译