深入學習Linux Device Tree

2021-08-05 20:34:21 字數 3678 閱讀 6470

關於驅動想說的話:以前總以為高而攀不到。花時間去積累了,總會進步的。

這個世界需要的是全力以赴,戰勝他人先戰勝子自己!!

linux device tree可描述的資訊包括:

cpu的數量和型別

記憶體基位址和大小

匯流排外設

中斷控制器

gpio控制器

clock控制器

bootloader會將這顆樹傳遞給核心,核心根據它展開出linux核心中的platform_device,input_device,spi_device等裝置,裝置用到記憶體、gpio、irq   等資源,也被傳遞到核心,核心將這些資源繫結給相應的裝置。

學習的5個步驟,

dts/dtsi

device tree compiler工具,該工具將文字格式編譯為二進位制格式。

bootloader 如何將指定的二進位制格式寫入指定的記憶體位置。

核心如何展開二進位制檔案,獲取硬體裝置資訊。

驅動和裝置如何註冊。

描述檔案存放路徑: kernel/arch/arm/boot/dts

device tree結構約定

device tree 常用節點型別

所有device tree節點必須有1個根節點/, 還必須在根節點下有如下2個節點:

1、cpu節點

2、memory節點  ---epapr規範指定了memory是必須的節點,名稱也必須是memory。記憶體節點描述了系統物理記憶體的資訊,如果系統中有多個記憶體範圍,device tree中可能會建立多個記憶體節點,或者在乙個單獨的記憶體節點中通過reg屬性指定記憶體的範圍、

3、chosen節點不代表乙個真正的節點,只是傳到引數的作用,chosen裡的資料也不代表硬體。

4、cpus節點

必須的節點,不代表真實裝置,存放cpu節點的乙個容器

5、cpu節點描述具體的硬體執行單元

6、soc節點表示乙個系統級的晶元

文件documentation/devicetree/bindings

dtc (compiler)原始碼位於scripts/dtc

scripts/dtc/makefile--hostprogs-y:=dtc  //使能編譯

device tree blob (.dtb)

.dtb是.dts被dtc編譯後的二進位制格式的device tree描述,可由linux核心解析。通常在為電路板製作nand、sd啟動image時,會為.dtb檔案單獨留下乙個很小的區域以存放之,之後bootloader在引導kernel的過程中,會先讀取該.dtb到記憶體。

初始化platform_device

如msm

為例:\arch\arm\mach-msm\board-8940.c

static const char *msm8940_dt_match __initconst = ;

static void __init msm8940_init(void)

dt_machine_start(msm8940_dt,

"qualcomm technologies, inc. msm 8940 (flattened device tree)")

.init_machine = 

msm8940_init,

.dt_compat = msm8940_dt_match,

machine_end

\arch\arm\mach-msm\board-8940.c:

#include 

#include 

#include 

#include "board-dt.h"

void __init board_dt_populate(struct of_dev_auxdata *adata)

of_platform_populate 函式從device tree data中獲取資料填充platform_device.

對驅動的影響

驅動中需要增加乙個of匹配表。驅動需要與.dts中描述的裝置節點進行匹配,引發probe函式執行。

不採用dts的驅動:

需要驅動註冊平台裝置和驅動,當match後執行probe。

使用dts的驅動:

平台驅動註冊過程中,會檢查of_match_table中的裝置是否和dts中解析出來的裝置匹配,如果匹配則觸發probe函式。

對bsp影響

以前arm linux針對不同的電路板會建立由machine_start和machine_end包圍起來的針對這個machine的一系列callback,  如:

kernel\arch\arm\mach-msm\

board-msm8x60.c

machine_start與machine_end 

使用dts後,machine_start變為dt_machine_start, 其中含有.dt_compat成員,用於表明相關的machine與.dts中的root節點的compatible屬性相容關係。 如果bootloader傳遞給核心的device tree中的root結點的compatible屬性出現在某machine的.dt_compat表中,相關的machine就與對應的device tree匹配,從而引發這一machine的一系列初始化函式執行。

如:  

kernel\arch\arm\mach-msm\

board-8974.c

static const char *

msm8974_dt_match 

__initconst = ;

dt_machine_start(msm8974_dt, "qualcomm msm 8974 (flattened device tree)")

.map_io = msm8974_map_io,

.init_irq = msm_dt_init_irq,

.init_machine = msm8974_init,

.handle_irq = gic_handle_irq,

.timer = &msm_dt_timer,

.dt_compat = msm8974_dt_match,

.reserve = msm_8974_reserve,

.init_very_early = msm8974_init_very_early,

.restart = msm_restart,

.smp = &msm8974_smp_ops,

machine_end

arch\arm\boot\dts\msm8974-v1-sim.dts

/dts-v1/;

/include/ "msm8974-v1.dtsi"

/include/ "msm8974-sim.dtsi"

/ ;device tree 常用api

api 通常以of_為字首,用於獲取device tree中的關鍵資訊。實現位於:

drivers/of目錄。

dts 例子如 : 

drivers\pinctrl\qcom\

pinctrl-msm8937.c  ==>> 

\chips\msm8940\devices\msm8940_64\

msm8937-pinctrl.dtsi

UIApplication深入學習

新建乙個任意型別的ios應用工程,加入我們在class prefix輸入是tc,我們可以看到工程中生成乙個類 在main函式中,autoreleasepool 函式中 說明 當應用程式將要入非活動狀態執行,在此期間,應用程式不接收訊息或事件。比如來 了。說明 當應用程式入活動狀態執行,這個剛好跟上面...

深入學習CSS

什麼是css?在之前的這篇文章中已經介紹了初步的介紹,詳細請看 div加css進一步講解了css中的內容,先總結如下圖 其實在實際開發中,我們通常採用是外部樣式的匯入,這樣做的好處是對於很對有同樣設計樣式的頁面可以實現樣式的共享,這樣我們不僅僅可以節省了大量的時間,並且也方便我們可以靈活的呼叫的樣式...

block深入學習

block的宣告和使用看上一節就行了。本章主要講block內部的實現過程及原理。block的定義和函式指標非常相似 對比一下 block定義 void someblock 函式指標定義 void functionpionter void functionname 當然區別還是有的,block的返回型...