---
# System prepended metadata

title: linux 驅動 11. 設備樹

---

## 設備樹


設備樹屬性定義可以看這:  [設備樹屬性定義](https://ithelp.ithome.com.tw/articles/10344251)

**1.設備樹文件**
設備樹文件dts(Device Tree Source)，裡面會包含如dtsi(Device Tree Source Include)檔案，會包含設備相關訊息，通常會有多個節點，在開發板中會以資料夾形式存在，查看設備樹之資料夾: /proc/device-tree
其中 文件夾為節點，而文件則為屬性，可通過cat指令進行查看。

dtsi 為共有的設備，dts為根據你的IC放置的設備。

ic 的 dtsi 文件當中，有些設備訊息可以根據需求自行添加於dts文件當中，透過& dtsi當中節點，以實現設備補充說明。

節點作用:
1. aliases: 作用就是在 linux  /dev 顯示設備別名  可通過 & device，對設備進行引用。

2. chosen: 作用就是將  uboot 當中的 bootargs 內核命令行參數  傳遞至 linux，由uboot 自行於設備樹文件中進行添加，不需要自己設定。 

節點中的常見屬性:
1. compatible :  (driver會使用這個屬性進行Decive的匹配)
![image](https://hackmd.io/_uploads/B1T0YkGB0.png)
前面'fsl' 為廠商名字，而後面'imx6ul-pxp-v412'為晶片，也就是驅動模塊的名字。

可通過內核內部之值，檢查是否兼容當前設備。


2. model : 描述模塊訊息，不重要。

3. state : 設備狀態相關訊息 
![image](https://hackmd.io/_uploads/BJ7ujkMHC.png)

4. reg : 描述記憶體所在位置和長度 。
![image](https://hackmd.io/_uploads/H1DY2kzS0.png)
而 從上一層節點之#address-cells 和 #size-cells屬性，用於描述下一層節點reg所需儲存訊息長度。
![image](https://hackmd.io/_uploads/B1Gm61zSA.png)

舉例:
![image](https://hackmd.io/_uploads/rkdwkeGBA.png)


5. ranges :用於映射地址長度， <物理地址  虛擬地址  內存長度>。


**2.內核查看dts文件**

內核可以通過  of_fine_node_XXX函數  來讀取設備樹相關訊息

![image](https://hackmd.io/_uploads/ry8X3gMSR.png)

可通過 of_find_node_by_name 函數，通過路徑和節點名字，來返回對應節點之結構體。

![image](https://hackmd.io/_uploads/SyrVaeGBR.png)
直接用路徑查找

查找屬性
![image](https://hackmd.io/_uploads/SkA8VZzS0.png)




