什么是設備樹?
設備樹(Device Tree)是一種用于描述嵌入式系統(tǒng)硬件組件及其連接關系的數據結構。它被廣泛用于嵌入式 Linux 系統(tǒng),尤其是針對使用多種不同架構和平臺的嵌入式系統(tǒng)。它是一種與硬件描述相關的中間表示形式,將硬件信息抽象成一種可移植的格式,使得操作系統(tǒng)和引導加載程序能夠在不同的硬件平臺上運行,而無需硬編碼特定的硬件配置信息。
樹狀結構:設備樹是一個層次結構,由節(jié)點和屬性組成。節(jié)點可以有子節(jié)點,形成樹狀結構。
節(jié)點類型:設備節(jié)點(device node)描述硬件組件,屬性(property)提供有關硬件配置的詳細信息。
設備樹的主要作用包括:
描述硬件設備信息:將硬件設備的屬性和配置信息以標準格式描述出來,包括設備類型、地址、中斷等。
實現硬件平臺的可移植性:將硬件描述與操作系統(tǒng)和引導加載程序分離,使得相同的軟件可以在不同的硬件平臺上運行。
簡化內核配置和維護:通過設備樹,內核可以動態(tài)地識別和管理硬件設備,而不需要硬編碼在內核中,簡化了內核的配置和維護工作。
設備樹的一些知識點
DTS、DTB 和 DTC區(qū)別
DTS 是設備樹源碼文件,DTB 是將DTS 編譯以后得到的二進制文件。將.dts 編譯為.dtb需要用到 DTC 工具,DTC 工具源碼在 Linux 內核的 scripts/dtc 目錄下。
在arch/arm/boot/dts/Makefile
dtb-$(CONFIG_SOC_IMX6SLL) += \
imx6sll-lpddr2-arm2.dtb \
imx6sll-lpddr3-arm2.dtb \
在此處添加自己的設備樹文件
要編譯 DTS 文件的話只需要進入到 Linux 源碼根目錄下,然后執(zhí)行如下命令:
make all
#或者
make dtbs
和 C 語言一樣,設備樹也支持頭文件,設備樹的頭文件擴展名為.dtsi,.dtsi 文件用于描述 SOC 的內部外設信息,比如 CPU 架構、主頻、外設寄存器地址范圍。比如串口,SPI等等。imx6ull.dtsi文件部分內容如下
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"
/ {
aliases {
can0 = &flexcan1;
can1 = &flexcan2;
ethernet0 = &fec1;
ethernet1 = &fec2;
gpio0 = &gpio1;
gpio1 = &gpio2;
gpio2 = &gpio3;
gpio3 = &gpio4;
gpio4 = &gpio5;
i2c0 = &i2c1;
i2c1 = &i2c2;
i2c2 = &i2c3;
i2c3 = &i2c4;
mmc0 = &usdhc1;
mmc1 = &usdhc2;
serial0 = &uart1;
serial1 = &uart2;
serial2 = &uart3;
serial3 = &uart4;
serial4 = &uart5;
serial5 = &uart6;
serial6 = &uart7;
serial7 = &uart8;
spi0 = &ecspi1;
spi1 = &ecspi2;
spi2 = &ecspi3;
spi3 = &ecspi4;
usbphy0 = &usbphy1;
usbphy1 = &usbphy2;
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
clock-latency = <61036>; /* two CLK32 periods */
operating-points = <
/* kHz uV */
996000 1275000
792000 1225000
528000 1175000
396000 1025000
198000 950000
>;
fsl,soc-operating-points = <
/* KHz uV */
996000 1175000
792000 1175000
528000 1175000
396000 1175000
198000 1175000
>;
fsl,low-power-run;
clocks = <&clks IMX6UL_CLK_ARM>,
<&clks IMX6UL_CLK_PLL2_BUS>,
<&clks IMX6UL_CLK_PLL2_PFD2>,
<&clks IMX6UL_CA7_SECONDARY_SEL>,
<&clks IMX6UL_CLK_STEP>,
<&clks IMX6UL_CLK_PLL1_SW>,
<&clks IMX6UL_CLK_PLL1_SYS>,
<&clks IMX6UL_PLL1_BYPASS>,
<&clks IMX6UL_CLK_PLL1>,
<&clks IMX6UL_PLL1_BYPASS_SRC>,
<&clks IMX6UL_CLK_OSC>;
clock-names = "arm", "pll2_bus", "pll2_pfd2_396m", "secondary_sel", "step",
"pll1_sw", "pll1_sys", "pll1_bypass", "pll1", "pll1_bypass_src", "osc";
};
};
....
設備節(jié)點
設備節(jié)點是Linux系統(tǒng)中一個重要的概念,它是用戶程序和內核驅動之間的紐帶。設備節(jié)點通常位于/dev目錄下,并以文件的形式存在,每個設備節(jié)點都對應著一個特定的設備。通過打開設備節(jié)點,用戶程序可以獲取設備的句柄,從而與設備進行通信和控制。
標準屬性
節(jié)點是由一堆的屬性組成,節(jié)點都是具體的設備,不同的設備需要的屬性不同,用戶可以自定義屬性。除了用戶自定義屬性,有很多屬性是標準屬性。
compatible 屬性
compatible 屬性也叫做“兼容性”屬性,這是重要的屬性。compatible 屬性的值是一個字符串列表,compatible 屬性用于將設備和驅動綁定起來。格式如下
"manufacturer,model"
I.MX6U-ALPHA 開發(fā)板上的音頻芯片采用的歐勝(WOLFSON)出品的 WM8960,sound 節(jié)點的 compatible 屬性值如下:
compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
model 屬性
model 屬性值也是一個字符串,一般 model 屬性描述設備模塊信息。
model = "wm8960-audio";
status 屬性
status 屬性是和設備狀態(tài)有關的,status 屬性值也是字符串。
值 | 描述 |
---|---|
disabled | 表明設備是可操作的 |
okay | 表明設備當前是不可操作的,但是在未來可以變?yōu)榭刹僮鞯模热鐭岵灏卧O備插入以后。至于 disabled 的具體含義還要看設備的綁定文檔 |
fail | 表明設備不可操作,設備檢測到了一系列的錯誤,而且設備也不大可能變得可操作。 |
fail-sss | 含義和“fail”相同,后面的 sss 部分是檢測到的錯誤內容 |
reg 屬性 | |
reg 屬性的值一般是(address,length)對。reg 屬性一般用于描述設備地址空間資源信息,一般都是某個外設的寄存器地址范圍信息。 |
ranges 屬性
ranges屬性值可以為空或者按照(child-bus-address,parent-bus-address,length)格式編寫的數字矩陣。
ranges 屬性每個項目由子地址、父地址和地址空間長度
這三部分組成:child-bus-address:子總線地址空間的物理地址,由父節(jié)點的#address-cells 確定此物理地址所占用的字長。parent-bus-address:父總線地址空間的物理地址,同樣由父節(jié)點的#address-cells 確定此物理地址所占用的字長。length:子地址空間的長度,由父節(jié)點的#size-cells 確定此地址長度所占用的字長。文章來源:http://www.zghlxwxcb.cn/news/detail-835001.html
在Linux設備樹中增加設備節(jié)點的步驟通常包括以下幾個步驟:
確定設備信息:包括設備的名稱、兼容性、模型等。這些信息通常在設備規(guī)格書或數據手冊中可以找到。
編輯設備樹源文件:設備樹的信息通常存儲在一個設備樹源文件(.dts)中。你需要打開這個文件,并在適當的位置添加你的設備節(jié)點。設備節(jié)點通常包含設備的名稱、兼容性、模型以及任何特定于設備的屬性或子節(jié)點。
編譯設備樹:一旦你添加了設備節(jié)點并保存了設備樹源文件,你需要使用設備樹編譯器(dtc)將其編譯為設備樹二進制文件(.dtb)。這個文件可以在引導時被內核使用。
更新引導加載程序:需要將新的設備樹二進制文件添加到引導加載程序(如U-Boot)的配置中,以便在引導時加載它。具體的步驟取決于你使用的引導加載程序。
更新內核配置:可能還需要更新內核的配置,以啟用對新設備的支持。這通常涉及編輯內核配置文件(.config),然后重新編譯內核。
測試:最后,需要在目標硬件上測試更改,以確保新設備能夠正確識別并工作。文章來源地址http://www.zghlxwxcb.cn/news/detail-835001.html
到了這里,關于嵌入式linux驅動開發(fā)篇之設備樹的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!