Linux時鐘管理透徹分析

2021-08-03 16:58:05 字數 3177 閱讀 5583

**

硬體資源越來越龐大和複雜,核心的另乙個挑戰就是要便捷的管理這些資源。同時,

面對如此之多的平台不同的cpu

,管理機制需要統一適用,這就需要對資源的管理抽象

到更加通用的層次。cpu中各個模組都需要時鐘驅動,核心需

要一種機制能通用所有的

平台,方便的管理cpu上所有的clk資源。這裡分析linux對clk的管理。

通常操作為以下幾步:

1.定義struct clk *clk;

2.獲取需要操作的clock結構體 clk=clk_get(&pdev->dev, "pclk"); /* 第乙個引數一般取null */

3.設定頻率 clk_set_rate(clk); /* 返回時鐘頻率 */

4.產生時鐘 clk_enable(clk);

5.停止時鐘clk_disable(clk);

我們下面重點分析clk_get這個函式。

struct clk定義如下:

分析clk_get這個函式:

clk_get函式定義在linux-3.4.2\drivers\clk\clkdev.c 檔案中,內容如下:

這個函式有兩個引數,struct device *dev這個結構非常複雜,下面有它的具體定義,一般我們設定成

null

,第二個人引數是我們需要設定硬體上的那部分時鐘,比如adc,iis,dma等。

我們繼續分析clk_get裡面的呼叫關係,呼叫了clk_get_sys這個函式,第乙個引數我們開始設定成null了,

第二個引數是我們需要設定硬體相關時鐘的名字。

clk_get_sys裡面通過clk_find函式;來查詢我們傳入的硬體名稱,並返回clk_lookup型別的乙個指標,

clk_find函式裡面就是我們最終需要檢視的內容。

list_for_each_entry函式從clocks的鍊錶中的表頭,它受clocks_lock保護,開始查詢和我們傳入的硬體名稱相比較,

如果找到了就返回乙個指向該硬體clk_lookup型別的指標。

clk_get函式到此為止分析完畢,這裡補充一點,那就是第二個引數在**定義的呢,這裡我的核心版本是

linux-3.4.2定義在 linux-3.4.2\arch\arm\plat-samsung\clock.c中,內容如下:

[html]view plain

copy

print?

<

span

style="font-size:18px;"

>

struct clk clk_xtal = ;  

struct clk clk_ext = ;  

struct clk clk_epll = ;  

struct clk clk_mpll = ;  

struct clk clk_upll = ;  

struct clk clk_f = ;  

struct clk clk_h = ;  

struct clk clk_p = ;  

struct clk clk_usb_bus = ;  

struct clk s3c24xx_uclk = ;

span

>

struct clk clk_xtal = ;

struct clk clk_ext = ;

struct clk clk_epll = ;

struct clk clk_mpll = ;

struct clk clk_upll = ;

struct clk clk_f = ;

struct clk clk_h = ;

struct clk clk_p = ;

struct clk clk_usb_bus = ;

struct clk s3c24xx_uclk = ;

總結:1

)對應外設時鐘的開啟

struct clk=clk_get(null,"adc");

clk.enable(); 之後

adc對應的時鐘位就能使能。

clk_get

從乙個時鐘

list

鍊錶中以字元

id名稱來查詢乙個時鐘

clk結構體並且返回,最後呼叫

clk.enable()

,來時能對應的外設時鐘源。

(2)clk_get_rate函式可以從clk_get得到的某裝置結構體中獲得該裝置的時鐘頻率。

2. clocks鍊錶

arch/arm/mach-mx5/clock.c中不僅定義了所有的clk物件,而且每個clk物件還要對應乙個struct clk_lookup結構。在初始化時,會將所有的clk_loopup結構新增進入clocks鍊錶中。

[cpp]

view plain

copy

print?

struct clk_lookup ;  

struct clk_lookup ;
clk_lookup,顧名思義就知道它是用來查詢struct clk結構的。有了它,就可以通過裝置名或時鐘源的名字來找到相應的struct clk結構。鍊錶操作位於drivers/clk/clkdev.c

linux 時鐘源初步分析

初步概念 看datasheet的關於時鐘與定時器的部分,fclk供給cpu,hclk供給ahb匯流排裝置 儲存器控制器,中斷控制器 lcd控制器 dma usb主機控制器等 pclk供給apb匯流排上的裝置 watchdog iis i2c pwm 定時器 adc uart gpio rtc spi...

透徹分析C C 中memset函式

在c語言中,經常需要對記憶體進行操作,裡面涉及很多函式,但是memset函式的使用有一點需要大家格外注意,這也是我在做專案時遇到過的乙個問題,除錯了很久才找出來錯誤。函式原型是 void memset void s,int ch,size t n 函式功能是 將s所指向的某一塊記憶體中的前n個位元組...

Linux程序管理分析

本文分析的內容包括 程序的概念和一般特性,為什麼重要 程序和執行緒之間的關係 linux如何存放和表示程序 用task struct和thread info 如何建立程序 通過fork 最終是clone 怎麼把新的執行映像裝到位址空間 通過exec 系統呼叫 怎麼表示程序的層次關係 父程序怎麼收集後...