SWDT在Versal中的应用

作者:Terry Ni,AMD工程师;来源:AMD开发者社区

一、概述

系统看门狗定时器(System WatchDog Timer)通常用于嵌入式系统,可以有效的防止软件错误、系统死锁、篡改以及意外行为,帮助维护健康和安全的系统。

在AMD Versal芯片中,分别在FPD(Full power domain)和LPD(Low power domain)中各自集成了一个SWDT用来帮助客户开发稳定的系统。其整体结构框图如下:

1.png


从框图中可以看到SWDT中包含有2种不同的定时器,分别是窗口模式的定时器(Windowed WatchDog Timer)和通用模式的定时器(Generic WatchDog Timer)。

注意在使用SWDT之前,需要确认LPD和FPD的系统级别的复位是否已经释放,例如CRL.RST_LPD_SWDT寄存器和CRF.RST_FPD_SWDT寄存器。



二、通用模式定时器

通用模式定时器一共包含三个相关寄存器,分别是G_Refresh,G_Offset和G_CSR寄存器。

1. G_CSR寄存器用来使能通用定时器模式,以及反馈状态。

2. G_Offset寄存器用来配置定时的周期时间。

3. G_Refresh寄存器用来刷新定时器,即喂狗。

工作模式如下图所示

2.png

通用模式工作时最多会有两个定时周期,当计数器计时达到第一个定时周期后,定时器会产生一个定时中断。然后计数器会继续计时,当计数器计时到达第二个定时周期后,定时器会产生一个超时中断。在定时器的计数器到达第二个定时周期之前,软件程序都可以通过G_Refresh寄存器刷新计数器计数值,从头开始计时。

可以看到通用模式使用起来非常简单。但是有一点需要注意的是,通用模式的定时器在超时发生之后,并不会输出系统级错误到PSM的错误堆栈中,也就是说不会产生系统错误,从而使得PSM或者PLM程序固件执行相应的系统层面的操作。

三、窗口模式定时器

窗口模式定时器功能较为全面,功能充分考虑了系统安全的各种应用场景。

3.png

窗口模式基本流程如上图所示,一共可以分成三个部分,分别是第一窗口(First Window),第二窗口(Second Window)和二次序列时间(Second Sequence Timer)。一共涉及到5个寄存器,分别是使能与状态寄存器(Enable_and_Status),功能控制寄存器(Funct_Ctrl),第一窗口时间寄存器(First_Wind),第二窗口时间寄存器(Second_Wind)和二次序列时间寄存器(SST_COUNT)。

第一窗口时间是一个封闭的时间段,也就是在这个时间段内应用程序是不能对看门狗进行刷新和复位操作。如果这个时间段内对看门狗进行了刷新喂狗或是复位看门狗操作,那么就会产生一个错误事件,从而输出一个系统错误到PSM和PMC。这样设计是考虑到用户既然配置看门狗,那么就一定是要让看门狗起到作用,所以设置了一个保护看门狗的时间,用来防范系统的异常操作。

当第一窗口保护期到了之后,看门狗会产生一个中断通知系统。这个中断的产生时间可以通过配置功能控制寄存器(Funct_Ctrl)中的BSS和SBC位设定。应用程序可以在接收到中断后刷新看门狗,或者复位/停止/重新配置看门狗。

4.png

如果应用程序在第二窗口没有对看门狗有任何处理,计时器超过了用户设定的第二窗口时间,这个时候会产生超时中断。如果在看门狗运行之前使能了二次序列时间,那么看门狗此时不会立刻产生系统错误,而是等到二次序列时间计时结束之后再产生。这样应用程序就可以有时间去记录一些状态,日志或是处理某些外设等操作,便于后续排查问题或是增加系统的安全性。但是要是没有配置这个二次序列时间,那么看门狗在第二窗口时间超时之后会立刻产生错误事件,并发送系统错误到PSM和PMC。

以上就是看门狗窗口模式下最基础的功能。总的来说,应用程序只有在看门狗处于第二窗口时间段内,才能对看门狗进行刷新喂狗,复位/停止/重新配置操作,否则就会产生错误事件,并发送系统错误到PSM和PMC。另外,需要注意以下两点

1、第一个窗口的时间可以设置为0,从而跳过保护周期。

2、在看门狗运行的任意窗口期间,如果通过LPD和FPD的系统级别的复位对整个看门狗进行复位,那么是不会产生额外中断以及系统错误。

为了进一步提高看门狗的安全性,窗口模式下还提供了两种防止系统异常操作的进阶功能。它们是签名方式(PSM)以及问答方式(Q&A),如下图红框标注的功能。

5.png

1. 签名方式(PSM)

在启动看门狗计时之前,用户需要先在Task_Sig0寄存器中保存一个签名。然后应用程序在第二窗口刷新看门狗之前,先要对Task_Sig1寄存器写入和Task_Sig0一样的签名。当看门狗被正常刷新之后,会先去比较这两个签名是否一致,如果不一致的话就立刻会产生一个错误事件,并产生系统错误输出PSM和PMC。

2. 问答方式(Q&A)。

6.png

7.png

在运行看门狗之前,用户需要先在Token_fb寄存器中设定种子(seed)和反馈(FeedBack)值,这两个值和 使能与状态寄存器(Enable_and_Status)中ACNT位会被用来计算写入 Token_Resp 寄存器的值。算法如下表所示。Token对应种子值,Count对应ACNT值,Feedback Value对应反馈值。

举个例子,如果反馈(Feedback)的值是3,那么应答(response)的每一位的计算方法就需要参考上面列表中的最后一列"11"来进行。那么bit0的值就是将ACNT的bit1值 异或 种子(seed)bit 2的值 再异或 种子(seed)的bit 3的值。当应答8个位的值都计算好之后,写入Token_resp寄存器中即完成了一次问答。

当用户配置好看门狗功能设置,各个窗口时间以及问答种子和反馈值后,需要通过执行第一次应答(response)以后,看门狗才会开始启动计时。并且在第一窗口时间内,用户需要完成第二次和第三次应答,间隔的时间可以由用户自行来控制。当这两次应答完成后,即使第一窗口时间没有计完,也会立即进入第二窗口进行计时。接着,用户需要在第二窗口时间内完成第四次应答。一旦第四次应答在第二窗口完成,即使第二窗口时间没有计完,也会立即返回到第一窗口,重新开始计时。但是,如果在第二窗口内没有完成第四次应答,那么同样会回到第一窗口重新计时,不过接下来的应答还是需要按照第四次应答去完成。

在这个复杂的过程中,可以允许有限次数的应答失败,失败次数保存在使能与状态寄存器(Enable_and_Status)的失败计数位中(Fail count)。也就是说每当失败一次,失败计数就会增加1,每应答成功一次失败计数就会减1。当失败次数累计到7次以后,那么再出现失败,就会产生一个错误事件,并发送系统错误输出到PSM和PMC。

四、总结

Vesal器件中的看门狗模块提供了丰富的功能,从应用简易程度和安全性方面层层递进,让用户根据不同的应用场景来实现对自己系统的保护。

最新文章

最新文章