- Linux系统要启动就必须需要一个 bootloader程序,也就说芯片上电以后先运行一段bootloader程序。这段 bootloader程序会先初始化 DDR等外设,然后将 Linux内核从 flash(NANDNOR FLASH SD MMC等 )拷贝到 DDR中,最后启动 Linux内核。当然了, bootloader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux内核, bootloader和 Linux内核的关系就跟 PC上的 BIOS和 Windows的关系一样, bootloader就相当于 BIOS。
一、什么是uboot?
-
uboot是一个裸机程序,比较复杂,类似于stm32综合实验例程一样复杂,什么功能都有。
-
uboot就是一个bootloader,作用就是用于启动Linux或其它系统。uboot最主要的工作就是初始化DDR(使用的NXP a9系列不需要来初始化DDR,因为bootram会自动初始化DDR,但是对于其他,比如三星等公司的a9,就需要手动初始化DDR)。
因为Linux是运行在DDR中。一般 Linux镜像zImage(uImage)+设备树(.dtb) 存放在SD、EMMC、NAND、SPI FLASH等等外置存储区域。这里就牵扯到一个问题,需要将Linux镜像从外置flash拷贝到DDR中,再去启动。
uboot的主要目的就是为系统的启动做准备,这就是uboot的宿命。
uboot不仅仅能启动linux,也可以启动其他的系统,比如vxwords系统。
同理,Linux不仅仅能通过uboot启动,可以支持多种的构架
uboot获取:
- 首先是uboot官网
http://www.denx.de/wiki/U-Boot/
- SOC厂商会从uboot官网下载某一个版本的uboot,然后在这个版本的uboot上加入相应的SOC以及驱动,这个就是SOC厂商定制版uboot,比如NXP官方的imx6 ECK板子。
- 做开发板的厂商,开发板会参考SOC厂商的板子,开发板必然会和官方的板子不一样,因此开发板厂商又会去修改SOC厂商做好的uboot,以适应自己的板子。
二、uboot编译
新建文件夹,然后复制对应的uboot到虚拟机
解压
tar -vxjf uboot-2016.tar.bz2
很快就会解压完成
执行编译
配置环境变量
. /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
首先清理一下,”,目的是清除工程,一般在第一次编译的时候最好清理一下工程。
make distclean
然后调用飞凌提供好的shell脚本文件,编译uboot镜像
./build_6x_c.sh
编译完成之后,ls可以看到多了一个u-boot.bin文件。u-boot.imx文件就是添加头部以后的 u-boot.bin,u-boot.imx 就是我们最终要烧写到开发板中的 uboot镜像文件。
下面来看一下编译的脚本文件,其实下面的这一段相当于代替了
类似于上面这样的繁琐的指令,飞凌既然提供了现成的shell文件,那么就可以直接来进行使用了。
build_6x_c.sh
#!/bin/bash
make distclean
make mx6q-c-sabresd_defconfig
make -j5
cp u-boot.imx uboot-6q.tran
make distclean
make mx6dl-c-sabresd_defconfig
make -j16
cp u-boot.imx uboot-6dl.tran
make distclean
make mx6q-c-2g-sabresd_defconfig
make -j5
cp u-boot.imx uboot-6q-2g.tran
make distclean
make mx6dl-c-2g-sabresd_defconfig
make -j16
cp u-boot.imx uboot-6dl-2g.tran
mv uboot-6q.tran u-boot-6q.imx
mv uboot-6dl.tran u-boot-6dl.imx
mv uboot-6q-2g.tran u-boot-6q-2g.imx
mv uboot-6dl-2g.tran u-boot-6dl-2g.imx