【嵌入式Linux驅動開發】二十三、Linux RTC 驅動

  待機而舉是良謀,成竹在胸方可求。
  默默無聞積實力,時成奮起定春秋。
  夕楚莊王初登位,三載不發號令休。
  不鳴則已鳴即震,一舉伐齊勝徐州。


一、Linux 內核 RTC 驅動簡介

  STM32 內部有一個 RTC 外設模塊,這個模塊需要一個32.768KHz 的晶振,對這個 RTC 模塊進行初始化就可以得到一個實時時鐘。 I.MX6U 內部也有個 RTC 模塊,但是不叫作“ RTC”,而是叫做“ SNVS”。SNVS 直譯過來就是安全的非易性存儲, SNVS 裏面主要是一些低功耗的外設,包括一個安全的實時計數器(RTC)、一個單調計數器(monotonic counter)和一些通用的寄存器。

   首先需要說明的是,I.MX6U 的 RTC 驅動我們不用自己編寫,因爲 NXP 已經寫好了。其實對於大多數的 SOC 來講,內部 RTC 驅動都不需要我們去編寫,半導體廠商會編寫好。我們先學會怎麼使用,再來探究具體原理!

  Linux 內核將 RTC 設備抽象爲 rtc_device 結構體,因此 RTC 設備驅動就是申請並初始化rtc_device,最後將 rtc_device 註冊到 Linux 內核裏面,這樣 Linux 內核就有一個 RTC 設備的。 Linux 內核中 RTC 驅動調用流程如下圖所示:

在這裏插入圖片描述

  當 rtc_class_ops 準備好以後需要將其註冊 到 Linux 內核中,這裏我們可以使 用rtc_device_register函數完成註冊工作。此函數會申請一個 rtc_device並且初始化這個 rtc_device,最後向調用者返回這個 rtc_device,此函數原型如下:

//name:設備名字。
//dev: 設備。
//ops: RTC 底層驅動函數集。
//owner:驅動模塊擁有者。
//返回值: 註冊成功的話就返回 rtc_device,錯誤的話會返回一個負值。
struct rtc_device *rtc_device_register(const char *name,
									struct device *dev,
									const struct rtc_class_ops *ops,
									struct module *owner)

  當卸載 RTC 驅動的時候需要調用 rtc_device_unregister 函數來註銷註冊的 rtc_device,函數原型如下:

//rtc:要刪除的 rtc_device。
void rtc_device_unregister(struct rtc_device *rtc)

  還有另外一對 rtc_device 註冊函數 devm_rtc_device_register 和devm_rtc_device_unregister,分別爲註冊和註銷 rtc_device。

二、RTC 時間查看與設置

2.1、查看RTC時間

  RTC 是用來計時的,因此最基本的就是查看時間, Linux 內核啓動的時候可以看到系統時鐘設置信息,如下圖所示,可以看出, Linux 內核在啓動的時候將 snvs_rtc 設置爲 rtc0。

在這裏插入圖片描述
  如果要查看時間的話輸入“ date”命令即可,如下圖所示,可以看出,當前時間爲 1970 年 1 月 1 日00:30:11,很明顯是時間不對,我們需要重新設置 RTC 時間。

在這裏插入圖片描述

2.2、設置RTC時間

   時間設置也是使用的 date 命令,輸入“ date --help”命令即可查看 date 命令如何設置系統時間,結果如下圖所示:

在這裏插入圖片描述
  設置當前時間爲2020年04月09日 12:00:00 ,因此輸入如下命令:

date -s "2020-04-09 12:00:00"

  設置完成以後再次使用 date 命令查看一下當前時間就會發現時間改過來了,如下圖所示:

在這裏插入圖片描述

  注意我們使用“ date -s”命令僅僅是將當前系統時間設置了,此時間還沒有寫入到I.MX6U 內部 RTC 裏面或其他的 RTC 芯片裏面,因此係統重啓以後時間又會丟失。我們需要將當前的時間寫入到 RTC 裏面,這裏要用到 hwclock 命令,輸入如下命令將系統時間寫入到 RTC裏面:

hwclock -w //將當前系統時間寫入到 RTC 裏面
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章