Xilinx MPSoC FSBL中的看门狗的用法总结
Xilinx MPSoC的FSBL中使用了看门狗,避免单板进入异常后一直挂死。下面是FSBL关于看门狗的用法总结。
Vivado配置
Vivado中的PS配置中,如果使能了wdt,FSBL会自动使能看门狗。
/**
* Definition for WDT to be included
*/
#if (!defined(FSBL_WDT_EXCLUDE) && defined(XPAR_PSU_WDT_0_DEVICE_ID))
#define XFSBL_WDT_PRESENT
#define XFSBL_WDT_DEVICE_ID XPAR_PSU_WDT_0_DEVICE_ID
#define XFSBL_WDT_MASK PMU_GLOBAL_ERROR_SRST_EN_1_LPD_SWDT_MASK
#elif (!defined(FSBL_WDT_EXCLUDE) && defined(XPAR_PSU_WDT_1_DEVICE_ID))
#define XFSBL_WDT_PRESENT
#define XFSBL_WDT_DEVICE_ID XPAR_PSU_WDT_1_DEVICE_ID
#define XFSBL_WDT_MASK PMU_GLOBAL_ERROR_SRST_EN_1_FPD_SWDT_MASK
#endif
初始化和使能流程
WDT的初始化代码的实现在xfsbl_misc_drivers.c中的函数XFsbl_InitWdt( )中,它在xfsbl_initialization.c中的函数 XFsbl_PrimaryBootDeviceInit( )中被调用。
关闭流程
在FSBL正常退出前, 在文件xfsbl_handoff.c中的函数XFsbl_Handoff ( )中, FSBL调用了XFsbl_StopWdt(),关闭看门狗。
#ifdef XFSBL_WDT_PRESENT
if (XFSBL_MASTER_ONLY_RESET != FsblInstancePtr->ResetReason) {
/* Stop WDT as we are exiting FSBL */
XFsbl_StopWdt();
}
#endif
超时时间
WDT的默认超时时间,XFSBL_WDT_EXPIRE_TIME,是100秒。
#ifdef XFSBL_WDT_PRESENT
#define XFSBL_WDT_EXPIRE_TIME (100U)
#define XFSBL_WDT_CRV_SHIFT (12U)
#endif
重启处理
如果看门狗导致复位,FSBL会返回错误状态值XFSBL_ERROR_SYSTEM_WDT_RESET,从而进入XFSBL_STAGE_ERR,执行XFsbl_ErrorLockDown()和XFsbl_FallBack( )。XFsbl_FallBack( )会增加MULTI_BOOT值,并再次重启动。FallBack操作要求启动设备中有多个Boot.bin。
如果不希望Fallback和再次复位,可以修改代码XFsbl_ResetValidation( ),请参考下面的代码注释“goto END”即可。
#ifdef XFSBL_WDT_PRESENT
ResetReasonValue = XFsbl_In32(CRL_APB_RESET_REASON);
XFsbl_Printf(DEBUG_GENERAL," ResetReason register: %08x.\n\r", ResetReasonValue);
XFsbl_Out32(CRL_APB_RESET_REASON, ResetReasonValue);
/**
* 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);
XFsbl_Printf(DEBUG_GENERAL," ERROR_STATUS_1: %08x.\n\r", ErrStatusRegValue);
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, fallback\n\r");
goto END;
}
}
#endif
Fallback
请参考UG1085 的章节“Golden Image Search”。
对于QSPI Flash,依次增加32 KB偏移地址来搜索后续的启动映像。对于SD,按boot0001.bin, boot0002.bin, boot0003.bin, ......, boot4095.bin的顺序来搜索后续的启动映像。建议偏移或者文件序号不要太大,否则搜索过程可能花费比较长的时间。比如第一次上电,MultiBoot为0,从SD卡启动搜索到boot0001.bin几乎不需要时间,从SD卡启动搜索到boot2048.bin大约需要8秒钟。
boot4095.bin的启动记录如下:
Xilinx Zynq MP First Stage Boot Loader
Release 2021.2 Dec 9 2022 - 10:09:44
MultiBootOffset: 0xFFF
Reset Mode : System Reset
Platform: Silicon (4.0), Cluster ID 0x80000000
Running on A53-0 (64-bit) Processor, Device Name: XCZU7EV
FMC VADJ Configuration Successful
Board Configuration successful
ResetReason register: 00000001.
Processor Initialization Done
RESET_REASON: 00000000.
RESET_REASON register: 00000001.
================= In Stage 2 ============
FsblInstance.ResetReason: 0.
WDT initialization successed
SD1 with level shifter Boot Mode
SD: rc= 0
File name is BOOT4095.BIN
Multiboot Reg : 0xFFF
Image Header Table Offset 0x8C0
*****Image Header Table Details********
Boot Gen Ver: 0x1020000
No of Partitions: 0x3
Partition Header Address: 0x440
Partition Present Device: 0x0
Initialization Success
======= In Stage 3, Partition No:1 =======
UnEncrypted data Length: 0x2430DE
Data word offset: 0x2430DE
Total Data word length: 0x2430DE
Destination Load Address: 0xFFFFFFFF
Execution Address: 0x0
Data word offset: 0x8EA0
Partition Attributes: 0x26
Destination Device is PL, changing LoadAddress
Non authenticated Bitstream download to start now
DMA transfer done
PL Configuration done successfully
Partition 1 Load Success
======= In Stage 3, Partition No:2 =======
UnEncrypted data Length: 0x2C12
Data word offset: 0x2C12
Total Data word length: 0x2C12
Destination Load Address: 0x0
Execution Address: 0x0
Data word offset: 0x24BF80
Partition Attributes: 0x116
Partition 2 Load Success
All Partitions Loaded
================= In Stage 4 ============
PMU-FW is not running, certain applications may not be supported.
Protection configuration applied
Running Cpu Handoff address: 0x0, Exec State: 0
Exit from FSBL
WDT Polled Mode Example Test
WdtPsPolledExample: 000240, timer: 094655D3 = 155604435 at the beginning.
WdtPsPolledExample: 000295, Zero Mode Register(00): 000001C2
WdtPsPolledExample: 000299, Counter Control Register(04): 000003FD
WdtPsPolledExample: 000309, Status Register(08): 00000000
WdtPsPolledExample: 000320, ERROR_SRST_EN_1 Register(08): 00000000
WdtPsPolledExample: 000329, ERROR_EN_1 Register(08): 00001000
WdtPsPolledExample: 000346, timer: 097CD774 = 159176564, after 35721 ms before loop.