設備樹源文件
設備樹源文件擴展名為.dts,我們在前面移植 Linux 的時候卻一直在使用.dtb 文件,那么 DTS 和 DTB 這兩個文件是什么關系呢? DTS 是設備樹源碼文件, DTB 是將 DTS 編譯以后得到的二進制文件。將.dts 編譯為.dtb 需要什么工具呢?需要用到 DTC 工具! DTC 工具源碼在 Linux 內核的 scripts/dtc 目錄下,scripts/dtc/Makefile 文件內容如下:
always := $(hostprogs-y)dtc-objs:= dtc.o flattree.o fstree.o data.o livetree.o treesource.o \srcpos.o checks.o util.o
dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
......
DTC 工具依賴于 dtc.c、 flattree.c、 fstree.c 等文件,最終編譯并鏈接出 DTC 這個主機文件。如果要編譯 DTS 文件的話只需要進入到 Linux 源碼根目錄下,然后執行如下命令:
make all
或者
make dtbs
“make all”命令是編譯 Linux 源碼中的所有東西,包括 zImage, .ko 驅動模塊以及設備樹,如果只是編譯設備樹的話建議使用“make dtbs”命令。
---------------------------------------------------------------
設備樹內容屬性介紹
設備樹是采用樹形結構來描述板子上的設備信息的文件,每個設備都是一個節點,叫做設備節點,每個節點都通過一些屬性信息來描述節點信息,屬性就是鍵—值對。
1.節點名稱
node-name@unit-address
//node-name:節點名字
//unit-address:表示寄存器基地址或設備地址,如下serial@101f0000
label:node-name@unit-address // 引入label目的就是為了方便便訪問節點,可以直接通過&label來訪問這個
serial@101f0000 { compatible = "arm,pl011"; reg = <0x101f0000 0x1000 >; interrupts = < 1 0 >;
2.compatible 屬性
compatible 屬性值為字符串列表,?于將設備和驅動綁定起來,字符串列表?于選擇設備所要使用的驅動程序
"manufacturer,model" ? ? //anufacturer :廠商 ?model:模塊對應的驅動名
一般驅動程序文件中都會有一個 OF 匹配表,此 OF 匹配表保存著一些 compatible 值,如果設備節點的 compatible 屬性值和 OF 匹配表中的任何一個值相等,那么就表示設備可以使用這個驅動。
3.model 屬性
model 屬性:描述設備模塊信息,比如名字什么的,如:model = “wm8960-audio”。
4.status 屬性
status 屬性:描述設備狀態,如:okay - 設備可操作,disabled - 設備不可操作
5.#address-cells 和 #size-cells 屬性
#address-cells 和 #size-cells 描述?節點應如何編寫 reg 屬性值,一般 reg 屬性是某個外設的寄存器地址范圍信息。
#address-cells:代表reg屬性起始地址的字長,32位機的1字長為32位
#size-cells :代表reg屬性 地址長度的字長
reg:描述地址空間資源信息
reg = <0x02200000 0x100000>; 起始地址為0x02200000,地址長度為0x100000
6.ranges 屬性
ranges它是一個地址映射/轉換表,如果 ranges 屬性值為空值,說明子地址空間和父地址空間完全相同,不需要進行地址轉換。
7.aliases 節點
用 aliases 節點給多個同類型的控制器分配唯一編號,便于Linux內核區分。在Linux啟動時會解析aliases節點。
8.chosen 節點
chosen 并不是一個真實的設備,主要用于將 uboot 中的 bootargs 環境變量值傳遞給 Linux 內核作為命令行參數