看门狗的用途是当cpu进入到错误状态后,无法恢复的情况下,使系统重新启动。Linux内核已经支持s3c2416的看门狗驱动。

1. watchdog设备

watchdog设备包含了名字、独有的资源等等一些驱动程序的硬件或自定义信息。通过platform_add_devices(platform_device_register)函数将定义的平台设备注册到内核中,用于匹配设备驱动。

内核在drivers\watchdog\s3c2410_wdt.c中实现了s3c2416 watchdog驱动, watchdog设备的平台代码如下。

  1. static struct resources3c_wdt_resource[] = {
  2. [0]= DEFINE_RES_MEM(S3C_PA_WDT, SZ_1K),
  3. [1]= DEFINE_RES_IRQ(IRQ_WDT),
  4. };
  5. struct platform_device s3c_device_wdt ={
  6. .name = "s3c2410-wdt",
  7. .id = -1,
  8. .num_resources = ARRAY_SIZE(s3c_wdt_resource),
  9. .resource = s3c_wdt_resource,
  10. };

在static struct platform_device *home2416_devices[]板级平台设备列表中加入&s3c_device_wdt,使watchdog设备能够注册到内核中。

修改驱动文件s3c2410_wdt.c,使系统启动后使能看门狗,复位时间30秒。

  1. #define CONFIG_S3C2410_WATCHDOG_ATBOOT (1)
  2. #defineCONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (30)

2. 内核配置

Linux配置支持watchdog设备驱动,选中DeviceDrivers->Watchdog Timer Support-> S3C2410 Watchdog。 11_看门狗驱动 - 图1

3. 应用编程

cat/proc/devices可以知道watchdog的主设备号为252,次设备号为0,在/dev目录中创建watchdog设备文件。

  1. mknod /dev/watchdog c 252 0

应用程序可以通过设备文件访问watchdog,watchdog应用测试代码watchdog_test.c 如下:

  1. #include "fcntl.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <sys/ioctl.h>
  5. #include <linux/watchdog.h>
  6. int main(void)
  7. {
  8. intfd;
  9. fd= open("/dev/watchdog", O_RDONLY);
  10. if(fd == -1) {
  11. printf("Openwatchdog failed\n");
  12. exit(1);
  13. }
  14. while(1) {
  15. ioctl(fd,WDIOC_KEEPALIVE);
  16. sleep(7);
  17. }
  18. close(fd);
  19. return0;
  20. }

用arm-linux-gcc静态编译,使之生成arm cpu可执行的指令,并且可脱离任何库独立运行,arm-linux-gcc -static -o watchdog_test watchdog_test.c,生成watchdog_test可执行文件。复制可执行文件到根文件系统,启动后,执行./watchdog_test进行喂狗,可以杀死喂狗进程,确定看门狗可以重启系统。