**
硬體資源越來越龐大和複雜,核心的另乙個挑戰就是要便捷的管理這些資源。同時,
面對如此之多的平台不同的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 系統呼叫 怎麼表示程序的層次關係 父程序怎麼收集後...