引入
在嵌入式系统开发中,U-Boot 作为一个开源的引导加载程序(bootloader),扮演着至关重要的角色。它负责在系统启动时初始化硬件,加载并启动操作系统。本文将详细介绍如何从 U-Boot 的源码开始,编译生成适用于特定硬件平台的可执行文件。
u-boot简介
uboot是一种通用的引导加载程序,它可以用于多种嵌入式系统,支持多种操作系统,如Linux, Android,NetBSD等。uboot的主要作用是将操作系统内核从存储设备(如Flash, SD卡等)加载到内存中,并执行
内核代码。
XIP设备
XIP设备是指一种可以直接在存储器中执行程序代码的设备,而不需要将代码复制到内存中。XIP的全称是eXecute In Place,即芯片内执行。像片内的SRAM, NOR Flash, BROM等。
为什么需要u-boot
因为嵌入式系统的硬件资源有限,CPU上电后只能执行一小段内置的代码(BROM System),这段代码不足以完成内存初始化,文件系统访问,网络通信等复杂的任务。因此,需要一个中间层的程序,来完
成这些工作,并引导操作系统启动。
通过下图我们可以看到查看我们香橙派的内核大小:
但是芯片手册上 sram 也才 差不多 200KB,BROM 都太小了
U-boot 启动流程图
(温馨提示: 图片有点小,Ctrl + 滚轮调整大小,方便观看)
执行顺序:
1. 当H616芯片上电或复位后,brom会自动执行,它会根据芯片的引脚电平或寄存器设置,确定启动模式,如从nand flash,spi flash,sd卡,usb等设备中启动。
2. brom会根据启动模式,选择相应的设备驱动,初始化SD卡设备控制器,设置设备参数,如时钟频率,总线宽度,电压等级等
3. brom会从启动设备的特定扇区中,读取第一级引导程序,如spl将其加载到芯片的内部sram中,并跳转到其入口点执行 -- MBR
4. spl会继续初始化一些硬件设备,如ddr,pll,gpio等,然后从启动设备的特定分区中,读取第二级引导程序,如uboot proper,将其加载到ddr中,并跳转到其入口点执行,
5. uboot会继续初始化一些硬件设备,如网卡,lcd,从SD卡中读取内核文件,启动操作系统。
官网图片佐证
================================================
香橙派技巧,这板子上面没有man手册,我们可以:
命令 --help 来查看命令用法
du -s 补充
du -s 是一个在Unix和类Unix系统(如Linux)中常用的命令,用于估算文件和目录的磁盘使用情况。具体来说,du 命令是 "disk usage"(磁盘使用)的缩写。
-s 选项表示 "summary"(总结),即只显示指定目录的总磁盘使用量,而不是显示该目录及其所有子目录和文件的详细使用情况。
例如,如果你有一个名为 mydir 的目录,并且你想知道它总共使用了多少磁盘空间,你可以使用以下命令:
bash
du -s mydir
这将会返回一个数字,表示 mydir 目录(包括其所有子目录和文件)所使用的磁盘块数。通常,这个数字后面会跟着一个单位(如K、M、G),表示千字节、兆字节或吉字节。注意,磁盘块的大小取决于你的文件系统,但通常它是512字节或4KB。因此,du 命令返回的数字可能不是非常精确,特别是当文件大小不是磁盘块大小的整数倍时。然而,它仍然是一个很好的工具,用于快速了解目录或文件在磁盘上的大致使用情况。
--------------------------------------------------------------------------
U-boot 编译 -- 根据OrangePi02 的 用户手册操作
方式一: u-boot编译流程
1. 运行 build.sh 脚本, 记得加 sudo 权限
sudo ./build
2. 选择 U-boot package, 然后回车
3. 接着选择开发板的型号
因为我们的板子是orangepi02 --> 这里我们也选择 orangepi zero 2
4. 重复编译 u-boot 时, 使用下面的命令无需通过图形界面选择, 可以直接开始编译 u-boot
(可以跳过2,3)
sudo ./build.sh BOARD = orangepizero2 BRANCH = next BUILD_OPT = u-boot
// 通过参数的形式指定了, 省略通过图像化 的选择过程
5. 查看编译生成的 u-boot deb 包
cd output/debs/u-boot
ll(ls)
这底下有我们需要的 deb包 -- linux-u-boot-next-orangepizero2_3.1.0_arm64.deb
5.2 scp传送到 香橙派上面:
scp linux-u-boot-next-orangepizero2_3.1.0_arm64.deb \ orangepi@192.168.1.11:/home/orangepi
这是我的用户名和ip,针对不同人群都能通过
whoani --> 来查看用户名
ifconfig / ip addr --> 来查看ip
6. 然后登录到H616开发板, 卸载已安装的 u-boot 的 deb 包
dpkg -l | grep linux-u-boot #查看u- boot包名称
sudo apt purge -y linux-u-boot-orangepizero2-current#卸载上面查找到的u-boot包名称,有可能是linux-u-boot-orangepizero2-next
7. 再安装刚才上传的新的 u-boot 的 deb 包
sudo dpkg -i linux-u-boot-next-orangepizero2_3.1.0_arm64.deb
sudo nand-sata-install
#一路回车
sudo reoobt -f
===============================
方法二:
1、清理u-boot:
sudo chown mxjun:mxjun v2021.10-sunxi -R#修改所属用户为当前用户(根据实际用户名修改),保证当前用户下权限没有问题
cd v2021.10-sunxi
make distclean
2、配置u-boot,生成.config配置文件:
make -j6 orangepi_zero2_defconfig CROSS_COMPILE="aarch64-none-linux-gnu-"
-j6 -- 指定使用6核运行
后面的参数 CROSS_COMPILE="aarch64-none-linux-gnu-" 指定交叉编译的工具链
3、编译uboot, 生成u-boot-sunxi-with-spl.bin
make -j6 CROSS_COMPILE="aarch64-none-linux-gnu-"
4、将生成的u-boot-sunxi-with-spl.bin 拷贝到开发板上
参考官网对BROM的启动及SD卡数据组成的说明,官网地址如下:
Bootable SD card - linux-sunxi.org
5.然后执行如下命令:
dd if=/dev/zero of=/dev/mmcblk1 bs=1k count=1023 seek=1 status=noxfer #格式化1k到
1M为止的数据
dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk1 bs=1k seek=8 conv=fsync
收! 希望本文能对你有所帮助。