這個比較簡單,我們知道在啟動核心的時候,需要把裝置樹的位址寫到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...