Linux 系统启动需要一个 bootloader 程序,芯片上电以后先运行一段 bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将 Linux 内核从 flash (NAND, NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核;这段 bootloader 程序有很多种,比如 U-Boot、vivi、RedBoot 等,U-Boot 就是其中一种。
uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot 是一 个裸机代码,可以看作是一个裸机综合例程,uboot 官网为 U-Boot 官网,我们可以在官网下载到其源码!
一般来说,uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去;同时半导体厂商也会针对自己的芯片选择一个版本的 uboot 自己去维护,该 uboot 的适配程度要高于 uboot 官方的代码,比如 NXP 的 uboot 维护地址如下:NXP Uboot Git Src
这个厂商的 Uboot 一般是支持其对应芯片的评估板的,但如果我用的是正点原子的板子,其 uboot 和正点原子的开发板有一定的冲突,所以正点原子也有一套修改后的 uboot!综上,我们有三套 uboot 可以使用:
uboot | 描述 |
---|---|
uboot 官方的 uboot | 由 uboot 官方维护开发的 uboot 版本,版本更新快,基本包含所有常用的芯片 |
半导体厂商的 uboot | 半导体厂商维护的一个 uboot,专门针对自家的芯片,在对自家芯片支持上要比uboot 官方的好 |
开发板厂商的 uboot | 开发板厂商在半导体厂商提供的 uboot 基础上加入了对自家开发 板的支持 |
官方的 uboot 我们一般不使用,支持太少,让他们厂商去折腾就行,我们如果要使用正点原子的开发板,那么就使用正点原子的 uboot (本质就是在半导体厂商的 uboot 上修改的),如果要使用 NXP 的芯片做自己的开发,那么一般使用 NXP 的 uboot 来进行修改移植,就是常说的 uboot 移植!
正点原子的 uboot 我已经放到 CSDN 上 U-Boot下载链接
在 Ubuntu 环境中使用如下命令安装 ncurses 库
sudo apt-get install libncurses5-dev
安装完成如下:
自己选择一个位置创建一个文件夹,然后将正点原子的 uboot 源码上传到系统中
然后我们对其进行解压
tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
解压完成后,可以看到当前目录下的 uboot 源码:
源码和编译环境准备完成之后,我么编写一个 shell 脚本用于编译
对于开发板是 512MB(DDR3) + 8GB(EMMC) 的核心板,编译脚本如下
1 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
2 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
3 make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
编译脚本关键字含义如下:
ARCH:指定编译目标架构为 arm 架构
CROSS_COMPILE:指定使用的交叉编译器
后面的则是编译指令,distclean 为清除工程,mx6ull_14x14_ddr512_emmc_defconfig 是配置 uboot,-j12是使用 12 个核心来多进程编译,加快编译速度(核心根据自己虚拟机分配的核心数目来自己设置)
以在编译 uboot 之前,要根据自己的需求配置 uboot,mx6ull_14x14_ddr512_emmc_defconfig 就是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件
脚本编写完成,我们设置脚本为可执行文件:
执行脚本文件,完成编译:
可以看到,多了许多 uboot 文件,其中 uboot.bin 为编译后文件,而 u-boot.bin 文件编译后,会在 u-boot.bin 的开头添加一个大小为 1K 的 IVT 头,用于告诉 BOOT ROM 找到 uboot 的位置和函数,要运行在什么模式,DRAM的配置数据等,这个新生成的文件就是 u-boot.imx 文件,两个文件都可以用于烧写启动
上节提到 uboot 最终编译的文件就是 uboot.bin 文件,他本质上就和裸机程序没什么区别,我们为了方便观察现象,直接使用 imxdownload 工具将 uboot.bin 文件下载到 SD 卡上,然后从 SD 卡启动,通过串口直接观察 uboot 的运行结果
下载到SD卡指令:
./imxdownload uboot.bin /dev/sdb
串口查看 uboot 启动信息
图片暂未插入