努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/06/03/6525504.aspx
由于计算机在工作时不可避免的要受到各种各样因素的干扰,即使再优秀的计算机程序也可能因为这种干扰使计算机进入一个死循环,更严重的就是导致死机。有两种方法来处理这种情况,一是采用人工复位的方法,而是依赖某种硬件来执行这个复位工作。这种硬件通常叫做看门狗。S3C2440A处理器内部集成了一个看门狗硬件,如下图:
看门狗有两个功能,即可作为一个正常的16位的内部寄存器来请求中断服务,也可产生128PCLK周期的复位信号。下面分析一下看门狗工作过程:首先处理器提供的PCLK经过8位预分频(这个值在WTCON[15:8]), 然后通过一个多路选择器,可以选择4种分频方式,16,32,64,128。看门狗通过WTCON[4:3]来选择哪种分频方式,这样可以产生一个时钟频率,每一个时钟周期WTCNT中的值就减1,直到为0。当为0时,如果WTCON[2]为1,则产生一个中断信号;如果WTCON[0]为1,则产生一个复位信号。看门狗的工作频率=PCLK/(WTCON[15:8]+1)/divider(divider=(16,32,64,128))。公式中WTCON[15:8]+1是因为WTCONT[15:8]的取值范围为0~255,因为除数不能为0,所以设计者规定需要加1。divider的值由WTCONT的第3,4位决定,可以取值16,32,64和128。
下面来分析Linux内核中看门狗的源码,其实我觉得看门狗相当简单了,因为一共就3个寄存器,来看一些全局变量,这些在一些函数中会用到:
nowayout表示决不允许看门狗关闭,为1表示不允许关闭,为0表示允许关闭;tmr_margin表示默认的看门狗喂狗时间为15s;tmr_atboot表示系统启动时就使能看门狗,为1表示使能,为0表示关闭;soft_noboot表示看门狗工作的方式,看门狗可以作为定时器使用也可作为复位硬件使用,soft_noboot为1表示看门狗作为定时器使用,不发送复位信号;debug表示是否使用调试模式来调试代码,该模式中,会打印调试信息。
WATCHDOG_NOWAYOUT的值由配置选项CONFIG_WATCHDOG_NOWAYOUT决定,其宏定义如下:
另外一个重要的枚举值close_state用来标识看门狗是否允许关闭,其定义如下:
CLOSE_STATE_NOT表示不允许关闭看门狗,CLOSE_STATE_ALLOW表示允许关闭看门狗。
S3C2410的看门狗同时具有多重身份:字符设备,混杂设备,平台设备。下面看一下看门狗驱动作为平台驱动的描述:
下面是看门狗驱动作为平台驱动的注册:
下面是看门狗平台设备及其资源:
当使用platform_bus_type的platform_match对s3c2410wdt_driver与s3c_device_wdt匹配成功时,调用s3c2410_wdt_probe函数,下面来看s3c2410_wdt_probe的实现:
下面看一下刚才调用的那个设置看门狗复位时间的方法:
平台驱动的移除函数:
平台驱动中的关闭函数:
平台驱动中的电源管理部分:
来看看看门狗驱动作为字符驱动的file_operations结构:
看门狗作为字符设备的打开函数:
下面看一下开启看门狗的函数:
关闭函数:
下边是关闭函数中调用的看门狗停止函数,可以看出实际关闭看门狗的操作是由__s3c2410wdt_stop函数完成的。
写函数:
io控制函数:
如果选择了看门狗作为内部定时器,则当计数值为0时调用中断处理函数,中断处理函数的主要功能就是喂狗:
喂狗函数:
总结一下:看门狗设备可以在系统启动的时候开启也可以在打开设备的时候启动,看门狗设备不是用来读取或者写入神马数据的,只可写入一个'V'用来允许关闭看门狗设备,打开看门狗设备后主要就是通过ioctl来发各种命令,进行获得门狗设备的信息,门狗设备的信息,门狗设备的信息,设置看门狗的超时时间,对看门狗进行喂狗等操作在内核和用户空间之间传递信息。