clock驅(qū)動(dòng)實(shí)例
clock驅(qū)動(dòng)在時(shí)鐘子系統(tǒng)中屬于provider,provider是時(shí)鐘的提供者,即具體的clock驅(qū)動(dòng)。
clock驅(qū)動(dòng)在Linux剛啟動(dòng)的時(shí)候就要完成,比initcall
都要早期,因此clock驅(qū)動(dòng)是在內(nèi)核中進(jìn)行實(shí)現(xiàn)。 在內(nèi)核的drivers/clk
目錄下,可以看到各個(gè)芯片廠商對(duì)各自芯片clock驅(qū)動(dòng)的實(shí)現(xiàn):
下面以一個(gè)簡(jiǎn)單的時(shí)鐘樹(shù),舉例說(shuō)明一個(gè)芯片的時(shí)鐘驅(qū)動(dòng)的大致實(shí)現(xiàn)過(guò)程:
1、時(shí)鐘樹(shù)
通常來(lái)說(shuō),一個(gè)芯片的時(shí)鐘樹(shù)是比較固定的,例如,以下時(shí)鐘樹(shù):
時(shí)鐘樹(shù)的 根節(jié)點(diǎn)一般是晶振時(shí)鐘 ,上圖根節(jié)點(diǎn)為24M晶振時(shí)鐘。根節(jié)點(diǎn)下面是PLL,PLL用于提升頻率。PPL0下又分頻給PERI、DSP和ISP。PLL1分頻給DDR和ENC。
對(duì)于PLL來(lái)說(shuō),PLL的頻率可以通過(guò)寄存器設(shè)置,但通常是固定的,所以PLL屬于 固定時(shí)鐘 。
對(duì)PERI、DSP等模塊來(lái)說(shuō),它們的頻率來(lái)自于PLL的分頻,因此這些模塊的時(shí)鐘屬于 分頻時(shí)鐘 。
2、設(shè)備樹(shù)
設(shè)備樹(shù)中表示一個(gè)時(shí)鐘源,應(yīng)有如下屬性,例如24M晶振時(shí)鐘:
clocks{
osc24M:osc24M{
compatible = "fixed-clock";
#clock-cells = < 0 >;
clock-output-name = "osc24M";
clock-frequency = < 24000000 >;
};
};
屬性 | 說(shuō)明 |
---|---|
compatible | 驅(qū)動(dòng)匹配名字 |
#clock-cells | 提供輸出時(shí)鐘的路數(shù)。#clock-cells為0時(shí),代表輸出一路時(shí)鐘#clock-cells為1時(shí),代表輸出2路時(shí)鐘。 |
#clock-output-names | 輸出時(shí)鐘的名字 |
#clock-frequency | 輸出時(shí)鐘的頻率 |
3、驅(qū)動(dòng)實(shí)現(xiàn)
clock驅(qū)動(dòng)編寫的基本步驟:
- 實(shí)現(xiàn)
struct clk_ops
相關(guān)成員函數(shù) - 定義分配
struct clk_onecell_data
結(jié)構(gòu)體,初始化相關(guān)數(shù)據(jù) - 定義分配
struct clk_init_data
結(jié)構(gòu)體,初始化相關(guān)數(shù)據(jù) - 調(diào)用
clk_register
將時(shí)鐘注冊(cè)進(jìn)框架 - 調(diào)用
clk_register_clkdev
注冊(cè)時(shí)鐘設(shè)備 - 調(diào)用
of_clk_add_provider
,將clk provider存放到of_clk_provider鏈表中管理 - 調(diào)用
CLK_OF_DECLARE
聲明驅(qū)動(dòng)
-
驅(qū)動(dòng)
+關(guān)注
關(guān)注
12文章
1844瀏覽量
85367 -
Linux
+關(guān)注
關(guān)注
87文章
11322瀏覽量
209861 -
Clocks
+關(guān)注
關(guān)注
0文章
5瀏覽量
9640 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1017瀏覽量
21376
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論