编译U-Boot
PanGu开发板支持eMMC,QSPI Flash,SD Card方式的启动。
启动方式 | 配置文件 | 适用设备 |
支持从SD,eMMC启动 | pangu_basic_defconfig | PanGu eMMC版本 |
PanGu开发板使用U-Boot作为整个系统的启动加载程序。构建U-Boot后得到两个文件,u-boot-spl.stm32和u-boot.img。u-boot-spl.stm32再spl目录下,u-boot.img在u-boot的根目录下。可写入到不同存储设备内。
U-Boot的源代码在开发资源包的"Source/Linux"目录下存放,文件名为u-boot-xxxx.tar.gz,这里的xxxx代表版本标识。以实际为主。
下载好U-Boot的代码后,在工作目录下解压,并请确认当前shell已加载SDK的环境变量。
$ cd $HOME/PanGu
$ tar xvf u-boot-st.tar.gz
U-Boot支持多种boot chain,Basic boot 和 Trusted boot。
Basic boot
$ make pangu_basic_defconfig
$ make DEVICE_TREE=stm32mp157a-panguboard all
Trusted boot
$ make pangu_trusted_defconfig
$ make DEVICE_TREE=stm32mp157a-panguboard all
编译结束后,在当前目录下可以查看当前目录和spl目录,可以看到对应的文件。
$ ls
api config.mk cscope.po.out drivers include MAINTAINERS scripts tools u-boot.dtb u-boot.map
arch configs ctags dts Kbuild Makefile spl u-boot u-boot-dtb.bin u-boot-nodtb.bin
board cscope.files disk env Kconfig net System.map u-boot.bin u-boot-dtb.img u-boot.srec
cmd cscope.in.out doc examples lib post tags u-boot.cfg u-boot.img u-boot.sym
common cscope.out Documentation fs Licenses README test u-boot.cfg.configs u-boot.lds
$ ls spl/
arch common dts include u-boot-spl u-boot-spl-dtb.bin u-boot-spl-nodtb.bin u-boot-spl.stm32.log
board disk env lib u-boot-spl.bin u-boot-spl.lds u-boot-spl-pad.bin
cmd drivers fs u-boot.cfg u-boot-spl.dtb u-boot-spl.map u-boot-spl.stm32
构建完成后,会生成一些文件,以下是文件说明
文件 | 说明 |
spl/u-boot-spl.stm32 | 包含STM32信息头的SPL 二进制文件,在Basic boot chain下用于FSBL |
u-boot.img | 包含UImage信息头的U-Boot 二进制文件,在Basic boot chain下用于SSBL |
u-boot.stm32 | 包含STM32信息头的U-Boot二进制文件,在Trusted boot chain下用于SSBL |
u-boot | U-Boot的ELF文件,用于GDB调试 |
spl/u-boot-spl | SPL的ELF文件,通常用于gdb调试 |
常见问题
版本管理
kernel开发中,建议使用git来管理源代码,更便捷的管理代码的多个版本。如果在修改kernel并测试后,代码无误,可以提交到本地仓库中,这样后面使用Yocto来构建系统也更容易。
替换SD卡的U-Boot
测试新的U-Boot程序时,可以使用SD卡启动方式,可以快速验证U-Boot是否正常启动,可以将U-Boot写入SD卡的对应分区。
如下代码中的/dev/sdb是SD卡设备,具体设备以实际为主,请确认后再操作,避免对现有硬盘的损坏。更新文件前需要先对SD做分区操作,如果SD已经有分区可以不需要本步骤。
$ sudo sgdisk --resize-table=128 -a 1 \
-n 1:34:545 -c 1:fsbl1 \
-n 2:546:1057 -c 2:fsbl2 \
-n 3:1058:5153 -c 3:ssbl \
-n 4:5154:136225 -c 4:bootfs \
-n 5:136226: -c 5:rootfs \
-A 4:set:2 \
-p /dev/sdb
Basic bootchain下替换SD中的Bootloader
$ dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
$ dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
$ dd if=u-boot.img of=/dev/sdb3 conv=fdatasync
Trusted bootchain下替换SD中的Bootloader
$ dd if=u-boot.stm32 of=/dev/sdb3 conv=fdatasync
Basic bootchain下替换eMMC中的Bootloader
Basic bootchain下的Bootloader由U-Boot提供,把编译后的U-Boot镜像文件spl.stm32和u-boot.img写入到eMMC。
以下命令操作在开发板上运行,执行错误或文件写入错误,会导致开发板无法启动。如出现无法启动的情况,请重新烧写开发板即可。
# echo 0 > /sys/class/block/mmcblk1boot0/force_ro
# echo 0 > /sys/class/block/mmcblk1boot1/force_ro
# dd if=spl.stm32 of=/dev/mmcblk1boot0 conv=fdatasync
# dd if=spl.stm32 of=/dev/mmcblk1boot1 conv=fdatasync
# echo 1 > /sys/class/block/mmcblk1boot0/force_ro
# echo 1 > /sys/class/block/mmcblk1boot1/force_ro
# mmc bootpart enable 1 1 /dev/mmcblk1
# dd if=u-boot.img of=/dev/mmcblk1p1 conv=fdatasync
Trusted bootchain下替换eMMC中的Bootloader
Trusted bootchain下的U-Boot提供SSBL阶段的文件,例如u-boot.stm32,文件名以stm32结尾。
# dd if=u-boot.stm32 of=/dev/mmcblk1p1 conv=fdatasync
最后编辑:SteveChen 更新时间:2024-09-18 11:47