04課 u boot對裝置樹的支援

2021-10-25 15:12:13 字數 4071 閱讀 9209

2、dtb的修改原理

3、dtb的修改命令fdt移植

uboot傳遞dtb給核心 : r2

1、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時對應引數寫為"-"

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

arm程式呼叫規則(atpcs)

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

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

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

3、dtb_addr 可以隨便選嗎?

3.1、不要破壞u-boot本身

3.2、不要擋核心的路: 核心本身的空間不能占用, 核心要用到的記憶體區域也不能占用核心啟動時一般會在它所處位置的下邊放置頁表, 這塊空間 (一般是0x4000即16k位元組)不能被占用。

1、可以啟動:

nand read.jffs2 30000000 device_tree

nand read.jffs2 0x30007fc0 kernel

bootm 0x30007fc0 - 30000000

2、不可以啟動: 核心啟動時會使用0x30004000的記憶體來存放頁表,dtb會被破壞

nand read.jffs2 30004000 device_tree

nand read.jffs2 0x30007fc0 kernel

bootm 0x30007fc0 - 30004000

假設 老值: len

新值: newlen (假設newlen > len)

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

a. 根據path找到節點

b. 根據val確定新值長度newlen, 並把val轉換為位元組流

c. fdt_setprop

c.1 fdt_setprop_placeholder // 為新值在dtb中騰出位置

fdt_get_property_w // 得到老值的長度 oldlen

fdt_splice_struct_ // 騰空間

fdt_splice_ // 使用memmove移動dtb資料, 移動(newlen-oldlen)

fdt_set_size_dt_struct // 修改dtb頭部, size_dt_struct

fdt_set_off_dt_strings // 修改dtb頭部, off_dt_strings

c.2memcpy

(prop_data, val, len)

;// 在dtb中存入新值

u-boot官網原始碼:

最終的補丁存放在如下目錄: doc_and_sources_for_device_tree\source_and_images\u-boot\u-boot-1.1.6_device_tree_for_jz2440_add_fdt_20181022.patch

補丁使用方法:

export path=path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:

/work/system/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi/bin

tar xjf u-boot-1.1.6.tar.bz2 // 解壓

cd u-boot-1.1.6

patch -p1 < …/u-boot-1.1.6_device_tree_for_jz2440_add_fdt_20181022.patch // 打補丁

make 100ask24x0_config // 配置

make // 編譯, 可以得到u-boot.bin

u-boot-2018.11-rc2\lib\libfdt 主要用這個目錄,

它裡面的大部分檔案是直接包含scripts\dtc\libfdt中的同名檔案

只有2個檔案是自己的版本

u-boot-2018.11-rc2\scripts\dtc\libfdt

把新u-boot中cmd/fdt.c重新命名為cmd_fdt.c , 和 lib/libfdt/* 一起複製到老u-boot的common/fdt目錄

修改 老u-boot/makefile, 新增一行: libs += common/fdt/libfdt.a

修改 老u-boot/common/fdt/makefile, 仿照 drivers/nand/makefile來修改

移植時常見問題:

1、no such file or directory:

要注意,

#include 「***.h」 // 是在當前目錄下查詢***.h

#include // 是在指定目錄下查詢***.h, 哪些指定目錄呢?

// 編譯檔案時可以用"-i"選項指定頭檔案目錄,

// 比如: arm-linux-gcc -i

-c -o …

// 對於u-boot來說, 一般就是原始碼的 include目錄

解決方法: 確定標頭檔案在哪, 把它移到include目錄或是原始碼的當前目錄

2、*** undeclared :

巨集, 變數, 函式未宣告/未定義

對於巨集, 去定義它;

對於變數, 去定義它或是宣告為外部變數;

對於函式, 去實現它或是宣告為外部函式;

3、上述2個錯誤是編譯時出現的,

當一切都沒問題時, 最後就是鏈結程式, 這時常出現: undefined reference to `***』

這表示**裡用到了***函式, 但是這個函式沒有實現

解決方法: 去實現它, 或是找到它所在檔案, 把這檔案加入工程

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分割槽

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

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

4 1uboot對裝置樹的支援 傳遞dtb給核心

從flash中將裝置樹讀入記憶體,在啟動核心時,把裝置樹所在的位址寫到r2暫存器中就可以了。a.u boot中核心啟動命令 bootm 無裝置樹,bootm 0x30007fc0 bootm 有裝置樹 比如 nand read.jffs2 0x30007fc0 kernel 讀核心uimage到記憶...

IOS裝置對position的支援性

最近在開發乙個網頁。大家都知道 接下來 我說一下我遇到的問題和解決方法 由於要做乙個展示性 資料網頁 需求是做固定右滑動 這裡我沒有用到外掛程式。只是用了html css特有的屬性 在正常寫完網頁的時候,安卓裝置的支援性很好,可以說任何bug都 沒有 但是在ios裝置下 ios版本為7的支援性還是蠻...