watchdog驱动分为以下三层:
统一driver层 watchdog_dev.c;
核心层 watchdog_core.c;
具体的设备层。 eg: s3c2410_wdt.c
从上层到下层依次为:
给应用层提供open等接口
drivers\watchdog\watchdog_dev.c
static const struct file_operations watchdog_fops = {
.unlocked_ioctl = watchdog_ioctl, //ioctl获取具体wdd设备,从而获取具体设备的功能接口
.open = watchdog_open,
.release = watchdog_release,
};
||
||
drivers\watchdog\watchdog_core.c
||
||
底层驱动:操作具体的SOC寄存器
drivers\watchdog\s3c2410_wdt.c:
static const struct watchdog_ops s3c2410wdt_ops = {
.owner = THIS_MODULE,
.start = s3c2410wdt_start, //开启wdt
.stop = s3c2410wdt_stop,
.ping = s3c2410wdt_keepalive, //喂狗
.set_timeout = s3c2410wdt_set_heartbeat,//设置超时
.restart = s3c2410wdt_restart,
};
static const struct watchdog_device s3c2410_wdd = {
.info = &s3c2410_wdt_ident,
.ops = &s3c2410wdt_ops,
.timeout = S3C2410_WATCHDOG_DEFAULT_TIME,
};
static struct platform_driver s3c2410wdt_driver = {
.probe = s3c2410wdt_probe,
.remove = s3c2410wdt_remove,
};
static int s3c2410wdt_probe(struct platform_device *pdev)
{
wdt->wdt_device = s3c2410_wdd;
}
参考: