作者:付汉杰 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