arm linux clock implement

隨性寫的,不夠完整,暫時先記着,還有一些沒搞清楚呢!~

 

近日在做新版內核的移植工作,將原來的BSP弄進最新內核2.6.31-rc7中(已經又出新的了)。

 

在改寫系統定時器(sys_timer)部分時,發現總缺少什麼東西,我也不知道少什麼,老大的提議+參考大牛的代碼,發現這個BSP竟然沒有clock管理的代碼,不過也對,他們是本着能跑的理念來完成這個BSP,沒有用到的就省略了,也不能怪他們。那我們就得自己實現咯!硬件、時鐘對我來說還是比較吃力的,原理至今還不太清楚,參看了幾塊板子的內核代碼和datasheet,發現時鐘這些,起碼在名字上是基本同一的,原來我還以爲每個板子自己瞎定的。

 

時鐘管理,主要的功能是使能某個時鐘,因爲一個時鐘源通過PLL出來的頻率,再加上divisor處理,就能達到可編程的時鐘頻率,每個硬件模塊都可以有自己的頻率,每個硬件模塊都可以單獨開關時鐘。所以需要管理,因爲多嘛!

 

我們的板子主要涉及到的時鐘有:

PLL:時鐘源出來時鍾,這裏可以理解爲xtal時鐘源;

    PLL_CPU:爲其他硬件模塊提供時鐘的時候;

        PLL_USB:爲USB HOST 控制器時鐘

        FCLK: CPU 時鐘(ARM926)

        HCLK: AHB總線上的硬件模塊時鐘

        PCLK: PHB總線上的硬件模塊時鐘

           RTC:實時時鐘

           WDT:看門狗時鐘

           TIMER:定時器時鐘

因爲TIMER的時鐘源是可以選擇的,1KHZ或者PCLK,如果選擇PCLK,那就得從上面的層級結構中算出PCLK頻率爲定時器所用,時鐘管理看似可有可無,不過爲了擴展,有還是比沒有好。

 

下面就是實現了,發現clk在arm linux下,主要有2類,一類如  mach-s3c24xx之類的,自己管理clock,一類如 mach-epxxx使用common/clock.c 的代碼,通過內核來管理clock,這個common對代碼 是 Russell 寫的,也是新提倡的方式,那我當然得用,直接把mach-epxxx/clock.c 和頭文件copy過來,根據需要加以修改,ops都不需要,提供3個API就是了: enable / disable / get_rate,因爲我們這塊板子時鐘操作比較簡單,這已經夠用了,就這樣實現啦!~呵呵,沒啥東西,對了,還需要在mach-xxx/include/mach/下加個 clkdev.h,複製其他人的就好了,爲什麼需要,看代碼就知道了。

 

也就是說,在arm linux 下實現 clock 管理很簡單,3個文件:

mach-xxx/clock.c

mach-xxx/clock.h

mach-xxx/include/mach/clkdev.c

需要的其他文件就是,註冊一些時鐘,做做工作,配置配置,需要用的時候,clk_get()就能得到,然後操作,相當簡單。我們現在就是這樣做的。

       

發佈了43 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章