裝置樹開發

2021-09-29 18:42:54 字數 3175 閱讀 1604

裝置樹描述的資訊包括:cpu的數量和類別、記憶體基位址和大小、匯流排和橋、外設連線、中斷控制器和中斷使用情況、gpio控制器和gpio使用情況、clock控制器和clock使用情況。

以上資訊被儲存在乙個ascii檔案中,類似於xml檔案,在arm linux中,乙個.dts檔案對應乙個arm的machine放置在核心的arch/arm/boot/dts目錄。

裝置樹檔案用於作業系統中描述硬體,不需要對裝置資訊進行硬編碼。

描述的每個資訊體由被命名的結點和屬性組成,並且結點本身可包含子結點。屬性即為成對出現的name和value。

裝置樹原始檔dts被編譯成dtb二進位制檔案,在bootloader執行時傳遞給作業系統,作業系統在對其進行展開為二叉樹結構,從而產生乙個硬體裝置的拓撲圖,有了該拓撲圖,在程式設計過程中可以直接通過系統提供的介面獲取到裝置樹中的結點和屬性資訊。

編譯工具:dtc,源**位於核心 /scripts/dtc目錄,在核心使能了device tree情況下,編譯核心的時候主機工具dtc會被編譯出來。在linux核心的arch/arm/boot/dts/makefile中,描述了當某種soc被選中後,哪些.dtb檔案會被編譯出來,如與exynos對應的.dtb包括:

dtb-$(config_arch_exynos) += exynos4210-origen.dtb \ exynos-smdkv310.dtb \ exynos4412-origen.dtb\

config_arch_exynos 變數在.config檔案中指定

dtsi為通用**,類似標頭檔案可包含在其他檔案中,include 「xx.dtsi」

傳遞給bootloader,在載入核心時對裝置樹檔案進行展開二叉樹,並將裝置註冊入核心。

dt:device tree 裝置樹

fdt:flattened device tree 展開後的裝置樹,二叉樹結構

of:open firmware 開發韌體庫

dts:配置檔案

dtsi:可以包含的裝置樹配置檔案

dtb:裝置樹二進位制檔案

dtc:裝置樹編譯工具

文字字串(雙引號):" *** 「; 無結束符

32位無符號整數(尖括號):< xx xx xx >; 可多個

二進位制資料(方括號):[ xx xx xx ]; 可多個

多型別資料(逗號連在一起):」 xx 「, [ xx xx ], < xx xx xx >;

字串列表:」 xx ", " xx ";

包含:#include 「***.dtsi」

節點名稱:< 名字 [@《裝置位址》] >,方括號為可選填內容,名字不超過31位簡單ascii字串。裝置位址填對應暫存器位址,也可以填其他用於區分同一名字不同功能節點的區分,例如1-10序號。

compatible屬性:用於決定使用哪個裝置驅動來繫結,乙個字串列表,格式為" 《製造商》,《型號》 ",可以為多個,其餘字元表示其他與之相容的裝置

#address-cells與#size-cells:表示指定子結點的reg格式,address-cells指定位址列表大小,而size-cells表示長度列表大小。例如#address-cells = <2>, #size-cells = <1>;則reg = <0x11 0x22 0x100>表示0x11為位址1,0x22為位址2,0x100為這兩個位址對應的大小空間。

記憶體對映裝置:一般具有位址範圍,對於32位位址可用1個cell來指定位址值和乙個cell指定範圍值。而對於64位則應該為2個cell指定位址值,因為資料技能記錄無符號整型32位。還有一種為基位址、偏移和長度,也是用2個cell來指定位址值。

非記憶體對映裝置:沒有被對映到cpu的儲存器匯流排上,雖然可有乙個位址範圍,但不是由cpu直接訪問,而是父裝置驅動程式代表cpu執行間接訪問,例如i2c的從裝置位址,通過i2c控制器傳送位址來匹配從裝置,該位址並不存在cpu儲存器匯流排上。

範圍(位址轉換):根結點的位址空間是從cpu的視角進行描述的,根結點的直接子結點使用的也是這個位址域,非根結點的直接子結點就沒有使用這個位址域,於是需要把這個位址進行轉換,rangs這個屬性就用於此目的。即實現子結點和父結點使用一樣的位址域

描述中斷的四個屬性:

interrupt-controler:乙個空屬性,定義該結點為乙個接受中斷的裝置,即中斷控制器。

#interrupt-cells:乙個中斷控制器結點的屬性,宣告該控制器的中斷指示符中cell格式。

interrupt-parents:乙個裝置結點的屬性,指向裝置所連線的中斷控制器。

interrupt:乙個裝置結點的屬性,含乙個中斷指示符的列表,對應該裝置的每乙個中斷輸出訊號。

中斷指示符:第乙個 cell為中斷型別:0 spi / 1 ppi / 2 irq;第二個cell為中斷號:spi[0-987] / ppi[0-15] irq[看手冊]; 第三個為觸發方式: 1表示上公升沿,2下降沿,4高電平,8低電平,而可以用巨集定義。

aliases:用於結點的別名,例如aliases 指定spi_0的別名為spi0.

chosen:結點並不代表真正的裝置,而是乙個為韌體和作業系統傳遞資料的地方,例如引導引數bootargs。

核心載入裝置樹檔案生成樹狀結構,並且在目錄/proc/device-tree中檢視載入的結點。

of韌體庫提供的函式位於drivers/of目錄下,常用的有以下:

根據device_node結構的full_name引數,在全域性鍊錶of_allnodes中查詢適合的device_node

struct device_node *of_find_node_by_path

struct device_node *of_find_node_by_name

根據property結構的name引數,在指定的device_node中查詢適合的property屬性

struct property *of_find_property

根據compat引數與device_node的compatible匹配,返回匹配度

int of_device_is_compatible

獲得父節點

struct device_node *of_get_parent

根據屬性名propname,讀出該屬性的陣列中sz個屬性值給out_values

int of_property_read_u32_array

讀取該裝置的第index個irq號

unsigned

int irq_or_parse_and_map

linux字元裝置驅動開發之裝置樹 2

裝置樹描述了裝置的詳細資訊 比如reg 暫存器位址 編寫驅動的目的在於獲取這些資訊.linux提供了一些of函式讀取這些資訊,include linux of.h.查詢節點相關函式 裝置節點 struct device node 通過節點名查詢指定的節點 from 節點,若為null,則從根節點查起...

linux裝置樹(裝置驅動)

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

裝置樹學習(二)(裝置樹的規範)

dts v1 memory reservations 格式為 memreserve 從上面檔案布局我們能看到大概分為以下幾部分,我們依次介紹 1 dts v1 表示dts檔案的版本 2 memory reservations 格式為 memreserve 表示留給自己使用的記憶體。即核心不能使用這部...