看门狗的用途是当cpu进入到错误状态后,无法恢复的情况下,使系统重新启动。Linux内核已经支持s3c2416的看门狗驱动。
1. watchdog设备
watchdog设备包含了名字、独有的资源等等一些驱动程序的硬件或自定义信息。通过platform_add_devices(platform_device_register)函数将定义的平台设备注册到内核中,用于匹配设备驱动。
内核在drivers\watchdog\s3c2410_wdt.c中实现了s3c2416 watchdog驱动, watchdog设备的平台代码如下。
static struct resources3c_wdt_resource[] = {
[0]= DEFINE_RES_MEM(S3C_PA_WDT, SZ_1K),
[1]= DEFINE_RES_IRQ(IRQ_WDT),
};
struct platform_device s3c_device_wdt ={
.name = "s3c2410-wdt",
.id = -1,
.num_resources = ARRAY_SIZE(s3c_wdt_resource),
.resource = s3c_wdt_resource,
};
在static struct platform_device *home2416_devices[]板级平台设备列表中加入&s3c_device_wdt,使watchdog设备能够注册到内核中。
修改驱动文件s3c2410_wdt.c,使系统启动后使能看门狗,复位时间30秒。
#define CONFIG_S3C2410_WATCHDOG_ATBOOT (1)
#defineCONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (30)
2. 内核配置
Linux配置支持watchdog设备驱动,选中DeviceDrivers->Watchdog Timer Support-> S3C2410 Watchdog。
3. 应用编程
cat/proc/devices可以知道watchdog的主设备号为252,次设备号为0,在/dev目录中创建watchdog设备文件。
mknod /dev/watchdog c 252 0
应用程序可以通过设备文件访问watchdog,watchdog应用测试代码watchdog_test.c 如下:
#include "fcntl.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/watchdog.h>
int main(void)
{
intfd;
fd= open("/dev/watchdog", O_RDONLY);
if(fd == -1) {
printf("Openwatchdog failed\n");
exit(1);
}
while(1) {
ioctl(fd,WDIOC_KEEPALIVE);
sleep(7);
}
close(fd);
return0;
}
用arm-linux-gcc静态编译,使之生成arm cpu可执行的指令,并且可脱离任何库独立运行,arm-linux-gcc -static -o watchdog_test watchdog_test.c,生成watchdog_test可执行文件。复制可执行文件到根文件系统,启动后,执行./watchdog_test进行喂狗,可以杀死喂狗进程,确定看门狗可以重启系统。