Linux 設備樹基本簡介

一:基本簡介
設備作用:提供設備信息
設備樹(Device Tree)是一種描述硬件的數據結構在操作系統引導階段進行設備初始化的時候,數據結構中的硬件信息被檢測並傳遞給操作系統
設備樹: 設備樹源文件(xxxx.dts) —DTC—>>> 設備樹二進制文件(xxxx.dtb)
設備樹基本語法:
設備樹的基本單元是節點(node),這些node被組織成樹狀結構,除了root node,每個node都只有一個parent node,一個device tree文件中只能有一個root node。每個node中包含了若干的鍵值對(property/value)來描述該node的一些特性。每個node用節點名字標識。
節點名命名規範:節點名字的格式是[@]。如果該node沒有reg屬性,那麼該節點名字中不能包括@unit-address。unit-address的具體格式是和設備掛在哪個bus上相關。例如對於CPU,其unit-address就是從0開始編址,以此加1,而具體的設備,例如以太網控制器,其unit-address就是寄存器地址。根節點的節點名是確定的,必須是“/”。
節點別名:一個設備可能會使用到別的節點的內容,可以通過節點的別名來引用到其內容。引用的目的可能是合併兩個節點的內容、 替換部分內容、或是使用部分內容
在這裏插入圖片描述
節點名 : demo0@0x48000000
節點路徑: /demo0@0x48000000
節點別名: demo
demo等價/demo0@80000000

	合併節點內容:一個硬件設備的部分信息不會變化,但是另一部分信息是有可能會變化的,就出現了節點內容合併。即:先編寫好節點,僅僅描述部分屬性值;使用者後加一部分屬性值。在同級路徑下,節點名相同的“兩個”節點實際會自動合併成一個節點
	設備樹鍵值對相關語法:[1]. 字符串信息 		compatible = "qf-edu,iot-test";[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";
默認意義的屬性:
[1].   設備樹語法中已經定義好的,具有通用規範意義的屬性如果是設備信息和驅動分離框架的設備節點,則能夠在內核初始化找到節點時候,自動解析生成相應的設備信息。
常見屬性的有: compatible、地址address、中斷interrupt			[2]. ARM Linux內核定義好的,一類設備通用的有默認意義的屬性不能被內核自動解析生成相應的設備信息,但是內核已經編寫了相應的解析提取函數。		常見屬性的有: MAC地址、 GPIO、 clock ...
Compatible屬性:用於匹配設備節點和設備驅動的屬性,規則是驅動設備ID表中的compatible域的值(字符串),和設備樹中設備節點中的compatible屬性值完全一致。
		compatible=“廠商名,設備名” ;
platform_driver--->>>struct 
device_driver driver;
struct of_device_id{	
char	compatible[128];      //用來和設備樹中的
compatible屬性進行匹配	
kernel_ulong_t data;#endif};

地址屬性:
reg 描述地址表
#address-cells:描述子節點reg屬性值的地址表中首地址元素的數量
#size-cells :描述子節點reg屬性值的地址表中地址長度元素的數量
GPIO屬性:
gpio-controller:說明該節點描述的是一個gpio控制器
#gpio-cells:描述gpio使用節點的屬性一個cell的內容屬性名=<&引用GPIO節點別名 GPIO標號 工作模式>;
eg: gpios = <&gpx0 1 1> ;

中斷屬性:Documentation/devicetree/bindings/interrupt-controller/interrupts.txtDocumentation/devicetree/bindings/interrupt-controller/arm,gic.txt
interrupt-controller 一個空屬性用來聲明這個node接收中斷信號#interrupt-cells 這是中斷控制器節點的屬性,用來標識這個控制器需要幾個單位做中斷描述符interrupt-parent 標識此設備節點屬於哪一個中斷控制器,如果沒有設置這個屬性,會自動依附父節點的interrupts 一箇中斷標識符列表,表示每一箇中斷輸出信號
驅動代碼中如何從設備樹上獲取設備信息:
/描述設備節點相關信息的結構體/
struct device_node {
const char *name; //名字
const char *type; //類型
char *full_name; //節點全名
};
//1.獲取節點struct device_node *of_find_node_by_name(struct device_node *from,const char *name);功能:通過節點名字查詢獲取節點參數: @from 查找的時候,從from節點開始向下查找,如果傳NULL,從根節點開始查找 @name 節點名返回值:成功返回節點結構體指針,失敗返回NULL
struct device_node *of_find_node_by_type(struct device_node *from,const char *type);
功能:通過節點類型查詢獲取節點
參數:
@from 查找的時候,從from節點開始向下查找,如果傳NULL,從根節點開始查找
@type 節點類型 device_type = “mydemo”;返回值:成功返回節點結構體指針,失敗返回NULL

struct device_node *of_find_node_by_path(const char *path);
功能:通過路徑來查找
參數:    @path	節點路徑
返回值:成功返回節點結構體指針,失敗返回NULL

//2.獲取屬性值
int of_property_read_u32_array(const struct device_node *np,const char *propname,\
u32 *out_values, size_t sz)
功能:獲取無符號32位整型數組值
參數:
@np 設備節點結構體指針
@propname 屬性名
@out_values 存放u32類型數據的地址(定義一個u32類型的數組,將數組首地址傳遞過 來)
@sz 獲取數組元素的個數

int of_property_read_string(struct device_node *np, const char *propname,const char **out_string)
功能:獲取字符串屬性值
參數:
@np 設備節點結構體指針
@propname 屬性名
@out_string 存放字符串地址的變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章