目录
U-Boot简介
获取Uboot
U-Boot初次编译
U-Boot烧写与启动
U-Boot简介
Linux系统要启动就必须需要一个bootloader程序(裸机程序),也就说芯片上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux镜像从flash(NAND,NOR FLASH,SD,EMMC等)拷贝到DDR中,最后启动Linux 内核。当然了,bootloader的实际工作要复杂的多,但是它最主要的工作就是启动Linux内核, bootloader和Linux内核的关系就跟PC上的BIOS和Windows的关系一样, bootloader就相当于BIOS。所以我们要先搞定bootloader,很庆幸,有很多现成的bootloader软件可以使用,比如U-Boot、 vivi、RedBoot等,其中以U-Boot使用最为广泛。
因为Linux镜像是存在Flash里面,要想运行Linux系统需要一定的RAM,芯片内部RAM一般没有辣么大所以就需要DDR,bootloader就是需要准备Linux运行条件,譬如初始化DDR,然后再从Flash中读取到DDR中运行Linux系统。Uboot的主要目的就是为系统的启动做准备。
Uboot不仅仅能启动 Linux,也可以启动其他系统,比如 vxworks。Linux不仅仅能通过uboot启动,还可以用其他bootloader启动。Uboot是个通用的bootloader,他支持多种架构。
获取Uboot
1.uboot的全称基UniverealRoot1oader uboot基一个道活GPL议的开源软件uboot基一个裸机代码,可以看作是一个裸机综合例程。现在的uboot已经支持液晶屏、网络、USB等高级功能。uboot官网为http://www.denx.de/wiki/U-Boot/,如图所示:
图就是uboot原汁原味的源码文件。但是我们一般不会直接用 uboot 官方U-Bbot源码的。uboot官方的uboot 源码是给半导体厂商准备的,半导体厂商会下载uboot官方的uboot源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的uboot,这个版本的uboot相当于是他们定制的。既然是定制的,那么肯定对自家的芯片支持会很全,虽然uboot官网的源码中一般也会支持他们的芯片,但是绝对是没有半导体厂商自己维护的uboot全面。
2.SOC厂商会从uboot官网下载某个版本的uboot,然后再这个版本的uboot上加入相应的SOC以及驱动。这就是SOC厂商定制版的uboot。
3.做开发板的厂商,开发板会参考SOC厂商的板子,加入自己想要的一些东西。
那么这三种 uboot该如何选择呢?首先uboot官方的基本是不会用的,因为支持太弱了。最常用的就是半导体厂商或者开发板厂商的uboot,如果你用的半导体厂商的评估板,那么就使用半导体厂商的uboot,如果你是购买的第三方开发板,比如正点原子的I.MX6ULL开发板,那么就使用正点原子提供的uboot源码(也是在半导体厂商的uboot上修改的)。当然了,你也可以在购买了第三方开发板以后使用半导体厂商提供的uboot,只不过有些外设驱动可能不支持,需要自己移植,这个就是我们常说的uboot移植。
U-Boot初次编译
首先在Ubuntu中安装ncurses库,否则编译会报错,安装命令如下:
sudo apt-get install libncurses5-dev
把Uboot镜像放在自己创建的文件里,然后使用如下命令对其进行解压缩:
tar-vxjfuboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2
解压完成以后文件夹内容如图所示:
图中除了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--j2
这三条命令中ARCH=arm设置目标arm架构,CROSS_COMPILE 指定所使用的交叉编译器。第一条命令相当于“make distclean”,目的是清除工程,一般在第一次编译的时候最好清理一下工程。第二条指令相当于"make mx6ull_14x14_ddr512_emme_defconfig",用于配置uboot,配置文件为 mx6ull_14x14_ddr512_emme_defconfig。最后一条指令相当于 “make-j2”也就是使用2核来编译uboot.当这三条命令执行完以后uboot也就编译成功了,如图所示:
可以看出,编译完成以后uboot 源码多了一些文件,其中u-boot.bin就是编译出来的uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,图中的u-boot.imx文件就是添加头部以后的u-boot.bin, u-boot.imx就是我们最终要烧写到开发板中的uboot镜像文件。
U-Boot烧写与启动
uboot编译好以后就可以烧写到板子上使用了。
等待烧写完成,完成以后打开MobaXterm,设置好串口参数并打开,最后复位开发板。在MobaXterm上出现“Hit any key tostop autoboot:”倒计时的时候按下键盘上的回车键,默认是3秒倒计时,在3秒倒计时结束以后如果没有按下回车键的话uboot就会使用默认参数来启动Linux内核了。如果在3秒倒计时结束之前按下回车键,那么就会进入uboot的命令行模式,如图所示:
第1行是uboot版本号和编译时间,可以看出,当前的uboot版本号是2016.03,编译时间是 2023年4月16日凌晨19点25分。
第3和第4行是CPU信息,可以看出当前使用的CPU是飞思卡尔的I.MX6ULL (I.MX以前属于飞思卡尔,然而飞思卡尔被NXP收购了),频率为 792MHz,但是此时运行在396MHz.这颗芯片是工业级的,结温为-40°C-105°C。
第5行是复位原因,当前的复位原因是POR. I.MX6ULL芯片上有个POR_B引脚,将这个引脚拉低即可复位I.MX6ULL.
第6行是板子名字,当前的板子名字为“I.MX6U ALPHAIMINI”.
第7行提示12C 准备就绪。
第8行提示当前板子的 DRAM(内存)为512MB。
第9行提示当前有两个MMC/SD卡控制器: FSL_SDHC(0)和 FSL_SDHC(1). I.MX6ULL支持两个MMC/SD,正点原子的I.MX6ULL EMMC核心板上FSL-SDHC(0)接的SD(TF)卡,FSL_SDHC(1)接的EMMC.
第10和第11行是LCD型号,当前的LCD型号是ATK-LCD-7-1024x600 (1024x600),分辨率为 1024x600,格式为RGB888(24位)。
第12-14是标准输入、标准输出和标准错误所使用的终端,这里都使用串口(serial)作为终端。
第15和16行是切换到emme的第0个分区上,因为当前的uboot是emmc版本的,也就是从emmc启动的。
第17行是网口信息,提示我们当前使用的 FEC1 这个网口,I.MX6ULL 支持两个网口。
第18行提示FEC1网卡地址没有设置,后面我们会讲解如何在uboot里面设置网卡地址。
第20行提示正常启动,也就是说uboot要从emme里面读取环境变量和参数信息启动Linux内核了。
第21行是倒计时提示,默认倒计时3秒,倒计时结束之前按下回车键就会进入Linux命令行模式。如果在倒计时结束以后没有按下回车键,那么Linux内核就会启动, Linux内核一旦启动,uboot 就会寿终正寝。