how to reset CPU1 in AMP (petalinux + 裸核)

 

how to reset CPU1 in AMP (petalinux + 裸核)
跳至解决方案

Hi Xilinx,

   vivado/sdk/petalinux 2017.4, microzed 7020, AMP xapp1078

按照 xapp1078,做成了 AMP (petalinux on cpu0 + 裸核 on cpu1)。现在想从 cpu0 reset cpu1,然后在cpu1上重新启动 app_cpu1.elf,找了一圈不得要领(都是SDK的code,不知道在哪里添加,难道要改 fsbl,还是其他地方??)。主要参考了

https://www.xilinx.com/support/answers/53828.html

https://blog.csdn.net/pzkf/article/details/88301550

https://forums.xilinx.com/t5/OpenAMP/reset-cpu1-from-cpu0-AMP-zynq/m-p/881369#M560

直接在 linux  里

root@MYPROJECT:~# poke 0xFFFFFF00 0xe3e0000f
root@MYPROJECT:~# poke 0xFFFFFF04 0xe3a01000
root@MYPROJECT:~# poke 0xFFFFFF08 0xe5801000
root@MYPROJECT:~# poke 0xFFFFFF0C 0xe320f002
root@MYPROJECT:~# poke 0xFFFFFF10 0xe5902000
root@MYPROJECT:~# poke 0xFFFFFF14 0xe1520001
root@MYPROJECT:~# poke 0xFFFFFF18 0x0afffffb
root@MYPROJECT:~# poke 0xFFFFFF1C 0xe1a0f002

root@MYPROJECT:~# poke 0x00000000 0xe3e0f0ff
root@MYPROJECT:~# poke 0xFFFFFFF0 0x00000000

root@MYPROJECT:~# poke 0x00000024 0x30000000
root@MYPROJECT:~# poke 0xf8000008 0xdf0d

root@MYPROJECT:~# poke 0xf8000244 0x2
root@MYPROJECT:~# poke 0xf8000244 0x22
root@MYPROJECT:~# poke 0xf8000244 0x20
root@MYPROJECT:~# poke 0xf8000244 0x0

root@MYPROJECT:~# poke 0xf8000004 0x0000767B

cpu1 看上去是被 reset了,但是却没有重新启动 app_cpu1.elf

请高手指点,谢谢

 

 
 
 
1 解答 
 
 
 
 

问题部分解决了,按照 https://www.xilinx.com/support/answers/58387.html 设置 OCM_CFG

在 Petalinux 2014.4 里, 更改 Petalinux 启动地址如下,

$ petalinux-config

Subsystem AUTO Hardware Settings --->
Memory Settings --->

│ │ (0x10000000) System memory base address
│ │ (0x20000000) System memory size
│ │ (0x10000000) kernel base address
│ │ (0x400000) u-boot text base address offset to memory high address

这样, AMP (Petalinux + bare-metal) cpu0 就可以 reset and restart app_cpu1.elf

但是,按以上方法 Petalinux 2017.4 build 出来的 Boot.bin / image.ub 无法启动,terminal 没有任何输出。我要新开帖子,希望Xilinx 专家指点 ~~ 谢谢

 
 
 

从你的参考资料里,相信你已经了解到了cpu1 reset之后会从0地址启动,如果0地址是OCM,那么对应的代码应该是fsbl的“BOOT.S”里的内容。从下面这个帖子里Johnmcd(xapp1078和xapp1079的作者)的回复,你可以看到最新的xapp1079的fsbl已经修改了fsbl BSP的 asm_vectors.S 和 boot.S,从而让它可以检测当前访问这段代码的cpu号码,然后做出不同的反应,如果是cpu1,这段修改后的代码会直接跳转PC指针到你在代码里指定的位置,从而实现cpu1运行自己的elf。2017.4版本fsbl可能已经做了类似修改,它可以检测运行fsbl代码的cpu编号,如果是cpu1,它可能会把PC指针跳转到WFE loop的地址,从而实现与上电时cpu1的相同状态,你需要在地址0xFFFFFFF0里写入elf的入口地址。我觉得你可以参考xapp1079的方式修改fsbl的asm_vectors.S 和 boot.S,需要改的地方改,不需要改的就不改。

另外一个问题是,需要确认linux启动后,物理地址0是OCM还是DDR,这是通过SCU里的address filter控制的,如果0地址是DDR memory,那么cpu1 reset后在0地址执行的就不是fsbl的代码了。参考UG585 v1.12.2 table 4-1, section, 29.2.5。

 

Hi @exds75 

你的需求是一定要reset CPU1,还是停止CPU1运行然后重新加载新的firmware运行?

如果是后者的话,使用Linux下Remoteproc的API接口就能够实现对remote core的各种管理,包括load firware/run/stop等等。

供参考~

----------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
----------------------------------------------------------------------------------------------

 
 

谢谢 yzhang的回复, 查看了 OCM_CFG register

# peek 0xF8000910
回复数值是 0x1f, 根据 UG585 Chapter 29.2.4,
"When OCM_CFG = 0x1F, OCM address is mapped to 0xFFFC0000 - 0xFFFFFFFF"
"When OCM_CFG = 0x18, OCM address is mapped to 0x00000000 - 0x0002FFFF and 0xFFFF00000 - 0xFFFFFFFF"

0x0 属于 linux DDR, 而不是 OCM.

有什么办法吗? 请指教

 

SCU的address filter是两个cpu共享的,所以你为了cpu1而修改了它的值使得0地址为OCM之后,cpu0看到的0地址也是OCM。我不确定cpu0 linux会不会使用0地址开始的那段地址,你可以试试。就在linux修改address filter试试。

 

 

"When OCM_CFG = 0x1F, OCM address is mapped to 0xFFFC0000 - 0xFFFFFFFF"

仔细看一下,OCM mapping 起始地址是 0xFFFC0000,已经对应了2段 0xFFFC0000 - 0xFFFEFFFF 和 0xFFFF00000 - 0xFFFFFFFF, 0x0 应该不能再用了吧?

把双裸核 AMP 做了一下,cpu0 是可以 reset 并重启 app_cpu1 的。这样子是不是 fsbl 和 bsp 应该不用再改了?

#include "xil_misc_psreset_api.h"
#include "xil_io.h"
#define A9_CPU_RST_CTRL (XSLCR_BASEADDR + 0x244)
#define A9_RST1_MASK 0x00000002
#define A9_CLKSTOP1_MASK 0x00000020
#define CPU1_CATCH 0x00000024
#define XSLCR_LOCK_ADDR (XSLCR_BASEADDR + 0x4)
#define XSLCR_LOCK_CODE 0x0000767B

u32 RegVal;

Xil_SetTlbAttributes(0x00000000,0x14de2);

Xil_Out32(CPU1_CATCH, 0x39000000);
/* Unlock the slcr register access lock */
Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE);

/* Assert and deassert cpu1 reset and clkstop using above sequence*/
RegVal = Xil_In32(A9_CPU_RST_CTRL);
RegVal |= A9_RST1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal |= A9_CLKSTOP1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal &= ~A9_RST1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);
RegVal &= ~A9_CLKSTOP1_MASK;
Xil_Out32(A9_CPU_RST_CTRL, RegVal);

// Xil_Out32(0xFFFFFFF0, 0x30000000);
/* lock the slcr register access */
Xil_Out32(XSLCR_LOCK_ADDR, XSLCR_LOCK_CODE);

 

Hi yzhang,

我打印出来 register 数值,发现OCM 在 裸核里被 map to 0x0, 但是 Petalinux 把 OCM map to 0xFFFC0000。

register 地址     bare-metal              Petalinux

0xFFFFFF00 = F8000004                  F8000004  
0xFFFFFF04 = 0000767B                  0000767B
0xFFFFFF08 = 00000000                  00000000
0xFFFFFF0c = 00000000                  00000000
0xFFFFFF10 = 00000000                  00000000
0xFFFFFF14 = 00000000                  00000000
0xFFFFFF18 = 00000001                  00000001
0xFFFFFF1c = 00000000                  00000000
0x00000000 = EA000047                  0xFFFC0000 = EA000047 
0x00000024 = 0000014C                  0xFFFC0024 = 0000014C
0xFFFFFFF0 = 30000000                    0xFFFFFFF0 = 30000000

这样怎么才能 在 Petalinux 里 reset and restart app_cpu1.elf 呢?请指教。谢谢

 

 

 

问题部分解决了,按照 https://www.xilinx.com/support/answers/58387.html 设置 OCM_CFG

在 Petalinux 2014.4 里, 更改 Petalinux 启动地址如下,

$ petalinux-config

Subsystem AUTO Hardware Settings --->
Memory Settings --->

│ │ (0x10000000) System memory base address
│ │ (0x20000000) System memory size
│ │ (0x10000000) kernel base address
│ │ (0x400000) u-boot text base address offset to memory high address

这样, AMP (Petalinux + bare-metal) cpu0 就可以 reset and restart app_cpu1.elf

但是,按以上方法 Petalinux 2017.4 build 出来的 Boot.bin / image.ub 无法启动,terminal 没有任何输出。我要新开帖子,希望Xilinx 专家指点 ~~ 谢谢

 

 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值