在別的driver裏(比如 irig) ,如何操作RTC?

背景

最近客戶有一個基本的需求,要保證我們的網關設備系統時間和外置的基準時間源保持一致(對時功能)。其實功能實現起來很簡單,irig 基準源是按標準的 IRIG-B 的標準格式發送給出來的,我們用FPGA來接收這種標準的格式,然後進行譯碼,再給CPU一箇中斷,將時間數據發送給CPU,CPU 將時間更新到系統時間。

至於要不要將時間更新到RTC,也是經過一番討論的,因爲我們不能夠限定客戶的使用場景

1 網關一直始終接着 irig 設備

這時候我們認爲 irig 時間源 是最可信的,只要網關上連接着irig時間源,系統時間就會和irig保持嚴格一致,這時候寫不寫RTC都是無關緊要的。不過 irig 的中斷來的特別頻繁(s我們用的源 ms級別的),頻繁寫 rtc 是會浪費系統資源的,而且頻繁讀寫 rtc 也會影響到電池的電量的損耗,這時候我們一般不會寫 rtc 

2 網關接1次 irig 設備

有的客戶可能有100臺網關,都需要用到對時的功能,如果這個客戶財大氣粗的話,可以每個網關配一臺基準時鐘源,但是我們又能遇到幾個這樣財大氣粗的客戶呢?那很可能客戶只購買了一臺時鐘源,然後分別根100太網關對接一次,然後實現對時操作。

我們又不想頻繁的寫 rtc , 想來想去是隻有第一次中斷來的時候進行寫 rtc 了 。。。

 

言歸正傳哈。。

在 Linux 源碼裏,我們搜索 rtc_set_time 

我們發現  drivers/rtc/interface.c 中 包含了 rtc 提供給內核和別的驅動接口,在 drivers/rtc/systohc.c 中可以看到如何使用的

我們可以在 系統的config文件中看到 

CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
CONFIG_RTC_SYSTOHC_DEVICE="rtc0"

這樣怎麼使用,是不是就很清晰了,有時候內核源碼是我們最好的學習資料。。。