作者:赛灵思工程师 Longley Zhang,本文转载自: XILINX开发者社区微信公众号
1. 简介
在Zynq MPSoC的器件里,PS (Processing System )集成了三个看门狗,分别是CSU SWDT,LPD SWDT和FPD SWDT。CSU SWDT用于保护CSU与PMU及其相关连接。
LPD SWDT主要用于保护RPU系统及其相关连接。
FPD SWDT主要用于保护APU系统及其相关连接。
如果你的程序跑在APU上,并且你需要使用两个看门狗,那么除了FPD SWDT外,你是可以使用LPD SWDT。
2. 对应关系
LPD SWDT和FPD SWDT是提供给用户的应用程序使用的,CSU SWDT主要是由PMUFW和CSU BOOTROM使用的。所以通常情况下,用户可以在自己的应用程序里使用LPD SWDT和FPD SWDT。当客户需要使用时,需要在Vivado里需要使能相关的SWDT。但Vivado里的命名是SWDT0和SWDT1:
而在UG1087的寄存器手册里,SWDT有三个代码段CSU_WDT, SWDT, WDT:
所以有很多用户并不清楚这里面的对应关系。工具命名与手册命名的对应关系可以在UG1085里找到:
3. 在Petalinux里的使用
在Linux里,AMD Xilinx提供了SWDT的驱动,具体的介绍和测试方法可以参考下面wiki页面:
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842055/Cadence+W...
只需要按照该页面的方法,去使能驱动,修改dts和使能ENABLE_EM, 就能在Linux里使用LPD SWDT或FPD SWDT,这里不再详述。
当LPD或FPD SWDT超时后,SWDT并不会直接复位整个系统,而是把超时错误传达给PMU,由PMU决定下一步的错误处理方式(关于PMU的错误处理机制,可以参考UG1085的第6章)。而ENABLE_EM就是使能PMUFW里的错误处理模块,如果不使能该模块,当SWDT超时后,什么操作也不会发生。
PMUFW提供了一套完整的SWDT复位方案。当用户使能ENABLE_RECOVERY后,如果FSBL跑在APU上,PMUFW会初始化FPD SWDT,默认设定时间为60秒。这样在FSBL执行完后,用户自动获取SWDT的监控,通常60秒足够用户启动后续的u-boot或Linux。如果60秒不够,用户可以在u-boot阶段喂一次狗(重启SWDT),或者在PMUFW工程里添加一个定义RECOVERY_TIMEOUT,把需要的时间定义成RECOVERY_TIMEOUT。(注意,这里需要在Vivado工程里使能TTC。)
如果CPU在复位过程中出现挂死现象,建议用户把ENABLE_ESCALATION也添加上。如果PMUFW还有空间的话,建议把CHECK_HEALTHY_BOOT也使能上。下表来自UG1137,是系统重启方案的推荐设置以及空间占用情况的总结。
关于ENABLE_RECOVERY,ENABLE_ESCALATION和CHECK_HEALTHY_BOOT的更多介绍,请用户参考 UG1137。
4. CSU WDT的使用
CSU WDT的使用比较简单,只需要在PMUFW里使能ENABLE_WDT,就能让CSU WDT监测PMU的运行。FSBL启动后,CSU WDT会设置为90毫秒超时,而PMUFW会有一个task每50毫秒喂一次狗。
请注意,如果用户在PMUFW里添加了自己的代码,并且使能了CSU WDT,那需要注意CSU WDT的超时时间。因为如果你在你的代码里添加了延迟(比如sleep),如果延时超过90毫秒,会导致CSU WDT触发从而产生异常。
5. 参考文档
本文只是简单的介绍了看门狗(SWDT)在Zynq MPSoC在使用上的一下简单技巧,帮助用户快速地使用看门狗功能。如果想了解看门狗(SWDT)的完整功能,请仔细阅读下面的参考文档。
UG1085 第14章:https://www.xilinx.com/content/dam/xilinx/support/documentation/user_gui...
UG1137 第10,12章: https://www.xilinx.com/content/dam/xilinx/support/documentation/sw_manua...