設備樹的起源
在過去的arm linux中,arch/arm/plat-xxx中mach-xxx中充滿大量垃圾代碼,多是描述板級細節的信息,在linus 一聲怒喝之後,設備樹衍生而出。
設備樹的組成和結構
- 描述設備硬件信息的文本
- 編譯該文本的工具
- bootloader需要支持將編譯後的設備樹傳遞給linux內核
DTS文件
- ASCII文本格式的設備樹描述
- 一般一個。dts文件對應一個ARM設備
- 通常放在arch/arm/boot/dts目錄中
- 現大部分主控芯片都支持設備樹
- 內核爲了簡化,對於設備共同的部分提煉爲。dtsi文件(類似c的頭文件)
- 文件。dts的基本元素爲節點和屬性
DTC
- dtc是將dts編譯爲dtb的工具
- 源碼位於scripts/dtc目錄中,在內核使能了設備樹的情況下,編譯內核時主機工具dtc會被編譯出來
- scripts/dtc/Makefile中的hostprogs-y:=dtc
dtc也可以在ubuntu中單獨安裝
sudo apt-get install device-tree-compiler
- 在arch/arm/boot/dts/Makefile中描述了當某個soc被選中後,哪些dtb文件會被編譯出來
dtc除了可以編譯dts文件生成dtb文件,還可以反彙編dtb文件爲dts文件:
dtc -I dtb -O dts -o xxx.dts xxxx.dtb
dtb
- 編譯後生成的二進制格式的設備樹文件
- 由linux內核解析
- 內核也支持dtb和zImage綁定在一起做成一個映像文件,內核編譯時使能CONFIG_ARM_APPENDED_DTB這個選項,以支持
binding
- 內核documentation/device/bindings目錄下txt文件描述節點和屬性具體如何來表述硬件信息。
- 主要內容包括:
- 關於該模塊的最基本的描述
- 必需屬性的描述
- 可選屬性的描述
- 一個實例
- scripts/checkpatch.pl會運行一個檢查,對有人在設備樹中添加了compatible字符串,二沒添加相應的文檔進行解釋,會報出警告
bootloader
uboot設備從1.1.3開始支持設備樹,爲了使能設備樹,需要在編譯uboot的時候在config文件中加入:
#define CONFIG_OF_LIBFDT
- 可從nand、sd或tftp將dtb讀入內存
- 可在uboot中運行fdt addr 命令設置dtb的位置如:
uboot》 fdt addr 0x71000000
- * 對於arm來講,可以通過bootz kernel_addr initrd_address dtb_address 的命令來啓動內核,既dtb_address作爲bootz或bootm的最後一次參數,第一個參數爲內核映像的地址,第二個爲rootfs的地址 若不存在iniitrd,可以用-代替。(三者順序不能亂)*
根節點兼容性
- 根節點/的兼容屬性compatible= ”“,定義了整個系統(設備級別)的名稱,組織形式爲,
- linux內黑通過根節點的兼容屬性可判斷它啓動的是什麼設備。在真實項目中,這個頂層設備的兼容屬性一般包括兩個或兩個以上的兼容性字符串,首個兼容字符串是板子級別的名字,後面一個兼容性是芯片級別的名字。