U-Boot介绍

描述

在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核, bootloader有很多,常用的就是 U-Boot。

移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。

所以 U-Boot、 Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。一个完整的linux系统,通常包含了Uboot、kernel、设备树以及根文件系统。

LINUX内核

| 硬件平台

综合了多方开发板,最终选择的是野火(i.MX6ULL eMMC),板子的颜值也比较高,但是原子的教程会详细一点,以「野火EBF6ULL Pro开发板教程」「正点原子i.MX6ULL阿尔法开发板教程」为参考,进行学习实践。

(以具体的开发板为准)

| Uboot介绍

uboot 的全称是 Universal Boot Loader, uboot 是一个遵循 GPL 协议的开源软件, uboot 是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、 USB 等高级功能。

我们一般不会直接用 uboot 官方的 U-Boot 源码的。uboot 官方的 uboot 源码是给半导体厂商准备的,半导体厂商会下载 uboot 官方的 uboot 源码,然后将自家相应的芯片移植进去。也就是说半导体厂商会自己维护一个版本的 uboot,这个版本的 uboot 相当于是他们定制的。

LINUX内核

| Uboot编译

编译前还要在Ubuntu 中「安装ncurses 库」,安装命令如下:

 

sudo apt-get install libncurses5-dev

 

提示:有些库在Ubuntu中已经自带,如果编译出错记得把需要的库安装;

获取原厂的uboot源码:

通过正点原子官网获取资源,在01、例程源码/04、NXP官方原版Uboot和Linux目录下即可找到uboot(uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2)源码,然后放到方便找到的目录下,比如直接放在桌面,本人直接放在桌面/saver目录下;源码文件是.bz2格式,需要对文件进行解压,解压命令:

 

tar -vxjf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

 

解压后的文件如下图所示:

LINUX内核

uboot的目录结构如下图所示:

LINUX内核

首先看下「uboot的配置」,configs目录下有很多的配置文件,找到与实际开发板相同类似的配置文件。正点原子和野火的I.MX6ULL开发板参考的就是「NXP官方的I.MX6ULL EVK开发板」做的硬件,因为手头上的开发板是emmc版本的,所以就使用下面这个配置文件。

 

mx6ull_14x14_evk_emmc_defconfig

 

LINUX内核

编译uboot使用的指令:

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

 

命令解析:

ARCH=arm 设置目标为 arm 架构;

CROSS_COMPILE 指定所使用的交叉编译器。

第1条命令相当于make distclean,目的是清除工程,一般在编译的时候需要清理一下工程已存在的编译文件。

第2条指令相当于make mx6ull_14x14_evk_emmc_defconfig,用于配置 uboot,配置文件为 mx6ull_14x14_evk_emmc_defconfig。

第3条指令相当于make -j8,也就是使用8核来编译uboot。

为了方便使用直接写个脚本文件,新建一个build.sh文件,写入相关脚本:

 

#!/bin/bash


make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8

 

LINUX内核

运行脚本编译uboot:

 

. build.sh

 

LINUX内核

编译后的文件结构:

LINUX内核

编译后会生成不少中间文件,其中编译生成的 u-boot.imx文件就是我们最终要烧写到开发板中的 uboot 镜像文件;

| 烧写镜像

烧写镜像的方法有很多,这里采用的是SD卡烧录的方式,简单理解就是让开发板从SD启动,开发板的启动方式是通过拨码开关实现切换的;

配置拨码开关:

LINUX内核

(截图来源于正点原子,具体根据实际开发板配置)

LINUX内核

(截图来源于野火,具体根据实际开发板配置)

野火使用的是USB OTG或Etcher的方式更新镜像,但是正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做"imxdownload",路径为:开发板光盘->5、开发工具->2、Ubuntu 下裸机烧写软件->imxdownload,注意imxdownlaod 只能在 Ubuntu 下使用;

LINUX内核

使用步骤:

1. 将 imxdownload 拷贝到工程根目录下,也就是和 **.bin 处于同一个文件夹下,要不然烧写会失败的;

LINUX内核

2. 给予 imxdownload 可执行权限,imxdownload 默认是没有可执行权限的,需要给予 imxdownload 可执行权限;      

 

chmod 777 imxdownload

 

3. 烧录到SD卡,注意提前备份数据,烧录会格式化SD卡;

Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。

 

// 查看电脑所有存储设备
ls /dev/sd*

 

注意:SD卡一定要连接到ubuntu中,如果出现设备无法连接到它的理想主机控制器,就需要把usb兼容性改成3.0;

LINUX内核

imxdownload向SD卡烧写u-boot.bin文件,命令格式如下:

 

./imxdownload u-boot.bin /dev/sdb

 

imxdownload:imxdownload工具;

u-boot.bin:需要烧写到SD卡的文件;

/dev/sdb:插入的SD卡设备;

注意:不要选择错设备,一定要保证是自己插入的SD卡设备;

LINUX内核

注意这个烧写速度,如果这个烧写速度在几百 KB/s 以下那么就是正常烧写,如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了! 烧写完成以后会在当前工程目录下生成一个 load.imx 的文件,load.imx 这个文件就是软件 imxdownload 根据 NXP 官方启动方式介绍的内容,在 u-boot.bin文件前面添加了一些数据头以后生成的。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而非boot.bin。

LINUX内核

LINUX内核

| 验证效果

把启动方式切换到SD卡启动,重新上电启动开发板,当出现倒计时时(串口打印上出现Hit any key to stop autoboot)按下回车,就可以进行uboot面板,默认倒计时3秒,3秒内没有按下按键就会启动内核;

使用MobaXterm工具查看开发板数据,波特率设置为115200;

LINUX内核

| uboot命令 输入help或?,然后按下回车即可查看当前 uboot 所支持的命令,不同版本的uboot支持的命令会有一点出入:

LINUX内核

uboot支持的命令比较多,具体使用可以去官网看看文档。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分