有客户有需求,希望能够实现RPU 以及BIT文件的单独升级;BOOT.BIN中其他部分不做升级。
这样就需要把RPU以及BIT文件从BOOT.BIN中分离出来,放在uboot中加载。
因为RPU有些特殊,为了能够响应中断,RPU的vector必须运行在TCMA或者OCM区域中。OCM一般有其他用途,默认我们将vector放在TCM中。
这样RPU的链接脚本中,运行地址会分为两段(TCM和DDR),TCM区域的地址在RPU和RPU角度看,地址又是不同的,这就为在uboot下加载RPU ELF带来了一些麻烦,我们需要对UBOOT代码进行一些修改。
在uboot中加载RPU ELF时间,需要将中断向量表所在分区加上0xFFE00000,以便让APU能够正确的将vector加载到TCM中。修改代码patch如附件所示(0001_rpu_bit_split_from_boot.patch)。
该BOOT.BIN不包含bitstream 和 正常的rpu程序但是需要包含一个空的rpu程序,原因如下:
a. fsbl启动阶段如果发现BOOT.BIN中没有rpu程序,会通知PMU将RPU整个poweroff 掉;
b. 另外fsbl启动阶段,会有对rpu的初始化,如果发现BOOT.BIN中没有rpu程序,就不会有这些初始化。
所以我们要做一个空的rpu程序放到BOOT.BIN中(main函数直接return 0),欺骗fsbl帮我们做一些初始化。
bif文件类似这样:
the_ROM_image:
{
[bootloader, destination_cpu=a53-0] /proj/yuyl/splitboot24/splitboot/images/linux/zynqmp_fsbl.elf
[pmufw_image] /proj/yuyl/splitboot24/splitboot/images/linux/pmufw.elf
[destination_cpu=a53-0, exception_level=el-3, trustzone] /proj/yuyl/splitboot24/splitboot/images/linux/bl31.elf
[destination_cpu=a53-0, load=0x100000] /proj/yuyl/splitboot24/splitboot/images/linux/system.dtb
[destination_cpu=a53-0, exception_level=el-2] /proj/yuyl/splitboot24/splitboot/images/linux/u-boot.elf
[destination_cpu=r5-0] /proj/yuyl/splitboot24/splitboot/images/linux/rpu0null.elf
}Demo中默认简化的BOOT.BIN放在第一个FAT分区,rpu以及bitstream放在了第二个FAT分区,如果客户防止rpu、bitstream分区位置有调整,请调整第四部分boot.scr中关于 upgrade_partition的变量的值;如果分区类型不是fat,需要将boot.scr中的fatload 改成对应的文件系统类型的cmd,比如ext4的话,改成ext4load。
我们是将rpu以及bit文件的加载推迟到uboot阶段,通过boot.scr来实现,需要增加以下内容:
rpu0_elf_name 表示rpu对应的elf文件名
bitstream_name PL侧bitstream的名称
upgrade_partition 独立升级文件所在的分区
rpu0_elf_name=rpu0.elf
bitstream_name=system.bit
upgrade_partition=2
#load bitstream
if test -e ${devtype} ${devnum}:${upgrade_partition} /${bitstream_name}; then
fatload ${devtype} ${devnum}:${upgrade_partition} 0x2a00000 ${bitstream_name};
fpga loadb 0 0x2a00000 ${filesize}
fi
#load rpu elf
if test -e ${devtype} ${devnum}:${upgrade_partition} /${rpu0_elf_name}; then
fatload ${devtype} ${devnum}:${upgrade_partition} 0x2a00000 ${rpu0_elf_name};
setenv autostart no
bootrpuelf -p 0x2a00000 -d 0
cpu 4 release 0 split
fi
完整的可以参考附件中的scr文件。
这个boot.scr包含有CRC,不能直接手动修改,需要按照下面的方式进行修改:
a. 将boot.scr转换成txt
tail -c+73 boot.scr > boot.txt
b. 修改
c. 将txt再转换成boot.scr
mkimage -C none -A arm -O linux -T script -n "Boot script" -d boot.txt boot.scr
d. 这个boot.scr修改后,如果重新petalinux-build,可能会被覆盖。需要注意备份。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。