rk3399_android7.1关于看门狗驱动的实现原理说明

watchdog 一般是用来监视某个进程,或整个系统的。
一般在 linux3.10 及以前的驱动里都只开了中断喂狗,保证内核异常时能重启即可。
watchdog 的使用标准化,可以这样:
在某个特定功能的进程里去 open write close 操作 /dev/watchdog ,一旦该进程出现异常,无法执行喂狗操作,或者被 kill 掉,就会通过 watchdog 触发复位,重启。
以安卓为例,会启动普通进程 ./sbin/watchdogd ,如果该进程被 kill 或系统异常无法调度执行,就会触发 watchdog 复位重启。
比如广告机,户外的一些机器,需要系统不间断运行,即便系统死机或者某个程序异常后能触发重启,保证机器继续运行。

这里使用的RTC芯片是RTC1805。
RTC1805驱动跑起来就默认看门狗是kernel feeddog的,每隔2s feeddog一次(feeddog其实就是向特定的rtc芯片【rtc1805芯片】寄存器写入特定的寄存器值,使芯片正常运行,不通过中断脚触发中断信号,一旦feeddog停止就会触发rtc中断信号发出,主控收到中断就会强制复位而重启系统。目前我们的板子都是做的假待机,所以feeddog不会受影响,如果是真待机情况下[kernel进入休眠,不跑kernel],kernel就不自动feeddog就会导致系统重启,所以需要在suspend的情况下关闭feeddog,在唤醒系统的时候再重新打开,以下是feeddog的接口函数。


/*
 *	am1805_watchdog_feeddog- set up the watchdog timer   
 *
 *	Inputs:
 *	period - timeout period in ms (65 to 124,000)
 *	pin - pin to generate the watchdog signal
 *		0 => disable WDT
 *		1 => generate an interrupt on FOUT/nIRQ
 *		2 => generate an interrupt on PSW/nIRQ2
 *		3 => generate a reset on nRST (AM18xx only)
 *
 */

am1805_watchdog_feeddog(rtc_info->watchdog_timer,WATCHDOG_INT_PIN_RST);//设置feeddog,并且使能reset pin,发送feeddog信号
am1805_watchdog_feeddog(rtc_info->watchdog_timer,WATCHDOG_INT_DISABLE); //设置disabled feeddog


rtc_am1805看门狗验证:

首先确认有以下两个节点:

sys/class/rtc_am1805/feeddog //feddog 操作
sys/class/rtc_am1805/timer //设置disabled feeddog之后,然后重新使能kernel feeddog在time之后系统重启

查看看门狗的状态:

root@stvs912:/ # cat sys/class/rtc_am1805/feeddog                              
1 -- kernel feed //驱动默认起来就是kernel feeddog状态

root@stvs912:/ # echo 0 > sys/class/rtc_am1805/feeddog //关闭看门狗功能
root@stvs912:/ # echo 1 > sys/class/rtc_am1805/feeddog  //本身kernel feeddog,kernel有定时器设置,
														//每隔一定时间(feeddog time)kernel
														//会自动feeddog【往对应寄存器写入对应的值】,这里时间是2s,
														//如果这里写入一次1就会跳出kernel自动的feeddog,
														//然后进行一次类似kernel feeddog的写寄存器操作,
														//时间到(2s)的时候RTC芯片的中断脚就会触发出中断信号,
														//系统接收到信号就会执行重启操作
														
root@stvs912:/ # echo 2 > sys/class/rtc_am1805/feeddog //user feeddog,需要用户每隔一定时间feeddog一次
													//(shell-env下执行echo 2 > sys/class/rtc_am1805/feeddog),
													//否则会自动复位重启系统

通过以下节点可以设置feeddog time验证看门狗功能:

rk3399_all:/ # ls -l sys/class/rtc_am1805/timer
-rw-r--r-- 1 root root 4096 2019-11-13 09:19 sys/class/rtc_am1805/timer

例如feeddog设置disabled feeddog之后,然后重新使能kernel feeddog在time(10s)之后系统重启可以这样验证:

rk3399_all:/ # echo 0 > sys/class/rtc_am1805/feeddog //disabled feeddog
rk3399_all:/ # echo 10000 > sys/class/rtc_am1805/timer //设置feeddog = 10s,除非在10s到达之前重新执行这句指令,否则会重启
rk3399_all:/ # cat sys/class/rtc_am1805/timer                                
10000

你可能感兴趣的:(RK系列驱动开发)