⑴ 如何linux dtb mp
dtb文件作用的描述是,使用dtb可以減少linux內核版本的數量。同一份linux 內核代碼可以在多個板卡上運行,每個板卡可以使用自己的dtb文件。 1,在linux內核啟動過程中會解析dtb文件,根據dtb文件中設備列表進行加註各個外設的驅動模塊。
⑵ 請教linux啟動過程中dtb的作用
是如何使用dtb文件的? 我的理解是,在linux內核啟動過程中會解析dtb文件,根據dtb文件中設備列表進行加註各個外設的驅動模塊。不知這樣理解是否正確?
答「正確,解析dtb並創建platform device 過程請參見of_platform_populate和of_platform_bus_probe。
dtb文件中外設列表,和在linux內核中使能各個外設驅動模塊(設置*或M)有什麼關系? 是否可以這么理解,要想一份linux kernel可以運行在多塊板卡上,必須在linux kernel配置中包括所有這些板卡的driver 模塊,這樣在linux啟動過程中才能根據dtb 中的列表進行載入模塊。
答:dtb裡面最後被kernel解析,並創建為platform device, 相應的 你也必須要有platform driver 才行。
是否可以這么理解?PC機在啟動時會自動掃描外設,而在嵌入式中,linux內核啟動過程中只是解析dtb文件,從而載入對應的模塊。
答:因為PC機基本就是暗指X86,這樣X86架構上外設都是基於PCI或者PCIE匯流排,這類匯流排可以在啟動的時候,動態掃描。 嵌入式裡面,ARM和PowerPC, SOC 主要的設備控制器都是基於soc匯流排,其不像pci/pcie匯流排可以動態的掃描。所以需要dtb。
是否可以這么理解?編譯linux內核時必須選擇某外設模塊,並且dtb中包括該外設的信息。在linux內核啟動過程中才能自動載入該模塊。
答:對
⑶ linux載入dts的時候會創建設備節點嗎
From:http://m.blog.csdn.net/blog/liliyaya/9188193
1. 在\kernel\of\fdt.c 中有如下初始化函數 注釋上:展開設備樹,創建device_nodes到全局變數allnodes中
void __init unflatten_device_tree(void)
{
__unflatten_device_tree(initial_boot_params, &allnodes,
early_init_dt_alloc_memory_arch);
/* Get pointer to "/chosen" and "/aliasas" nodes for use everywhere */
of_alias_scan(early_init_dt_alloc_memory_arch);
}
unflatten_device_tree函數被setup_arch函數調用,
因為我們使用得是arm平台所以存在\kernel\arch\arm\kernel\setup.c中
void __init setup_arch(char **cmdline_p)
{
unflatten_device_tree()
}
setup_arch函數在kernel啟動是被調用,如下啟動kernel存在\kernel\init\main.c中
asmlinkage void __init start_kernel(void)
{
setup_arch(&command_line);
}
這些工作完成解析DTS文件。保存到全局鏈表allnodes中。
2、在makefile中有這段話來編譯dts文件:
$(obj)/A20%.dtb: $(src)/dts/A20%.dts FORCE
$(call if_changed_dep,dtc)
$(obj)/A68M%.dtb: $(src)/dts/A68M%.dts FORCE
$(call if_changed_dep,dtc)
和.c文件生成.o文件一樣 回生成.dtb文件。在
/home/liyang/workspace/SZ_JB-mr1-8628-bsp-1012/out/target/proct/msm8226/obj/KERNEL_OBJ/arch/arm/boot
目錄下,與zimage一個目錄。
3、
在 board-8226.c中有初始化函數-->啟動自動掉用
void __init msm8226_init(void)
{
of_platform_populate(NULL, of_default_bus_match_table, adata, NULL);
}
of_platform_populate在kernel\driver\of\platform.c中定義,回查詢
root = root ? of_node_get(root) : of_find_node_by_path("/");
for_each_child_of_node(root, child)
{
rc = of_platform_bus_create(child, matches, lookup, parent, true);
if (rc)
break;
}
of_node_put(root);
在這里用到得函數of_find_node_by_path會最終調用到kernel\driver\of\base.c中得函數
struct device_node *of_find_node_by_path(const char *path)
{
遍歷第1步中得allnodes找到根節點
}
of_platform_bus_create()函數中創建得內容存在了 adata中。
以下內容為轉載:
(2)使用DTS注冊匯流排設備的過程
以高通8974平台為例,在注冊i2c匯流排時,會調用到qup_i2c_probe()介面,該介面用於申請匯流排資源和添加i2c適配器。在成功添加i2c適配器後,會調用of_i2c_register_devices()介面。此介面會解析i2c匯流排節點的子節點(掛載在該匯流排上的i2c設備節點),獲取i2c設備的地址、中斷號等硬體信息。然後調用request_mole()載入設備對應的驅動文件,調用i2c_new_device(),生成i2c設備。此時設備和驅動都已載入,於是drvier裡面的probe方法將被調用。後面流程就和之前一樣了。
簡而言之,Linux採用DTS描述設備硬體信息後,省去了大量板文件垃圾信息。Linux在開機啟動階段,會解析DTS文件,保存到全局鏈表allnodes中,在掉用.init_machine時,會跟據allnodes中的信息注冊平台匯流排和設備。值得注意的是,載入流程並不是按找從樹根到樹葉的方式遞歸注冊,而是只注冊根節點下的第一級子節點,第二級及之後的子節點暫不注冊。Linux系統下的設備大多都是掛載在平台匯流排下的,因此在平台匯流排被注冊後,會根據allnodes節點的樹結構,去尋找該匯流排的子節點,所有的子節點將被作為設備注冊到該匯流排上。
⑷ dtb是什麼文件怎麼打開
dtb是可以減少linux內核版本數量的文件,打開方式如下:
1、首先,網路搜索框中輸入UltraEdit,然後單擊網路一下,如下圖所示,然後進入下一步。
⑸ linux編譯u-boot時顯示[arch/arm/dts/zynq-zc702.dtb]錯誤
在編譯uboot的時候,會出現出錯,因此我們要首先做 make disclean. 將原來的一些中間文件清理干凈。
因此在編譯Uboot依次執行 1.make disclean
2.make smdk2440_config
3. make
就可以編譯通過了
⑹ 編譯linux內核設備樹文件使用什麼命令
Linux源碼的arch/powerpc/boot/dts/目錄下存放了很多dts文件,可以作為參考文件。另外dtc編譯器在內核源碼2.6.25版本之後已經被包含進去。在2.6.26版本之後,生成blob的簡單規則已經加入makefile,如下命令:
$ make ARCH=powerpc canyonlands.dtb
也可以根據自己的硬體修改好dts文件後,用下面類似命令生成dtb文件。
$ dtc -f -I dts -O dtb -R 8 -S 0x3000 test.dts > mpc836x_mds.dtb
$ mkimage -A ppc -O Linux -T flat_dt -C none -a 0x300000 -e 0 -d mpc836x_mds.dtb mpc836x_mds.dtu
⑺ linux怎麼調用dts生成dtb
dtb文件作用的描述是,使用dtb可以減少linux內核版本的數量。同一份linux 內核代碼可以在多個板卡上運行,每個板卡可以使用自己的dtb文件。
1,在linux內核啟動過程中會解析dtb文件,根據dtb文件中設備列表進行加註各個外設的驅動模塊。
2,PC機在啟動時會自動掃描外設,而在嵌入式中,linux內核啟動過程中只是解析dtb文件,從而載入對應的模塊。
3,編譯linux內核時必須選擇某外設模塊,並且dtb中包括該外設的信息。在linux內核啟動過程中才能自動載入該模塊。
要使用dtb,需要uboot啟動內核時,在bootm命令中指定dtb的位置,格式為:
bootm uImage_addr ramdisk_addr dtb_addr
如果沒有ramdisk,就需要寫成bootm uImage_addr - dtb_addr,用「-」表示沒有ramdisk
⑻ 請教linux啟動過程中dtb的作用
dtb文件作用的描述是,使用dtb可以減少linux內核版本的數量。同一份linux 內核代碼可以在多個板卡上運行,每個板卡可以使用自己的dtb文件。
1,在linux內核啟動過程中會解析dtb文件,根據dtb文件中設備列表進行加註各個外設的驅動模塊。
2,PC機在啟動時會自動掃描外設,而在嵌入式中,linux內核啟動過程中只是解析dtb文件,從而載入對應的模塊。
3,編譯linux內核時必須選擇某外設模塊,並且dtb中包括該外設的信息。在linux內核啟動過程中才能自動載入該模塊。
要使用dtb,需要uboot啟動內核時,在bootm命令中指定dtb的位置,格式為:
bootm uImage_addr ramdisk_addr dtb_addr
如果沒有ramdisk,就需要寫成bootm uImage_addr - dtb_addr,用「-」表示沒有ramdisk