1.設備樹
設備樹(Device Tree)是一種描述硬件的數據結構。
作用:提供設備信息。
時間:在操作系統引導階段進行設備初始化的時候,數據結構中的硬件信息被檢測並傳遞給操作系統。
設備樹源文件(xxxx.dts) DTC編譯 設備樹二進制文件(xxxx.dtb)
2.設備樹基本語法
設備樹的基本單元是節點(node),這些node被組織成樹狀結構,除了root node,每個node都只有一個parent node,一個device tree文件中只能有一個root node。每個node中包含了若干的鍵值對(property/value)來描述該node的一些特性。每個node用節點名字標識。(類似於linux文件系統)
/{ //根節點
Property = value; //描述信息
<name>[@<unit-address>]{ //子節點
Property = value //描述信息
};
……
};
3.節點名命名規範
節點名字的格式是[@]。如果該node沒有reg屬性,那麼該節點名字中不能包括@unit-address。unit-address的具體格式是和設備掛在哪個bus上相關。例如對於CPU,其unit-address就是從0開始編址,以此加1,而具體的設備,例如以太網控制器,其unit-address就是寄存器地址。根節點的節點名是確定的,必須是“/”。
reg = <0x10001000 0x24 0x20001000 0x24>;
4.節點別名
一個設備可能會使用到別的節點的內容,可以通過節點的別名來引用到其內容。引用的目的可能是合併兩個節點的內容、 替換部分內容、或是使用部分內容。
/{ //根節點
demo:demo0@0x48000000{
compatible = “xxx”;
};
……
};
節點名 : demo0@0x48000000
節點路徑: /demo0@0x48000000
節點別名: demo
demo == /demo0@80000000
引用方式:
1.&demo{
Reg = <0x10001000 4 0x20001000 4>
……
};
2./{
reference-node{
property = <&demo>;
……
};
};
5.合併節點內容
一個硬件設備的部分信息不會變化,但是另一部分信息是有可能會變化的,就出現了節點內容合併。即:先編寫好節點,僅僅描述部分屬性值;使用者後加一部分屬性值。在同級路徑下,節點名相同的“兩個”節點實際會自動合併成一個節點。(類似於c++中的命名空間)
6.設備樹鍵值對相關語法
[1]. 字符串信息
compatible = "隨風,飄落";
[2]. 32位無符號整形數組
word-array = <32 45 67 89>;
reg = <0x10001000 0x24 0x20001000 0x24>;
[3]. 二進制數組
bi-array = [0c 20 11 24];
mac = [FE 02 11 CB 40 58];
[4]. 字符數組
string-list = "aaa" , "bbb" , "ccc";
7.默認意義的屬性
[1]. 設備樹語法中已經定義好的,具有通用規範意義的屬性如果是設備信息和驅動分離框架的設備節點,則能夠在內核初始化找到節點時候,自動解析生成相應的設備信息。
常見屬性的有: compatible、地址address、中斷interrupt
簡單舉例:
compatible屬性:用於匹配設備節點和設備驅動的屬性,規則是驅動設備ID表中的compatible域的值(字符串),和設備樹中設備節點中的compatible屬性值完全一致。 compatible=“廠商名,設備名” ;
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};
struct device_driver {
const char *name;
struct bus_type *bus;
struct module *owner;
const struct of_device_id *of_match_table;
};
struct of_device_id
{
char compatible[128]; //用來和設備樹中的compatible屬性進行匹配
};
[2]. ARM Linux內核定義好的,一類設備通用的有默認意義的屬性不能被內核自動解析生成相應的設備信息,但是內核已經編寫了相應的解析提取函數。
常見屬性的有: MAC地址、 GPIO、 clock …
GPIO屬性:
gpio-controller:說明該節點描述的是一個gpio控制器
#gpio-cells:描述gpio使用節點的屬性一個cell的內容
屬性名=<&引用GPIO節點別名 GPIO標號 工作模式>;
eg: gpios = <&gpx0 1 1> ;
補充
描述設備節點相關信息的結構體
struct device_node {
const char *name; //名字
const char *type; //類型
char *full_name; //節點全名
};