Linux设备驱动之watchdog设备驱动
作者:网络转载 发布时间:[ 2016/5/13 11:36:11 ] 推荐标签:操作系统 Linux
看门狗(watchdog )分硬件看门狗和软件看门狗。硬件看门狗是利用一个定时器 电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零 (俗称 “喂狗”),如果程序出现故障,不在定时周期内复位看门狗,使得看门狗定时器溢出产生复位信号 并重启系统。软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定 时器代替。
1 看门狗的三个寄存器
1.1 watchdog原理
S3C2410内部集成了watchdog,提供3 个寄存器对watchdog 进行操作,这3 个寄存器分别为WTCON (watchdog 控制寄存器)、WTDAT (watchdog 数据寄存器)和WTCNT(watchdog 记数寄存器) S3c2440的看门狗的原理框图如下:
可以看到,看门狗定时器的频率由PCLK提供,其预分频器大取值为255+1;另外,通过MUX,可以进一步降低频率。定时器采用递减模式,一旦到0,则可以触发看门狗中断以及RESET复位信号。 看门狗定时器的频率的计算公式如下:
t_watchdog = 1/[PCLK/(Prescaler value + 1)/Division_factor]
1.2 开启S3C2410 的看门狗
void enable watchdog ()
{
rWTCON = WTCON DIV64 | WTCON RSTEN;//64分频、开启复位信号
rWTDAT = 0x8000;//计数目标
rWTCON |= WTCON ENABLE;//开启看门狗
}
1.3 S3C2410 的看门狗 “喂狗”
void feed dog ()
{
rWTCNT=0x8000;
}
1.4 看门狗的使用例程
void main ()
{
init system ();
...
enable watchdog ();//启动看门狗
...
while (1)
{
...
feed dog (); //喂狗
}
}
2 watchdog中的数据结
有一类设备被称为 “平台设备”,通常 SoC 系统中集成的独立的外设单元都被当作平台设备处理
2.1 platform_device 结构体
struct platform device
{
const char * name;//设备名
u32 id;
struct device dev;
u32 num resources;//设备所使用各类资源数量
struct resource * resource;//资源
};
2.2 S3C2410 中的平台设备
struct platform device *s3c24xx uart devs[];
struct platform device s3c device usb; //USB 控制器
struct platform device s3c device lcd; //LCD 控制器
struct platform device s3c device wdt; //看门狗
2
struct platform device s3c device i2c; //I C 控制器
struct platform device s3c device iis; //IIS
struct platform device s3c device rtc; //实时钟
...
/*SMDK2410开发板使用的平台设备*/
static struct platform device *smdk2410 devices[] initdata =
{
&s3c device usb, //USB
&s3c device lcd, //LCD
&s3c device wdt, //看门狗
&s3c device i2c, //I C
&s3c device iis, //IIS
};
2.3 S3C2410 看门狗的platform_device 结构体
struct platform device s3c device wdt =
{
.name = "s3c2410-wdt", //设备名
.id = - 1, .
num resources = ARRAY SIZE (s3c wdt resource), //资源数量
.resource = s3c wdt resource, //看门狗所使用资源
};
2.4 int platform_add_devices()函数
int platform add devices(struct platform device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++)
{
ret = platform device register(devs[i]);/*注册平台设备*/
if (ret) /*注册失败*/
{
while (--i >= 0)
platform device unregister(devs[i]);/*注销已经注册的平台设备 */
break;
}
}
return ret;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11