1.看门狗驱动的移植
《如果不移植看门狗驱动,则开发板根文件系统过15秒会后重启》
1) 启动watchdog功能。编辑drivers/watchdog/s3c2410_wdt.c文件且修改#define CONFIG_S3C2410_WATCHDOG_ATBOOT (1),系统默认为0。watchdog默认超时时间也可以设定,内核默认为15秒;设定为30秒,如下所示:
49 #define CONFIG_S3C2410_WATCHDOG_ATBOOT (1)
50 #define CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME (30)
2) 内核配置中添加对watchdog的支持Device Drivers->Watchdog Timer Support->S3C2410 Watchdog;
Device Drivers->
[*]Watchdog Timer Support->
[*]S3C2410 Watchdog
make zImage;生成内核镜像文件zImage.bin
3)编写用户态喂狗程序,否则开发板会在启动30秒后自动重启。喂狗程序核心就是通过ioctl系统调用向内核写入WDIOC_KEEPALIVE命令来保持watchdog有效,代码如下所示:
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<linux/watchdog.h>
int main(int argc,char **argv)
{
int fd=0;
int n=0;
fd=open("/dev/watchdog",O_RDONLY);
if(fd<0){
perror("/dev/watchdog");
return -1;
}
for(;;){
ioctl(fd,WDIOC_KEEPALIVE); //一直喂狗,不让开发板重启
sleep(3);
}
close(fd);
return 0;
}
对应的Makefile文件如下所示:
CROSS = arm-linux-
all: lwj_wdg
lwj_wdg: lwj_wdg.c
$(CROSS)gcc -o lwj_wdg lwj_wdg.c
$(CROSS)strip lwj_wdg
clean:
@rm -vf lwj_wdg *.o *~
4)在文件系统里实现喂狗操作
编译出应用程序后,把它复制到文件系统的“/sbin/”目录下(权限必须为可执行),然后修改“/etc/init.d/rcS”文件,添加一行:lwj_wdg&
重新制作根文件系统,并把内核镜像和根文件系统烧到开发板中