一、u-boot简介
uboot是一种通用的引导加载程序,它可以用于多种嵌入式系统,支持多种操作系统,如Linux, Android,NetBSD等。uboot的主要作用是将操作系统内核从存储设备(如Flash, SD卡等)加载到内存中,并执行内核代码。
二、XIP设备
XIP设备是指一种可以直接在存储器中执行程序代码的设备,而不需要将代码复制到内存中。XIP的全称是eXecute In Place,即芯片内执行。像片内的SRAM, NOR Flash, BROM等。
三、为什么需要u-boot
因为嵌入式系统的硬件资源有限,CPU上电后只能执行一小段内置的代码(BROM System),这段代码不足以完成内存初始化,文件系统访问,网络通信等复杂的任务。因此,需要一个中间层的程序,来完成这些工作,并引导操作系统启动。
四、u-boot启动流程
执行顺序:
1. 当H616芯片上电或复位后,brom会自动执行,它会根据芯片的引脚电平或寄存器设置,确定启动模式,如从nand flash,spi flash,sd卡,usb等设备中启动。
2. brom会根据启动模式,选择相应的设备驱动,初始化SD卡设备控制器,设置设备参数,如时钟频率,总线宽度,电压等级等
3. brom会从启动设备的特定扇区中,读取第一级引导程序,如spl将其加载到芯片的内部sram中,并跳转到其入口点执行
4. spl会继续初始化一些硬件设备,如ddr,pll,gpio等,然后从启动设备的特定分区中,读取第二级引导程序,如uboot proper,将其加载到ddr中,并跳转到其入口点执行,
5. uboot会继续初始化一些硬件设备,如网卡,lcd,从SD卡中读取内核文件,启动操作系统。
五、u-boot编译流程
方法一:
1. 运行 build.sh 脚本, 记得加 sudo 权限
test@test:~/orangepi-build$ sudo ./build.sh
2. 选择 U-boot package, 然后回车
3. 接着选择开发板的型号
4. 重复编译 u-boot 时, 使用下面的命令无需通过图形界面选择, 可以直接开始编译 u-boot
sudo ./build.sh BOARD=orangepizero2 BRANCH=next BUILD_OPT=u-boot
5. 查看编译生成的 u-boot deb 包
test@test:~/orangepi-build$ ls output/debs/u-boot/linux-u-boot-nextorangepizero2_
3.1.0_arm64.deb
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 reboot -f
方法二:
1、清理u-boot:
sudo chown test:test 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-"
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卡数据组成的说明 ,然后执行如下命令:
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