本文转载自:XILINX开发者社区微信公众号
本文来自 XILINX 产品应用工程师 Davis Zhang
OpenAMP framework支持standalone和linux环境下加载RPU的程序,但是没有u-boot下面的支持。U-boot下可以把rpu app binary加载到memory,然后用“cpu”命令启动rpu app。这个流程不是官方支持的方法,所以不在支持范围内,这里只做可行性探讨。下面是简单测试过可行的方法。
根据UG1085 v2.2第90页的内容,exception vector pointer可以设置为TCM(0x0)或者OCM(0xFFFF0000)。因为RPU访问TCM的延时小很多,所以RPU standalone BSP把exception vector pointer设置为TCM。所以RPU app的“.vectors”段必须在link文件里设置为TCM的其实地址,即RPU的0x0地址。
当RPU app的所有段都在TCM里时,我们可以用下面这一个命令把RPU app elf转换为bin文件。
armr5-none-eabi-objcopy -O binary hello_rpu.elf hello_rpu.bin
当RPU app除“.vectors”之外的所有段都在DDR memory里时,我们需要用下面这两个命令把”.vectors”段和其他段分别转换为bin文件。这两个bin文件需要根据所有段在link文件里的地址加载到不同的memory地址。附件是个例子link文件,ddr memory的起始地址被设置为DDR高段地址,我们将在A53 linux设备数里设置linux不可访问这段地址。
armr5-none-eabi-objcopy -O binary -j .vectors hello_rpu.elf hello_rpu_1.bin armr5-none-eabi-objcopy -O binary -R .vectors hello_rpu.elf hello_rpu_2.bin
RPU app不可以和A53 linux共享硬件,我们需要把RPU用到的设备从A53 linux设备树里去掉。附件有个设备树例子,因为RPU app用到了PS uart1,所以设备数里把它去掉。同时,RPU app用到的DDR memory范围0x7F000000~0x7FEFFFFF也从设备数里去掉。这样u-boot也不可以访问这段DDR memory了,这样u-boot不能直接把RPU app的bin文件加载到这段DDR memory。一个办法是生成u-boot镜像的时候,不要在设备数里去掉这段DDR memory,只在生成linux image的时候去掉这段memory。如果PC上有TFTP server,u-boot可以通过网络把tftp server里的RPU app bin文件加载到相应的地址,比如,加载hello_rpu_1.bin和hello_rpu_2.bin的命令分别是:
tftpb 0xFFE00000 hello_rpu_1.bin tftpb 0x7F000000 hello_rpu_2.bin
TCM在A53里的地址映射是从0xFFE00000开始的。启动RPU app的命令是:
cpu 4 release 0x0 split
如果“boot.bin”里不包含RPU app,这样u-boot加载的RPU app在linux启动后会挂住,这是因为u-boot里用“cpu“命令启动RPU app不是官方流程,它缺少fsbl里加载RPU app的一些功能。一个可能的解决方法是在”boot.bin“里包含一个简单的RPU app,这样fsbl会加载这个RPU app,然后我们可以在u-boot里加载自己实际的RPU app,这样linux起来后RPU app就不会挂住了。