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

2021-10-25 01:59:49 字數 2091 閱讀 9549

這個比較簡單,我們知道在啟動核心的時候,需要把裝置樹的位址寫到r2暫存器中,但是怎麼寫到r2暫存器?

a. u-boot中核心啟動命令:

bootm // 無裝置樹,bootm 0x30007fc0

bootm // 有裝置樹

比如 :

nand read.jffs2 0x30007fc0 kernel; // 讀核心uimage到記憶體0x30007fc0

nand read.jffs2 32000000 device_tree; // 讀dtb到記憶體32000000

bootm 0x30007fc0 - 0x32000000 // 啟動, 沒有initrd時對應引數寫為"-"

b. bootm命令怎麼把dtb_addr寫入r2暫存器傳給核心?

c_function(p0, p1, p2) // p0 => r0, p1 => r1, p2 => r2

定義函式指標 the_kernel, 指向核心的啟動位址,

然後執行: the_kernel(0, machine_id, 0x32000000);

c. dtb_addr 可以隨便選嗎?

c.1 不要破壞u-boot本身

c.2 不要擋核心的路: 核心本身的空間不能占用, 核心要用到的記憶體區域也不能占用

核心啟動時一般會在它所處位置的下邊放置頁表, 這塊空間(一般是0x4000即16k位元組)不能被占用

當我們需要修改dts檔案中的某些東西得時候,可以有兩種辦法,第一種是直接修改裝置樹dts原始檔,然後重新編譯燒寫,使用新的裝置樹檔案,第二種是在uboot中修改dtb檔案。

下面舉兩個修改dtb檔案的例子:

a. 把原屬性val所佔空間從len位元組擴充套件為newlen位元組:

把老值之後的所有內容向後移動(newlen - len)位元組

b. 把新值寫入val所佔的newlen位元組空間

c. 修改dtb頭部資訊中structure block的長度: size_dt_struct

d. 修改dtb頭部資訊中string block的偏移值: off_dt_strings

e. 修改dtb頭部資訊中的總長度: totalsize

例子2. 新增乙個全新的屬性

a. 如果在string block中沒有這個屬性的名字,

就在string block尾部新增乙個新字串: 屬性的名

並且修改dtb頭部資訊中string block的長度: size_dt_strings

修改dtb頭部資訊中的總長度: totalsize

b. 找到屬性所在節點, 在節點尾部擴充套件一塊空間, 內容及長度為:

tag // 4位元組, 對應0x00000003

len // 4位元組, 表示屬性的val的長度

nameoff // 4位元組, 表示屬性名的offset

val // len位元組, 用來存放val

c. 修改dtb頭部資訊中structure block的長度: size_dt_struct

d. 修改dtb頭部資訊中string block的偏移值: off_dt_strings

e. 修改dtb頭部資訊中的總長度: totalsize

修改ftd檔案需要用到fdt命令,新版本的uboot支援該命令:

fdt命令使用示例

nand read.jffs2 32000000 device_tree // 從flash讀出dtb檔案到記憶體(0x32000000)

fdt addr 32000000 // 告訴fdt, dtb檔案在哪

fdt print /led pin // 列印/led節點的pin屬性

fdt get value *** /led pin // 讀取/led節點的pin屬性, 並且賦給環境變數***

print *** // 列印環境變數***的值

fdt set /led pin <0x00050005> // 設定/led節點的pin屬性

fdt print /led pin // 列印/led節點的pin屬性

nand erase device_tree // 擦除flash分割槽

nand write.jffs2 32000000 device_tree // 把修改後的dtb檔案寫入flash分割槽

04課 u boot對裝置樹的支援

2 dtb的修改原理 3 dtb的修改命令fdt移植 uboot傳遞dtb給核心 r2 1 u boot中核心啟動命令 bootm 無裝置樹,bootm 0x30007fc0 bootm 有裝置樹 比如 nand read.jffs2 0x30007fc0 kernel 讀核心uimage到記憶體0...

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

dts v1 memory reservations 格式為 memreserve 從上面檔案布局我們能看到大概分為以下幾部分,我們依次介紹 1 dts v1 表示dts檔案的版本 2 memory reservations 格式為 memreserve 表示留給自己使用的記憶體。即核心不能使用這部...

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

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