一. DTS 語法
1.1. dts 頭文件
1.1.1. 可以使用#include來引用
1.2. 關於/dts-v1/;
1.2.1. 用於dts的版本信息,一般使用/dts-v1/版本
1.3. 設備節點
1.3.1. 分析下圖節點
<1>. “/”是跟節點,每個設備樹只有一個根節點
<2>.設備樹中節點命名格式如下 :
node-name@unit-address
有時我們看到的是:label: node-name@unit-address;引入 label 的目的就是為了方便訪問節點 比如通過&cpu0 就可以訪問“cpu@0”這個節點,上圖的chosen,memory都屬於label。
<3>. 每個節點都有不同屬性,不同的屬性又有不同的內容,屬性都是鍵值對,值可以為空或任意的字節流。設備樹源碼中常用的幾種數據形式:字符串,u32,數組
1.3.2. 標准屬性
1.3.2.1. compatible 屬性
compatible 屬性也叫做“兼容性”屬性,這是非常重要的一個屬性! compatible 屬性的值是 一個字符串列表, compatible 屬性用於將設備和驅動綁定起來。字符串列表用於選擇設備所要使用的驅動程序 ,compatible 屬性的值格式 :"manufacturer,model" ,例如:
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull"; //此compatible是有兩個屬性,用分號隔開
PS:根節點“/” 下的compatible 屬性 用於查看是否支持此設備 ,取代設備ID。在沒有使用設備樹以前, uboot 會向 Linux 內核傳遞一個叫做 machine id 的值, machine id
也就是設備 ID
1.3.2.2. model屬性
model 屬性值也是一個字符串,一般 model 屬性描述設備模塊信息,比如名字什么的,例如:model = "wm8960-audio";
1.3.2.3. status屬性
status 屬性看名字就知道是和設備狀態有關的, status 屬性值也是字符串,字符串是設備的狀態信息,可選的狀態如下
1.3.2.4. #address-cells和#size-cells屬性
這兩個屬性的值都是無符號 32 位整形, #address-cells 和#size-cells 這兩個屬性可以用在 任何擁有子節點的設備中,用於描述子節點的地址信息,直接上示例

/ { #address-cells = <0x2>; // 在root node下使用2個u32來代表address。 #size-cells = <0x1>; // 在root node下使用1個u32來代表size。 ... ... memory { // memory device ... reg = <0x90000000 00000000 0x800000>; // 0x90000000 00000000 是存取memory的address // 0x800000 是memory的size。 ... }; ... ... }
1.3.2.5. reg屬性
reg 屬性前面已經提到過了, reg 屬性的值一般是(address, length)對。 reg 屬性一般用於描述設備地址空間資源信息,一般都是某個外設的寄存器地址范圍信息
1.3.2.6. device_type屬性
device_type 屬性值為字符串, IEEE 1275 會用到此屬性,用於描述設備的 FCode,但是設備樹沒有 FCode,所以此屬性也被拋棄了。此屬性只能用於 cpu 節點或者 memory 節點。imx6ull.dtsi 的 cpu0 節點用到了此屬性
1.3.3. 向節點追加或修改
1.3.3.1. 先看一下 I2C1 接口對應的節點,打開文件 imx6ull.dtsi 文件,找到如下所示內容:
1.3.3.2. 如果我們要添加直接的具體設備(mag311)以及修改參數,我們可以定義自己的dts文件,只要文件中#include “imx6ull.dtsi ”,
1.3.4. 特殊節點
在根節點“/”中有兩個特殊的子節點: aliases 和 chosen
1.3.4.1. aliases 節點
單詞 aliases 的意思是“別名”,因此 aliases 節點的主要功能就是定義別名,定義別名的目的就是為了方便訪問節點。不過我們一般會在節點命名的時候會加上 label,然后通過&label來訪問節點,這樣也很方便,而且設備樹里面大量的使用&label 的形式來訪問節點
1.3.4.2. chosen 子節點
chosen 並不是一個真實的設備, chosen 節點主要是為了 uboot 向 Linux 內核傳遞數據,重點是 bootargs 參數。一般.dts 文件中 chosen 節點通常為空或者內容很少 。但是我們查看設備如下,東西屬性不是kernal解析dts得到的,而是在核, bootargs 會作為 Linux 內核的命令行參數, Linux 內核啟動的時候會打印出命令行參數(也uboot設置的。前面講解 uboot 的時候說過,uboot 在啟動 Linux 內核的時候會將 bootargs 的值傳遞給 Linux就是 uboot 傳遞進來的 bootargs 的值),此節點就是橋梁
chosen也可以設置參數:參考https://www.cnblogs.com/liushuhe1990/p/9704045.html
1.4. 文件系統中查看設備樹屬性
1.4.1. 進入設備查看設備樹根目錄
<1>. 設備樹根位於/proc/device-tree
<2>. 可以進入相應子設備以及查看屬性
1.5. 設備樹常用of操作函數
常用操作函數位於include/linux/of.h