linux rtc驅動分析和測試

2021-10-21 04:50:08 字數 3339 閱讀 7021

rtc(real time clock) ,實時時鐘。在linux核心中即為外部時鐘源,由32.768khz晶振產生;內部時鐘源是系晶元自帶24mhz時鐘分頻而來。

rtc優點如下:

1)消耗功率低(需要輔助電源,一般是鈕扣電池)

2)讓主系統處理更需時效性的工作

3)有時會比其他方式的輸出要更準確

linux**路徑:drivers/rtc,如下圖所示

可以看到主要rtc晶元:pcf系列、rx系列和ds系列,這些都需要外掛程式到i2c匯流排下,也就是說會用到i2c的介面。有些rtc晶元沒有掛在i2c匯流排下,直接封裝到內部ic裡,可以直接讀寫對應的暫存器進行操作,具體看硬體電路設計。

下圖是乙個rtc基本框架圖,網上也有類似的圖

主要還是看這幾個結構體 rtc_time 、rtc_wkalrm、rtc_device、rtc_class_ops

標頭檔案路徑:include/uapi/linux/rtc.h  include/linux/rtc.h

rtc_time,最基本的結構體,呼叫時間都要用到

struct rtc_time ;
鬧鐘結構體,就是enabled、加上pending還有時間。

struct rtc_wkalrm ;
rtc_class_ops,裡面都是是樁函式,也叫鉤子函式,具體的驅動需要實現對應的讀寫介面。

struct rtc_class_ops ;
rtc_device,具體rtc驅動用到

struct rtc_device ;
主要看對應的probe函式,以rtc-s3c.c為例。

具體註冊流程看devm_rtc_device_register裡面的rtc_device_register實現。主要流程如下圖

先看核心列印驅動開起來了沒有

dmesg | grep -i rtc
date   顯示當前時間

設定當前時間,時間格式形如***x-xx-xx xx:xx:xx

date -s "2021-1-1 10:10:10" 

root@zzz-virtualbox:/# date -s "2021-1-1 10:10:10"

2023年 01月 01日 星期五 10:10:10 cst

同步系統時間到rtc時間

hwclock -w
設定鬧鐘,例如當前rtc時間的20s後

echo +20 /sys/class/rtc/rtc0/wakealarm
檢視對應的proc介面

由於是虛擬機器,空有這些介面,根本沒有所謂irq和pending。

乙個簡單的用例如下rtc_test.c

#include #include #include #include #include #include #include #include #include #include struct rtc_time test_time = , , ,

, , ,

, , ,

, , ,

, ,, , ,

, , ,

, , ,

, , ,

, ,

, , ,

, ,

, , ,

, ,

, , ,

};struct rtc_time rtc_tm =;

struct rtc_wkalrm alrm = ;

void print_time(struct rtc_time *tm)

void print_alarm(struct rtc_wkalrm *alrm)

void transfer_time(struct rtc_time *tm)

int read_rtc_time_test(struct rtc_time *tm)

ret = ioctl(fd, rtc_rd_time, tm);

close(fd);

return ret;

}int set_rtc_time_test(struct rtc_time *tm)

ret = ioctl(fd, rtc_set_time, tm);

close(fd);

return ret;

}int main(void)

printf("\n");

}printf("-----end-----\n");

}

使用makefile進行編譯,如下所示

cc = gcc  

cflags = -wall -o -g

rtc_test: rtc_test.o

$(cc) -o rtc_test rtc_test.o

rtc_test.o : rtc_test.c

$(cc) $(cflags) rtc_test.c

clean:

rm -rf rtc_test rtc_test.o

cc這裡去要根據對應的驅動編譯工具鏈去指定,由於本地環境已經裝了gcc,在系統環境中,所以直接用gcc即可。

編譯報錯沒有 對應的檔案,需要構建對應的核心編譯工具鏈。

tips:

1. rtc是硬體時鐘,linux核心中rtc是utc時間,系統時間是cst時間(北京時),原因是已經做了時區轉換,cst = utc + 8

2. linux核心中會進行時間轉換,統一換成距epoch的絕對秒數。

linux時間子系統之(一):時間的基本概念

30.linux-rtc驅動分析及使用 - 諾謙 -

linux rtc裝置驅動_paomadi的專欄-csdn部落格

linux RTC驅動移植

rtc real time clock 實時時鐘,主要作用是給linux系統提供時間。rtc因為是電池供電的,所以掉電後時間不丟失。linux核心把rtc用作 離線 的時間與日期維護器。當linux核心啟動時,它從rtc中讀取時間與日期,作為基準值。在執行期間核心完全拋開rtc,以軟體的形式維護系統...

測試驅動開發和IOC

我們說測試驅動可以是xp的一部分,xp講究的是適當設計 很多時候被人理解為不設計或草設計 同樣要實現tdd也要進行設計,這個設計就要考慮到 的可測試性,這就是我們所說的利於測試的設計。mock物件的提出和mock工具的使用又為我們提供了隔離測試 模擬複雜物件的平台。有時我們的 會讓mock物件也無能...

測試驅動需求分析 需求文件評審例項

需求文件評審例項 軟體的開發文件質量一般只能通過評審來進行保證,如何有效發現文件中的問題,是乙個令許多人頭疼的問題。先看一段關於日誌檔案的需求描述如下 軟體要將所有的訪問者都要記錄下來,對每次訪問要記錄訪問開始時間 訪問結束時間 訪問者的 ip位址這三個資訊作為一條日誌記錄。要求以天為單位每天生成乙...