U-boot 编译

引入

在嵌入式系统开发中,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

收! 希望本文能对你有所帮助。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值