首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >uboot下启动RPU ELF

uboot下启动RPU ELF

原创
作者头像
Frank-大龙
发布2025-05-29 16:00:37
发布2025-05-29 16:00:37
1371
举报
文章被收录于专栏:MPSOCMPSOCPetalinux

一、需求

有客户有需求,希望能够实现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代码进行一些修改。

2.1 修改uboot代码

在uboot中加载RPU ELF时间,需要将中断向量表所在分区加上0xFFE00000,以便让APU能够正确的将vector加载到TCM中。修改代码patch如附件所示(0001_rpu_bit_split_from_boot.patch)。

2.2 生成BOOT.BIN

2.2.1 BIF 文件

该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文件类似这样:

代码语言:C
复制
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
}

2.3 EMMC 分区

Demo中默认简化的BOOT.BIN放在第一个FAT分区,rpu以及bitstream放在了第二个FAT分区,如果客户防止rpu、bitstream分区位置有调整,请调整第四部分boot.scr中关于 upgrade_partition的变量的值;如果分区类型不是fat,需要将boot.scr中的fatload 改成对应的文件系统类型的cmd,比如ext4的话,改成ext4load。

2.4 boot.scr

我们是将rpu以及bit文件的加载推迟到uboot阶段,通过boot.scr来实现,需要增加以下内容:

rpu0_elf_name 表示rpu对应的elf文件名

bitstream_name PL侧bitstream的名称

upgrade_partition 独立升级文件所在的分区

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、需求
  • 二、实现
    • 2.1 修改uboot代码
    • 2.2 生成BOOT.BIN
    • 2.3 EMMC 分区
    • 2.4 boot.scr
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档