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...