隨性寫的,不夠完整,暫時先記着,還有一些沒搞清楚呢!~
近日在做新版內核的移植工作,將原來的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()就能得到,然後操作,相當簡單。我們現在就是這樣做的。