sbsa watchdog的驅動分析

2021-08-01 15:07:39 字數 3238 閱讀 6897

sbsa watchdog的全稱是sbsa(server base system architecture) generic watchdog driver。也就是sbsa是server base system architecture的縮寫

這份code的路徑在drivers/watchdog/sbsa_gwdt.c 中

arm sbsa generic watchdog的timeout 分為兩個階段,也就是會傳送兩次signal,第一次的signal叫做ws0,這會產生乙個中斷,在中斷中會呼叫panic函式,第二次才是真正的硬體reset訊號.在sbsa_gwdt.c 中是否要產生兩次訊號是有action這個變數決定的.如果只aciton等於0的話,當watchdog time到期後,先忽略ws0,然後被ws1 reset。如果是兩次的話,第一次到期後ws0先產生乙個中斷,第二次到期後ws1就直接reset系統了

* sbsa gwdt:

* if action is 1 (the two stages mode):

* |--------wor-------ws0--------wor-------ws1

* |----timeout-----(panic)----timeout-----reset

** if action is 0 (the single stage mode):

* |------wor-----ws0(ignored)-----wor------ws1

* |--------------timeout-------------------reset

下來看看原始碼中是怎麼做的.

static const struct platform_device_id sbsa_gwdt_pdev_match = ,

{},};

module_device_table(platform, sbsa_gwdt_pdev_match);

static struct platform_driver sbsa_gwdt_driver = ,

.probe = sbsa_gwdt_probe,

.remove = sbsa_gwdt_remove,

.shutdown = sbsa_gwdt_shutdown,

.id_table = sbsa_gwdt_pdev_match,

};module_platform_driver(sbsa_gwdt_driver);

這裡通過module_platform_driver 註冊platform driver,由於gtdt中已經註冊了platform device了,因此這裡會呼叫sbsa_gwdt_probe

static int sbsa_gwdt_probe(struct platform_device *pdev)

if (status & sbsa_gwdt_wcs_en)

set_bit(wdog_hw_running, &wdd->status);

//判斷是用single stage mode還是two stages mode

if (action) else

}if (!action)

dev_warn(dev, "falling back to single stage mode.\n");}/*

* in the single stage mode, the first signal (ws0) is ignored,

* the timeout is (wor * 2), so the maximum timeout should be doubled.

*///如果是single stage mode。則watchdog timeout是two stages mode的兩倍

if (!action)

wdd->max_hw_heartbeat_ms *= 2;

//計算到期時間

watchdog_init_timeout(wdd, timeout, dev);

/** update timeout to wor.

* because of the explicit watchdog refresh mechanism,

* it's also a ping, if watchdog is enabled.

*///設定到期時間

sbsa_gwdt_set_timeout(wdd, wdd->timeout);

//向watchdog framework 註冊字元裝置,這樣就可以在user space通過ioctl和sys控制watchdog

ret = watchdog_register_device(wdd);

if (ret)

return ret;

dev_info(dev, "initialized with %ds timeout @ %u hz, action=%d.%s\n",

wdd->timeout, gwdt->clk, action,

status & sbsa_gwdt_wcs_en ? " [enabled]" : "");

return 0;

}int watchdog_init_timeout(struct watchdog_device *wdd,

unsigned int timeout_parm, struct device *dev)

if (timeout_parm)

ret = -einval;

/* try to get the timeout_sec property */

if (dev == null || dev->of_node == null)

return ret;

of_property_read_u32(dev->of_node, "timeout-sec", &t);

if (!watchdog_timeout_invalid(wdd, t) && t)

wdd->timeout = t;

else

ret = -einval;

return ret;

}watchdog_init_timeout 首先從模組引數中得到到期時間,如果沒有的話,試圖通過從dts中的timeout-sec得到到期時間.

最後檢查這個時間是有效的後,就賦值給wdd->timeout = t

static int sbsa_gwdt_set_timeout(struct watchdog_device *wdd,

unsigned int timeout)

sbsa_gwdt_set_timeout 就直接通過writel寫cf暫存器

資料驅動 模型驅動 模型驅動的雲安全

存檔日期 2019年5月15日 首次發布 2011年2月8日 手動將安全策略轉換為技術實施非常困難,昂貴且容易出錯,尤其是在應用程式層實施時。為了在時間和金錢上的投資方面實現更多的成本節省,雲安全工具需要變得更加自動化。還需要這些工具的自動化,以使雲安全管理成為一項更輕鬆的任務,使雲管理員可以專注於...

驅動及驅動程式的作用

驅動程式 驅動程式是硬體廠商根據作業系統編寫的配置檔案,是新增到作業系統中的一小塊 其中包含有關硬體裝置的資訊。當你安裝新硬體時,驅動程式是一項不可或缺的元件。可以說沒有驅動程式,計算機中的硬體就無法工作。有了驅動程式中的這些資訊,計算機就可以與裝置進行通訊。作業系統不同,硬體的驅動程式也不同,各個...

屬性驅動與模型驅動的比較

a 屬性驅動靈活 準確 模型驅動不靈活,因為很多時候,頁面所提交過來的引數並不屬於模型中的屬性.也就是說頁面所提交過來的引數,與模型中的屬性 並不一致,這是很常見的情況。b 模型驅動更加符合物件導向的程式設計風格,使得我們獲得的是物件而不是乙個個離散的值。c 使用模型驅動時action方法需要實現m...