作者:付汉杰 hankf@amd.com,来源:博客园
例子
MPSoC swdt是一个简单的看门狗,只有四个寄存器。可以参考xwdtps_polled_example.c使用MPSoC swdt。xwdtps_polled_example.c只测试swdt是否超时,没有使能复位。如果需要复位,搜索代码“XWdtPs_DisableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”,改为“XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL)”。
设置PMU寄存器
但是MPSoC PMU会管理芯片复位。如果要使用MPSoC swdt,在设置MPSoC swdt的寄存器以外,还有设置PMU的寄存器。示例如下。
/* Enable generation of system reset by PMU due to SWDT0/1 */
RegValue = Xil_In32(PMU_GLOBAL_ERROR_SRST_EN_1);
RegValue |= XFSBL_WDT_MASK;
Xil_Out32(PMU_GLOBAL_ERROR_SRST_EN_1, RegValue);
xil_printf("%20s: %06d, ERROR_SRST_EN_1 Register: %08x \r\n",
__func__, __LINE__,
Xil_In32(PMU_GLOBAL_ERROR_SRST_EN_1) );
/* Enable SWDT0/1 System Watchdog Timer Error */
RegValue = Xil_In32(PMU_GLOBAL_ERROR_EN_1);
RegValue |= XFSBL_WDT_MASK;
Xil_Out32(PMU_GLOBAL_ERROR_EN_1, RegValue);
xil_printf("%20s: %06d, ERROR_EN_1 Register: %08x \r\n",
__func__, __LINE__,
Xil_In32(PMU_GLOBAL_ERROR_EN_1) );看门狗复位的Fallback
但是MPSoC的FSBL发现是看门狗引起的复位后,会进入Fallback,再次复位。如果不希望再次复位,可以修改代码XFsbl_ResetValidation( ),请参考下面的代码注释“goto END”即可。
static u32 XFsbl_ResetValidation(void)
{
u32 Status;
u32 FsblErrorStatus;
#ifdef XFSBL_WDT_PRESENT
u32 ResetReasonValue;
u32 ErrStatusRegValue;
#endif
/**
* Read the Error Status register
* If WDT reset, do fallback
*/
FsblErrorStatus = XFsbl_In32(XFSBL_ERROR_STATUS_REGISTER_OFFSET);
#ifdef XFSBL_WDT_PRESENT
ResetReasonValue = XFsbl_In32(CRL_APB_RESET_REASON);
/**
* Check if the reset is due to system WDT during
* previous FSBL execution
*/
if ((ResetReasonValue & CRL_APB_RESET_REASON_PMU_SYS_RESET_MASK)
== CRL_APB_RESET_REASON_PMU_SYS_RESET_MASK) {
ErrStatusRegValue = XFsbl_In32(PMU_GLOBAL_ERROR_STATUS_1);
if(((ErrStatusRegValue & XFSBL_WDT_MASK) == XFSBL_WDT_MASK) &&
(FsblErrorStatus == XFSBL_RUNNING)) {
/* Clear the SWDT0/1 reset error */
XFsbl_Out32(PMU_GLOBAL_ERROR_STATUS_1, XFSBL_WDT_MASK);
/**
* reset is due to System WDT.
* Do a fallback
*/
Status = XFSBL_ERROR_SYSTEM_WDT_RESET;
XFsbl_Printf(DEBUG_GENERAL,"XFSBL_ERROR_SYSTEM_WDT_RESET\n\r");
// goto END; // Continue to boot after wdt reset.
}
}
#endif
/**
* Mark FSBL running in error status register to
* detect the WDT reset while FSBL execution
*/
if (FsblErrorStatus != XFSBL_RUNNING) {
XFsbl_Out32(XFSBL_ERROR_STATUS_REGISTER_OFFSET,
XFSBL_RUNNING);
}
/**
* Read system error status register
* provide FsblHook function for any action
*/
Status = XFSBL_SUCCESS;
#ifdef XFSBL_WDT_PRESENT
END:
#endif
return Status;
}看门狗复位的MULTI_BOOT
Fallback再次复位后,由于更新了MULTI_BOOT的值,会搜索后续的BOOT.BIN。如果单板后面没有BOOT.BIN,甚至只有一个BOOT.BIN,单板会停住。如果不想使用这个特性,搜索“XFsbl_UpdateMultiBoot(RegValue+1U);”, 改为“XFsbl_UpdateMultiBoot(RegValue);”。
查看swdt寄存器
调试时可能需要查看swdt寄存器,检查配置是否生效,可以参考下列代码。
xil_printf("%20s: %06d, Zero Mode Register(00): %08x \r\n",
__func__, __LINE__,
XWdtPs_ReadReg(EffectiveAddress, XWDTPS_ZMR_OFFSET) );
xil_printf("%20s: %06d, Counter Control Register(04): %08x \r\n",
__func__, __LINE__,
XWdtPs_ReadReg(EffectiveAddress, XWDTPS_CCR_OFFSET) );
xil_printf("%20s: %06d, Status Register(08): %08x \r\n",
__func__, __LINE__,
XWdtPs_ReadReg(EffectiveAddress, XWDTPS_SR_OFFSET) );SWDT基地址
MPSoC 有三个SWDT,各自的基地址如下:
CSU_WDT: 0xFFCB0000
LPD SWDT: 0xFF150000
FPD WDT: 0xFD4D0000