在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核, bootloader有很多,常用的就是 U-Boot。
移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。
所以 U-Boot、 Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。一个完整的linux系统,通常包含了Uboot、kernel、设备树以及根文件系统。
| 硬件平台
综合了多方开发板,最终选择的是野火(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 相当于是他们定制的。
| Uboot编译
编译前还要在Ubuntu 中「安装ncurses 库」,安装命令如下:
sudoapt-getinstalllibncurses5-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
解压后的文件如下图所示:
uboot的目录结构如下图所示:
首先看下「uboot的配置」,configs目录下有很多的配置文件,找到与实际开发板相同类似的配置文件。正点原子和野火的I.MX6ULL开发板参考的就是「NXP官方的I.MX6ULL EVK开发板」做的硬件,因为手头上的开发板是emmc版本的,所以就使用下面这个配置文件。
mx6ull_14x14_evk_emmc_defconfig
编译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
运行脚本编译uboot:
. build.sh
编译后的文件结构:
编译后会生成不少中间文件,其中编译生成的 u-boot.imx文件就是我们最终要烧写到开发板中的 uboot 镜像文件;
| 烧写镜像
烧写镜像的方法有很多,这里采用的是SD卡烧录的方式,简单理解就是让开发板从SD启动,开发板的启动方式是通过拨码开关实现切换的;
配置拨码开关:
(截图来源于正点原子,具体根据实际开发板配置)
(截图来源于野火,具体根据实际开发板配置)
野火使用的是USB OTG或Etcher的方式更新镜像,但是正点原子专门编写了一个软件来将编译出来的.bin 文件烧写到 SD 卡中,这个软件叫做"imxdownload",路径为:开发板光盘->5、开发工具->2、Ubuntu 下裸机烧写软件->imxdownload,注意imxdownlaod 只能在 Ubuntu 下使用;
使用步骤:
1. 将 imxdownload 拷贝到工程根目录下,也就是和 **.bin 处于同一个文件夹下,要不然烧写会失败的;
2.给予 imxdownload 可执行权限,imxdownload 默认是没有可执行权限的,需要给予 imxdownload 可执行权限;
chmod 777 imxdownload
3. 烧录到SD卡,注意提前备份数据,烧录会格式化SD卡;
Ubuntu 下所有的设备文件都在目录“/dev”里面,所以插上 SD 卡以后也会出现在“/dev”里面,其中存储设备都是以“/dev/sd”开头的。
//查看电脑所有存储设备 ls /dev/sd*
注意:SD卡一定要连接到ubuntu中,如果出现设备无法连接到它的理想主机控制器,就需要把usb兼容性改成3.0;
imxdownload向SD卡烧写u-boot.bin文件,命令格式如下:
./imxdownload u-boot.bin /dev/sdb
imxdownload:imxdownload工具;
u-boot.bin:需要烧写到SD卡的文件;
/dev/sdb:插入的SD卡设备;
注意:不要选择错设备,一定要保证是自己插入的SD卡设备;
注意这个烧写速度,如果这个烧写速度在几百 KB/s 以下那么就是正常烧写,如果这个烧写速度大于几十 MB/s、甚至几百 MB/s 那么肯定是烧写失败了! 烧写完成以后会在当前工程目录下生成一个 load.imx 的文件,load.imx 这个文件就是软件 imxdownload 根据 NXP 官方启动方式介绍的内容,在 u-boot.bin文件前面添加了一些数据头以后生成的。最终烧写到 SD 卡里面的就是这个 load.imx 文件,而非boot.bin。
|验证效果
把启动方式切换到SD卡启动,重新上电启动开发板,当出现倒计时时(串口打印上出现Hit any key to stop autoboot)按下回车,就可以进行uboot面板,默认倒计时3秒,3秒内没有按下按键就会启动内核;
使用MobaXterm工具查看开发板数据,波特率设置为115200;
| uboot命令 输入help或?,然后按下回车即可查看当前 uboot 所支持的命令,不同版本的uboot支持的命令会有一点出入:
uboot支持的命令比较多,具体使用可以去官网看看文档。
审核编辑:刘清
-
u-boot
+关注
关注
0文章
118浏览量
38097 -
LINUX内核
+关注
关注
1文章
315浏览量
21447
原文标题:i.MX6ULL|uboot初探
文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论