裝置樹學習(二)(裝置樹的規範)

2021-10-24 23:59:24 字數 3538 閱讀 6047

/dts-v1/

;[memory reservations]

// 格式為: /memreserve/ ;

/;

從上面檔案布局我們能看到大概分為以下幾部分,我們依次介紹:

(1)

/dts-v1/

; 表示dts檔案的版本

(2)

[memory reservations]

// 格式為: /memreserve/ ;表示留給自己使用的記憶體。即核心不能使用這部分記憶體空間,位址與大小在dtb中都是使用64位的數表示。

(3)

/

;/ 根,裝置樹的起點,根節點中包含一般的屬性及特殊的屬性以及子節點。

1.我們先介紹特殊的屬性

#address-cells

// 在它的子節點的reg屬性中, 使用多少個u32整數來描述位址(address)

#size-cells

// 在它的子節點的reg屬性中, 使用多少個u32整數來描述大小(size)

compatible // 定義一系列的字串, 用來指定核心中哪個machine_desc可以支援本裝置

// 即這個板子相容哪些平台

// uimage : smdk2410 smdk2440 mini2440 ==> machine_desc

model // 咱這個板子是什麼

// 比如有2款板子配置基本一致, 它們的compatible是一樣的

// 那麼就通過model來分辨這2款板子

2.一般的屬性

[property definitions]

property格式1

:[label:

] property-name = value;

property格式2

(沒有值)

:[label:

] property-name;

property取值只有3種:

arrays of cells

(1個或多個32位資料,

64位資料使用2個32位資料表示)

,string

(字串)

,bytestring

(1個或多個位元組)

示例: a. arrays of cells : cell就是乙個32位的資料

interrupts =

<

170xc

>;

b.64bit資料使用2個cell來表示:

clock-frequency =

<

0x00000001

0x00000000

>;

c. a null-terminated string (有結束符的字串)

: compatible =

"******-bus";

d. a bytestring

(位元組序列)

: local-mac-address =[00

0012

345678]

;// 每個byte使用2個16進製制數來表示,可以不用加空格

local-mac-address =

[000012345678];

// 每個byte使用2個16進製制數來表示

e. 可以是各種值的組合, 用逗號隔開:

compatible =

"ns16550"

,"ns8250"

; example =

<

0xf00f0000

19>

,"a strange property format"

;3.devicetree node格式:

[label:

] node-name[@unit-address]

;需要注意倆個部分label與node-name,node-name要保證在同節點下的唯一性,label是乙個標籤,當別的節點引用的時候會用到它。

後面再介紹引用的內容。

比如我們有乙個表示中斷控制器的節點,然後有乙個使用中斷的裝置,我們使用中斷的裝置產生中斷後要傳給中斷控制器,所以就需要引用中斷控制器的節點,怎麼引用呢?有兩種辦法,如下:

第一種:

使用phandle應用 :

// 節點中的phandle屬性, 它的取值必須是唯一的,如果別的節點中有該屬性,要確保所有的phandle都不一樣。

pic@10000000

;another-device-node

;

第二種:

. label:

pic: pic@10000000

;another-device-node

;

這裡再介紹一下dtsi檔案,該檔案是將一類的裝置共有的資源打包到乙個檔案中,當我們寫乙個自己的開發板的裝置樹時,只需要include 「」***.dtsi「」就能包含該檔案。dts中的節點可以對dtsi中的節點進行重寫。

dtc會把dts檔案編譯成dtb檔案

這裡我們舉個例子來學習dtb檔案,先給出dts檔案內容:

#define s3c2410_gpa(_nr) ((0<<16) + (_nr))

#define s3c2410_gpb(_nr) ((1<<16) + (_nr))

#define s3c2410_gpc(_nr) ((2<<16) + (_nr))

#define s3c2410_gpd(_nr) ((3<<16) + (_nr))

#define s3c2410_gpe(_nr) ((4<<16) + (_nr))

#define s3c2410_gpf(_nr) ((5<<16) + (_nr))

#define s3c2410_gpg(_nr) ((6<<16) + (_nr))

#define s3c2410_gph(_nr) ((7<<16) + (_nr))

#define s3c2410_gpj(_nr) ((8<<16) + (_nr))

#define s3c2410_gpk(_nr) ((9<<16) + (_nr))

#define s3c2410_gpl(_nr) ((10<<16) + (_nr))

#define s3c2410_gpm(_nr) ((11<<16) + (_nr))

/dts-v1/

;/memreserve/

0x33f00000

0x100000;/

;/*cpus ;

};*/

chosen ;

led ;}

;

將上述檔案編譯成dtb檔案,檢視dtb檔案,如下是學習的dts檔案與dtb檔案對應關係:

裝置樹學習(四) uboot對裝置樹的支援)

這個比較簡單,我們知道在啟動核心的時候,需要把裝置樹的位址寫到r2暫存器中,但是怎麼寫到r2暫存器?a.u boot中核心啟動命令 bootm 無裝置樹,bootm 0x30007fc0 bootm 有裝置樹 比如 nand read.jffs2 0x30007fc0 kernel 讀核心uimag...

linux裝置樹學習筆記備忘 裝置樹格式

1 裝置樹格式 label node name unit address 例子 1150 fusb0 fusb30x 22 格式一 label property name value 格式二 label property name property取值方式只有3種 arrays of cells 1...

裝置樹學習總結

標籤 label 可以為節點建立標籤,別的地方引用時可以用標籤。標籤為可選項。節點 node 每個節點必須有乙個 名稱 裝置位址 形式的名字,為可選項,unit address一般是記憶體位址。名稱 name 乙個位元組大小 就是乙個不超過31位的簡單 ascii 字串,節點的命名應該根據它所體現的...