clock驅動實例
clock驅動在時鐘子系統中屬于provider,provider是時鐘的提供者,即具體的clock驅動。
clock驅動在Linux剛啟動的時候就要完成,比initcall
都要早期,因此clock驅動是在內核中進行實現。 在內核的drivers/clk
目錄下,可以看到各個芯片廠商對各自芯片clock驅動的實現:
下面以一個簡單的時鐘樹,舉例說明一個芯片的時鐘驅動的大致實現過程:
1、時鐘樹
通常來說,一個芯片的時鐘樹是比較固定的,例如,以下時鐘樹:
時鐘樹的 根節點一般是晶振時鐘 ,上圖根節點為24M晶振時鐘。根節點下面是PLL,PLL用于提升頻率。PPL0下又分頻給PERI、DSP和ISP。PLL1分頻給DDR和ENC。
對于PLL來說,PLL的頻率可以通過寄存器設置,但通常是固定的,所以PLL屬于 固定時鐘 。
對PERI、DSP等模塊來說,它們的頻率來自于PLL的分頻,因此這些模塊的時鐘屬于 分頻時鐘 。
2、設備樹
設備樹中表示一個時鐘源,應有如下屬性,例如24M晶振時鐘:
clocks{
osc24M:osc24M{
compatible = "fixed-clock";
#clock-cells = < 0 >;
clock-output-name = "osc24M";
clock-frequency = < 24000000 >;
};
};
屬性 | 說明 |
---|---|
compatible | 驅動匹配名字 |
#clock-cells | 提供輸出時鐘的路數。#clock-cells為0時,代表輸出一路時鐘#clock-cells為1時,代表輸出2路時鐘。 |
#clock-output-names | 輸出時鐘的名字 |
#clock-frequency | 輸出時鐘的頻率 |
3、驅動實現
clock驅動編寫的基本步驟:
- 實現
struct clk_ops
相關成員函數 - 定義分配
struct clk_onecell_data
結構體,初始化相關數據 - 定義分配
struct clk_init_data
結構體,初始化相關數據 - 調用
clk_register
將時鐘注冊進框架 - 調用
clk_register_clkdev
注冊時鐘設備 - 調用
of_clk_add_provider
,將clk provider存放到of_clk_provider鏈表中管理 - 調用
CLK_OF_DECLARE
聲明驅動
-
驅動
+關注
關注
12文章
1851瀏覽量
85643 -
Linux
+關注
關注
87文章
11345瀏覽量
210399 -
Clocks
+關注
關注
0文章
5瀏覽量
9642 -
系統
+關注
關注
1文章
1019瀏覽量
21430
發布評論請先 登錄
相關推薦
Linux clock子系統及驅動實例
![Linux <b class='flag-5'>clock</b><b class='flag-5'>子系統</b>及<b class='flag-5'>驅動</b><b class='flag-5'>實例</b>](https://file1.elecfans.com/web2/M00/88/EC/wKgZomR3AEiAHXG0AAOHp2Lqrws775.jpg)
SYSBIOS6中驅動clock的timer配置問題如何解決
電子系統設計實例
三個命令生成的報告中均可顯示Clock Skew的具體數值
![三個命令生成的報告<b class='flag-5'>中</b>均可顯示<b class='flag-5'>Clock</b> Skew的具體數值](https://file.elecfans.com/web1/M00/6C/28/pIYBAFviV4WAECDvAAAd1P3ouCQ747.png)
評論