[工程师分享]MPSoC Standalone中使用swdt的注意事项

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

最新文章

最新文章