詳解linux 看門狗驅(qū)動(dòng)編寫
看門狗是linux驅(qū)動(dòng)的一個(gè)重要環(huán)節(jié)。某些特殊的設(shè)備,有時(shí)候需要放在一些環(huán)境惡劣的地方,比如電信設(shè)備。但是,任何軟件都不可能100%沒有bug。如何保證軟件在遇到嚴(yán)重bug、死機(jī)的時(shí)候也能正常運(yùn)行呢,那么看門狗就是有效的一種方法??撮T狗一般要求用戶定時(shí)喂狗,如果一段時(shí)間沒有喂狗的話,那么系統(tǒng)就會(huì)自動(dòng)重啟。今天,我們就來看看這個(gè)看門狗驅(qū)動(dòng)怎么編寫?
1、代碼目錄
drivers/watchdog
2、閱讀目錄下的Kconfig,可以找一個(gè)s3c模塊macro
config HAVE_S3C2410_WATCHDOG bool help This will include watchdog timer support for Samsung SoCs. If you want to include watchdog support for any machine, kindly select this in the respective mach-XXXX/Kconfig file. config S3C2410_WATCHDOG tristate "S3C2410 Watchdog" depends on HAVE_S3C2410_WATCHDOG || COMPILE_TEST select WATCHDOG_CORE select MFD_SYSCON if ARCH_EXYNOS help Watchdog timer block in the Samsung SoCs. This will reboot the system when the timer expires with the watchdog enabled. The driver is limited by the speed of the system's PCLK signal, so with reasonably fast systems (PCLK around 50-66MHz) then watchdog intervals of over approximately 20seconds are unavailable. The driver can be built as a module by choosing M, and will be called s3c2410_wdt
3、S3C2410_WATCHDOG主要依賴WATCHDOG_CORE,可以繼續(xù)跟蹤Makefile
obj-$(CONFIG_S3C2410_WATCHDOG) += s3c2410_wdt.o
4、macro只依賴一個(gè)s3c2410_wdt.c文件,繼續(xù)查看
static SIMPLE_DEV_PM_OPS(s3c2410wdt_pm_ops, s3c2410wdt_suspend, s3c2410wdt_resume); static struct platform_driver s3c2410wdt_driver = { .probe = s3c2410wdt_probe, .remove = s3c2410wdt_remove, .shutdown = s3c2410wdt_shutdown, .id_table = s3c2410_wdt_ids, .driver = { .name = "s3c2410-wdt", .pm = &s3c2410wdt_pm_ops, .of_match_table = of_match_ptr(s3c2410_wdt_match), }, }; module_platform_driver(s3c2410wdt_driver);
5、確認(rèn)driver為platform類型,繼續(xù)在probe函數(shù)中查找有用的code
ret = watchdog_register_device(&wdt->wdt_device); if (ret) { dev_err(dev, "cannot register watchdog (%d)\n", ret); goto err_cpufreq; }
6、網(wǎng)上繼續(xù)查找,尋找到和watchdog有關(guān)的數(shù)據(jù)結(jié)構(gòu)
static const struct watchdog_info s3c2410_wdt_ident = { .options = OPTIONS, .firmware_version = 0, .identity = "S3C2410 Watchdog", }; static const struct watchdog_ops s3c2410wdt_ops = { .owner = THIS_MODULE, .start = s3c2410wdt_start, .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, };
7、找到設(shè)備注冊函數(shù)、函數(shù)結(jié)構(gòu)基本就算結(jié)束了,當(dāng)然有中斷的話,也可以確認(rèn)一下
ret = devm_request_irq(dev, wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev); if (ret != 0) { dev_err(dev, "failed to install irq (%d)\n", ret); goto err_cpufreq; }
8、有興趣的話,可以找一個(gè)函數(shù)閱讀一下。比如下面這個(gè)重啟函數(shù),可以和spec對比者來看
static int s3c2410wdt_restart(struct watchdog_device *wdd, unsigned long action, void *data) { struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd); void __iomem *wdt_base = wdt->reg_base; /* disable watchdog, to be safe */ writel(0, wdt_base + S3C2410_WTCON); /* put initial values into count and data */ writel(0x80, wdt_base + S3C2410_WTCNT); writel(0x80, wdt_base + S3C2410_WTDAT); /* set the watchdog to go and reset... */ writel(S3C2410_WTCON_ENABLE | S3C2410_WTCON_DIV16 | S3C2410_WTCON_RSTEN | S3C2410_WTCON_PRESCALE(0x20), wdt_base + S3C2410_WTCON); /* wait for reset to assert... */ mdelay(500); return 0; }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Supervisor安裝與配置(Linux/Unix進(jìn)程管理工具)
這篇文章主要介紹了詳解Supervisor安裝與配置(Linux/Unix進(jìn)程管理工具),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-0621個(gè)常用的apache .htaccess文件配置技巧分享
這篇文章主要介紹了21個(gè)常用的apache .htaccess文件配置技巧分享,涵蓋了網(wǎng)站中最常用的一些功能需求解決辦法,需要的朋友可以參考下2014-07-07Ubuntu系統(tǒng)日志配置 /var/log/messages的方法
今天小編就為大家分享一篇Ubuntu系統(tǒng)日志配置 /var/log/messages的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07linux中定時(shí)任務(wù)crond命令使用方法
這篇文章主要為大家詳細(xì)介紹了linux中定時(shí)任務(wù)crond命令的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02linux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號(hào)和編譯時(shí)間詳解
下面小編就為大家?guī)硪黄猯inux 程序、動(dòng)態(tài)庫、靜態(tài)庫內(nèi)部添加版本號(hào)和編譯時(shí)間詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12