linux常見的驅動在driver目錄下都有乙個資料夾,進入kernel主目錄下的drivers/rtc,發現下面包含了許多晶元的rtc驅動,我們這裡是以pcf8563為主,她是我們要分析的核心。其他幾個相關聯的檔案分別是:alarm.c、alarm-dev.c、class.c、hctosys.c、inte***ce.c和rtc-dev.c。
class.c:向linux裝置模型核心註冊了乙個類rtc,提供了rtc子系統的一些公共函式,讓各個rtc驅動註冊整合到我們的linux核心中,向驅動程式提供了註冊/登出介面。
rtc-dev.c:定義了基本的裝置檔案操作函式,使用者程式與rtc驅動的介面函式,這裡定義了每個ioctl命令需要呼叫的函式,還有open,read等。
inte***ce.c:提供了ioctl各個命令需要呼叫的函式。
rtc-sysfs.c:與sysfs有關,提供通過sys檔案系統操作pcf8563。
rtc-proc.c:與proc檔案系統有關,提供通過proc檔案系統操作pcf8563。
hctosys.c:系統起來之後會呼叫到這個檔案中的rtc_hctosys()函式,主要功能是系統起來的時候去讀rtc硬體中的時間,然後更新我們的系統時間。
rtc.h:定義了與rtc有關的資料結構。
pcf8563.c是最底層的直接和硬體打交道的驅動檔案,pcf8563.c上面一層為inte***ce.c,為介面檔案,它主要是對pcf8563.c進行封裝,給上層提供統一的介面,遮蔽底層差異化。inte***ce.c再往上就到了rtc-dev.c.,rtc-dev.c最終生成了/dev/rtc裝置節點,上層的應用程式就是通過操作此檔案來進行rtc相關的設定系統時間和鬧鐘等操作的。
檔案關係圖如下:
(1)處理乙個idr結構,idr在linux核心中指的就是整數id管理機制,從本質上來說,idr是一種將整數id號和特定指標關聯在一起的機制。這個機制最早是在2023年2月加入核心的,當時是作為posix定時器的乙個補丁。現在在核心的很多地方都可以找到idr的身影。這裡從核心中獲取乙個idr結構,並與id相關聯。
(2)分配了乙個rtc_device的結構–rtc,並且初始化了相關的成員:id, rtc_class_ops等等。
(3)首先呼叫rtc_dev_prepare(在rtc-dev.c中定義)。因為rtc裝置本質來講還是字元裝置,所以這裡初始化了字元裝置相關的結構:裝置號以及檔案操作。然後呼叫device_register將裝置註冊到linux裝置模型核心。這樣在模組載入的時候,udev daemon就會自動為我們建立裝置檔案rtc(n)。
(4)先後呼叫rtc_dev_add_device,rtc_sysfs_add_device,rtc_proc_add_device三個函式。 rtc_dev_add_device註冊字元裝置,rtc_sysfs_add_device只是為裝置新增了乙個鬧鐘屬性,rtc_proc_add_device 建立proc檔案系統介面。
rtc_init 首先呼叫class_create建立了乙個類–rtc。我們知道類是乙個裝置的高層檢視,他抽象出了底層的實現細節。類的作用就是向使用者空間提供裝置 的資訊,驅動程式不需要直接處理類。然後初始化類結構的相應成員,rtc_suspend,rtc_resume這兩個函式也是在class.c中實現 的。接下來呼叫rtc_dev_init(),這個函式為rtc裝置動態分配裝置號,儲存在rtc_devt中。最後呼叫 rtc_sysfs_init,初始化rtc_class的性。
cat/proc/devices 發現rtc已經註冊到核心中,列印如下資訊 :254 rtc
通過 dmesg |grep rtc,(列印一下rtc驅動載入相關資訊.)列印如下資訊
[ 4.234402] rtc-ds1307: probe of 2-0068 failed with error -5
[ 4.508771] drivers/rtc/hcto open rtc device (rtc0)
打**給飛凌開發板廠家,rtc晶元由ds1337更換為***x,提供了補丁檔案。
手動打上補丁,核心中將ds1307的驅動去掉,編譯後上電 rtc-rx8010 2-0032: setting system clock to 2016-07-07 18:05:14 utc (1467914714)。
說明rtc驅動正常載入,dev目錄下有了rtc0
date命令操作linux的系統(軟體)時鐘,hwclock命令操作硬體時鐘(rtc模組),我們要驗證rtc驅動是否工作正常,只需要hwclock,
將linux系統時間設定到硬體rtc中hwclock -w ,hwclock -s把rtc時間寫到linux系統時間裡面去
設定的格式,上面提示的很清楚了,mm是月份,dd是日期,hh是小時,mm是分鐘,年份可以寫2位的yy或者4位的yyyy,秒可以用.ss表示
tue nov 3 13:17:05 mst 2009
tue nov 3 13:18:33 2009 0.000000 seconds
RTC裝置驅動
從rtc裝置驅動看所有驅動的寫法 1,所有驅動第一步是註冊 驅動程式 2,註冊 裝置 3,系統在初始化時,會呼叫驅動程式的probe函式,完成基本硬體的初始化和裝置的註冊 rp4412rtc體系結構解釋 driver register先把個新話的東西寫完然後進行driver register 驅動開...
RTC驅動程式
rtc實時時鐘 遵循字元裝置驅動 2 s3c rtc init platform driver register s3c rtc probe rtc device register s3c pdev dev,s3c rtcops,this module rtc dev prepare cdev in...
rtc時鐘晶元驅動 Linux驅動
說明 rtc時鐘驅動將大部分通用部分在rtc dev.c檔案中實現.通用部分實現了file operations,並匯出了rtc class ops結構,rtc device register rtc device unregister函式,底層部分只要實現rtc class ops即可.變數 rt...