Linux 裝置樹基本簡介

2021-10-03 17:01:18 字數 3536 閱讀 9644

一:基本簡介

裝置作用:提供裝置資訊

裝置樹(device tree)是一種描述硬體的資料結構在作業系統引導階段進行裝置初始化的時候,資料結構中的硬體資訊被檢測並傳遞給作業系統

裝置樹: 裝置樹原始檔(***x.dts) —dtc—>>> 裝置樹二進位制檔案(***x.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

;

位址屬性:

reg 描述位址表

#address-cells:描述子節點reg屬性值的位址表中首位址元素的數量

#size-cells :描述子節點reg屬性值的位址表中位址長度元素的數量

gpio屬性:

gpio-controller:說明該節點描述的是乙個gpio控制器

#gpio-cells:描述gpio使用節點的屬性乙個cell的內容屬性名=

eg: gpios = ;

中斷屬性: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 ;

//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 存放字串位址的變數

基本裝置型別簡介

linux 將裝置分成三種基本型別,分別概述如下 1 字元裝置 字元裝置是個能像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置驅動程式通常至少要實現 open close read 和 write 系統呼叫。字元終端 dev console 和串列埠 dev tty...

linux裝置樹(裝置驅動)

一 裝置樹的簡單概念 裝置樹 由一系列的節點,屬性組成,節點本身包含子節點 屬性 成對出現的名稱和值 裝置樹可描述的資訊 原先大多數被編碼在核心中 它是電路板上cpu,匯流排,裝置組成的樹,bootloader會將這棵樹傳遞給核心,並根據它展開linux核心中的platform device等裝置。...

linux裝置樹及裝置新增

要點 裝置樹概念 傳統方式新增裝置 方式 arm mach mach s3c2410 mach s3c2440.c 在 裡面新增裝置描述符並有machine init時呼叫新增 新方式新增裝置 方式 增加獨有的檔案 dts 專門來描述硬體資訊,由系統最終解析出裝置樹,並一一新增入核心 有點 完全分離...