【分享】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例子来自于目录XilinxSDK2018.3dataembeddedswXilinxProcessorIPLibdriverswdtps_v3_1examples。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("rn" );
u32_reg = Xil_In32(0xFFD80530);
xil_printf("Old PMU ERROR_STATUS_1 (PMU_GLOBAL) Register: %x.rn", 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.rn", 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.rn", u32_reg );
u32_reg = Xil_In32(0xFFD80540);
xil_printf("New PMU ERROR_STATUS_2 (PMU_GLOBAL) Register: %x.rn", 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.rn", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_CCR_OFFSET);
xil_printf("WDT Counter Control Register: %x.rn", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_RESTART_OFFSET);
xil_printf("WDT Restart Register: %x.rn", u32_reg );
u32_reg = XWdtPs_ReadReg(EffectiveAddress, XWDTPS_SR_OFFSET);
xil_printf("WDT Status Register: %x.rn", u32_reg );
}
6. 致谢
感谢Terry Ni支持。
- WordPress 中禁止某个用户在线编辑主题
- Quartz.net官方开发指南 第七课 : TriggerListeners和JobListeners
- Quartz.net官方开发指南 第八课:SchedulerListeners
- 为WordPress 后台编辑器文本模式(HTML模式)添加按钮
- 360安全扫描之WordPress 页面异常导致本地路径泄漏 的漏洞修补
- Quartz.net官方开发指南 第九课: JobStore
- 数据中心运营中出现的错误
- Quartz.net官方开发指南 第十课: 配置、资源使用以及SchedulerFactory
- WCF服务上应用protobuf
- Quartz.net官方开发指南 第十一课: 高级(企业级)属性
- Quartz.net官方开发指南 第十二课:Quartz 的其他特性
- Protocol Buffers的应用
- WordPress 显示数据库查询次数、查询时间及内存占用的代码
- WCF服务在高负载下可能会变慢
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何让你在众多二手车中挑中满意的?python帮你实现(附源码)
- python苦短_SVM测试
- 招聘信息太多,哪家职位才是适合你的?Python采集招聘信息
- 福利来啦,送给大家一个小游戏的源码,不要错过哟(复制粘贴运行即可玩)
- 今天抠图,Python实现一键换底片!想换什么换什么(附源码)
- 你想不到的沙雕,8行代码Python实现GIF图倒放,每天的快乐源泉
- python爬虫-首医
- 2万8千张图片如何用python组成一张(简洁明了附源码)
- 10 种常用 Matplotlib 图的 Python 代码
- Python爬取某宝商品数据案例:100页的价格、购买人数等数据
- 如何让你的图片加上一层天气的特效?Python帮你解决(附源码)
- Python最简单的图片爬虫,20行代码带你爬遍整个网站
- 用Python把人物头像动漫化,不同的表情给你不同的惊喜
- python苦短-爬取音乐
- python苦短-灵笼说啥