這裡我們針對三星的S3C24XX系列進行RTC驅動框架的分析,關於RTC(實時時鐘)的功能和硬件原理我就不在這裡啰嗦了,相信大家都十分清楚,不清楚的可以google或者百度一下,我想通過RTC驅動和大家探討一下linux驅動的一般框架,為大家在linux驅動的學習路上起到一個拋磚引玉的作用。那有哥們就要問了,為什麼選擇RTC驅動呢?就是因為它簡單明了,大家都容易明白的東西才是好東西,好啦,廢話不多說,開始進入正題:
Linux常見的驅動在driver目錄下都有一個文件夾,當然我們的RTC也不例外,我們進入kernel主目錄下的drivers/rtc,發現下面包含了許多開發平台的RTC驅動,我們這裡是以S3C24xx為主,所以我們要尋找的是“rtc-s3c.c”這個美人兒,她是我們要分析的核心;其他幾個相關聯的文件分別是:alarm.c, alarm-dev.c,class.c, hctosys.c, interface.c, rtc-dev.c.這幾個文件就是我們這部戲的主角兒。
看戲大家都喜歡去研究人物之間的關系,A喜歡B,B喜歡C,C又喜歡D…….這裡我們也來先理順一下這幾個主角之間微妙的關系:
首先,當然是我們主角中的戰斗機rtc-s3c.c,她是最頂層的直接和硬件打交道的驅動文件,每個平台,高通,marvell,三星都有自己的這部分,一般被命名為類似的”rtc-msm.c,rtc-pxa.c,rtc-s3c.c”;就像每個國家每個部落,總有一批底層工作者,在默默的為上層的驕奢淫逸,榮華富貴貢獻著自己的血汗;
rtc-s3c.c上面的是interface.c,顧名思義就知道是接口文件,它主要是對rtc-s3c.c進行封裝,給上層提供統一的接口,屏蔽底層差異化的東東。
Interface.c再往上就到了rtc-dev.c.,rtc-dev.c最終生成了/dev/rtc,上層的應用程序就是通過操作此文件來進行RTC的相關的設置系統時間,設置鬧鐘,等等。
所有整個人物關系圖如下:
上層應用層序
|
|
V
rtc-dev.c
|
|
V
interface.c
|
|
V
rtc-s3c.c
好像三個文件就已經把整個RTC從底層到上層所有的東東都講完了,那麼還剩下幾個文件干嘛呢?
Alarm.c和alarm-dev.c:這兩個文件用來干什麼呢?這裡先留個懸念,後面和大家慢慢說明
class.c:提供了RTC子系統一些的公共函數,讓各個RTC驅動注冊集成到我們的linux內核中,她實際上是一個粘合劑。
hctosys.c:系統起來之後,會調用到這個文件中的rtc_hctosys()函數,主要功能是系統起來的時候,去讀RTC硬件中的時間,然後更新我們的系統時間。
好啦,到這裡,相信我們已經對整個rtc驅動各個層都比較清楚了,小時候我語文老師叫我們寫作文的時候就喜歡玩“總分”結構,先“總”對整個過程有個大概把握,再“分”起來就容易多了,感覺一切都逃出不我們的“五指山”。
後面的幾個小節,開始我們的“分”,從細節去分析理解每個文件。