专栏首页hank【分享】MPSoC SWDT在Standalone下的应用

【分享】MPSoC SWDT在Standalone下的应用

1. Author

Hank Fu (付汉杰) Staff FAE embedded, Xilinx, Inc. hankf@xilinx.com

2. 问题

有工程师反映,根据MPSoC SWDT在Standalone下的例子xwdtps_polled_example.c,不能实现MPSoC的PS复位。SWDT例子来自于目录\Xilinx\SDK\2018.3\data\embeddedsw\XilinxProcessorIPLib\drivers\wdtps_v3_1\examples\。SWDT例子xwdtps_polled_example.c只检查了超时状态,没有实现复位。工程师把其中的“XWdtPs_DisableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”改为“XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”,仍然不能复位。

工程师根据FSBL的main.c中的InitWatchDog( ),添加代码后,依然不能使MPSoC的PS复位。

3. 分析

3.1. FSBL的main.c

main.c是Zynq-7000的FSBL的代码。客户使用SOurce Insight分析代码时,使用了错误的文件。

3.2. MPSoC的FSBL

MPSoC的FSBL的主文件是xfsbl_main.c,wdt的代码在xfsbl_misc_drivers.c和xfsbl_misc_drivers.h中,初始化WDT的函数是u32 XFsbl_InitWdt(void),宏定义XFSBL_WDT_EXPIRE_TIME定义了FSBL中wdt的超时时间。

在XFsbl_InitWdt(void)中,初始化并启动WDT(XWdtPs_RestartWdt( ))后,直接使用sleep(20),睡眠20秒。睡眠过程中,因为WDT超时,MPSoC的PS会被复位。这说明FSBL关于WDT代码是正确的。

3.3. Standalone下的WDT

对比MPSoC FSBL初始化WDT的函数XFsbl_InitWdt( ),发现它设置了PMU的ERROR_SRST_EN_1 Register和ERROR_EN_1 Register。把相关代码复制到Standalone下的代码,在初始化WDT之前运行。重新编译后,WDT超时会复位MPSoC的PS。

3.4. 再次运行时,设置PMU的ERROR_SRST_EN_1后,PS马上复位。

WDT超时后,再次使用Debugger运行时,设置PMU的ERROR_SRST_EN_1后,WDT还没有被初始化时,PS马上被复位。检查PMU ERROR_STATUS_1 Register,发现WDT的超时状态为1。于是把读取到的ERROR_STATUS_1的值,再写回ERROR_STATUS_1 Register,清除WDT的超时状态。

这样在WDT超时后,设置PMU的ERROR_SRST_EN_1后,PS不会马上被复位。

3.5. FPD_SWDT 和 LPD_SWDT

工程师发现使用LPD_SWDT,能复位PS;换成FPD_SWDT,不能复位PS。 在设置PMU的ERROR_SRST_EN_1 Register和ERROR_EN_1 Register时,LPD_SWDT和FPD_SWDT有各自的使能位。增加设置FPD_SWDT的使能位后,换成FPD_SWDT,也能复位PS。

#define PMU_GLOBAL_ERROR_SRST_EN_1    ( ( PMU_GLOBAL_BASEADDR ) + 0X0000056CU )
#define PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK    0X00001000U
#define PMU_GLOBAL_ERROR_SRST_EN_1_FPD_SWDT_MASK    0X00002000U

4. Vivado 设置

使用WDT,要在Vivado里的PCW里,使能对应的WDT。

5. 相关代码

5.1. 检查和清除PMU寄存器

    xil_printf("\r\n" );
    u32_reg = Xil_In32(0xFFD80530);
    xil_printf("Old PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x.\r\n", u32_reg );
    Xil_Out32(0xFFD80530, u32_reg); // Clear PMU ERROR_STATUS_1 (PMU_GLOBAL) Register

    u32_reg = Xil_In32(0xFFD80540);
    xil_printf("Old PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x.\r\n", u32_reg );
    Xil_Out32(0xFFD80540, u32_reg); // Clear PMU ERROR_STATUS_2 (PMU_GLOBAL) Register

    u32_reg = Xil_In32(0xFFD80530);
    xil_printf("New PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x.\r\n", u32_reg );

    u32_reg = Xil_In32(0xFFD80540);
    xil_printf("New PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x.\r\n", u32_reg );

5.2. 检查SWDT寄存器状态

void CheckWDTRegisterValue( u32 EffectiveAddress )
{
    u32 u32_reg;

    u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_ZMR_OFFSET);
    xil_printf("WDT Zero Mode Register: %x.\r\n", u32_reg );
    u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_CCR_OFFSET);
    xil_printf("WDT Counter Control Register: %x.\r\n", u32_reg );
    u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_RESTART_OFFSET);
    xil_printf("WDT Restart Register: %x.\r\n", u32_reg );
    u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_SR_OFFSET);
    xil_printf("WDT Status Register: %x.\r\n", u32_reg );
}

6. 致谢

感谢Terry Ni支持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【分享】MicroBlaze大内部存储器(AXI BRAM)设计

    MicroBlaze可以使用AXI BRAM存放数据和指令。有些客户软件很大,需要把AXI BRAM的空间做到最大。AXI BRAM底层是Block RAM或者...

    hankfu
  • 【分享】解决gst-launch-1.0错误“ERROR: Failed to allocate required memory.”

    执行gst-launch-1.0时,得到错误“ERROR: from element /GstPipeline:pipeline0/GstV4l2Src:v4l...

    hankfu
  • Upgrade Zynq-7000 XIP reference design to Xilinx SDK 2018.3

    Xilinx provided reference design Zynq-7000 AP SoC Boot - Booting and Running Wit...

    hankfu
  • 设计模式学习之观察者模式

    如下内容是学习《Head First 设计模式》第二部分《观察者模式》所得,主要就是一些原文的摘抄和少量自己的总结。

    mzlogin
  • Gut | 汤富酬研究组与付卫研究组合作揭示家族性腺瘤性息肉病的发病机制 ​

    结直肠癌在全球范围内是发病率第三、致死人数第四的恶性肿瘤(Beattie et al., 2005 ; Carey, 2017; Church, 2016)。结...

    生信宝典
  • 如何更愉快地使用em

    CSS提供了很多种方式去定义一个值。大家最熟悉的可能也是最容易使用的就是像素(pixel),这被称做“绝对单位”。也就是说,5px在不同的场景下是一样的值。而其...

    六小登登
  • 回归模型评估指标(机器学习基础)

    注:在英语中,error和deviation的含义是一样的,所以Mean Absolute Error也可以叫做Mean Absolute Deviation(...

    商业新知
  • 面试题系列第1篇:说说==和equals的区别?你的回答可能是错误的

    大多数面试的第一题不是让说说面向对象,就是关于字符的。本篇文章就从各方面来聊聊“==和equals的区别”。

    程序新视界
  • golang 服务诡异499、504网络故障排查

    11-01 12:00 中午午饭期间,手机突然收到业务网关非200异常报警,平时也会有一些少量499或者网络抖动问题触发报警,但是很快就会恢复(目前配置的报警阈...

    王清培
  • 差异共表达网络-Co-expression networks

    第一步,基于每对基因间的相关性或相互信息定义每2个基因之间的个体关系。这些关系描述了所有样本中基因对表达模式之间的相似性。不同的相关性方法已经被用了构建网络,包...

    Y大宽

扫码关注云+社区

领取腾讯云代金券