wordpress的.htaccess北京優(yōu)化seo
書接上回:Linux驅(qū)動(dòng)開發(fā)—設(shè)備樹基本概念,語法詳解-CSDN博客
文章目錄
- 使用設(shè)備樹描述中斷
- 使用設(shè)備樹描述CPU節(jié)點(diǎn)
- CPU 節(jié)點(diǎn)
- 緩存節(jié)點(diǎn)
- 總結(jié)
- 使用設(shè)備樹描述時(shí)鐘
- 總結(jié)
- 使用設(shè)備樹描述GPIO
- 示例設(shè)備樹節(jié)點(diǎn)
- 逐行解析
- GPIO 單元
使用設(shè)備樹描述中斷
在NXP 官方中截取部分設(shè)備樹源碼分析為例。
gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio\0fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <0x02>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <0x02>;linux,phandle = <0xea>;phandle = <0xea>;
};
分析中斷信息,主要關(guān)注以下幾種字段;
interrupts
: 定義與此GPIO控制器相關(guān)的中斷屬性。
0x00
: 中斷類型。0x8a
: 中斷號。0x04
: 中斷觸發(fā)類型,通常表示上升沿觸發(fā)。
interrupt-controller
: 表示這是一個(gè)中斷控制器節(jié)點(diǎn)。interrupt-controller
屬性是一個(gè)布爾屬性,用于標(biāo)識該節(jié)點(diǎn)是一個(gè)中斷控制器。它不需要賦值,只要在節(jié)點(diǎn)中聲明即可。操作系統(tǒng)在解析設(shè)備樹時(shí),會識別該節(jié)點(diǎn)為一個(gè)中斷控制器,從而應(yīng)用相應(yīng)的處理邏輯。
#interrupt-cells
: 定義中斷描述的單元數(shù)量,這里為2。在設(shè)備樹中,每個(gè)中斷源都需要一個(gè)描述,用于向操作系統(tǒng)傳達(dá)如何配置和處理該中斷源。
中斷也可能是多級引用—中斷控制器的級聯(lián),如下源碼所示
interrupt-controller@51a00000 {compatible = "arm,gic-v3";reg = <0x00 0x51a00000 0x00 0x10000 0x00 0x51b00000 0x00 0xc0000 0x00 0x52000000 0x00 0x2000 0x00 0x52010000 0x00 0x1000 0x00 0x52020000 0x00 0x20000>;#interrupt-cells = <0x03>;interrupt-controller;interrupts = <0x01 0x09 0x3f04>;interrupt-parent = <0x01>;linux,phandle = <0x01>;phandle = <0x01>;};mu@5d1c0000 {compatible = "fsl,imx8-mu";reg = <0x00 0x5d1c0000 0x00 0x10000>;interrupts = <0x00 0xb1 0x04>;interrupt-parent = <0x01>;fsl,scu_ap_mu_id = <0x00>;status = "okay";};
interrupt-parent
: 指向父中斷控制器的引用,值為0x01
。
interrupts
: 定義與此消息單元相關(guān)的中斷屬性。
0x00
: 中斷類型。0xb1
: 中斷號。0x04
: 中斷觸發(fā)類型(通常表示上升沿觸發(fā))。
interrupt-controller
: 表示這是一個(gè)中斷控制器節(jié)點(diǎn)。
#interrupt-cells
: 定義中斷描述的單元數(shù)量,這里為3。表示每個(gè)中斷描述需要三個(gè)單元。
- 第一個(gè)單元:中斷類型或源。
- 第二個(gè)單元:中斷號。
- 第三個(gè)單元:中斷觸發(fā)類型或標(biāo)志。
使用設(shè)備樹描述CPU節(jié)點(diǎn)
每個(gè)CPU節(jié)點(diǎn)包含了描述該CPU核心的屬性,例如兼容性、寄存器地址、時(shí)鐘頻率等。以NXP IMX8QM為例
cpus {#address-cells = <0x02>;#size-cells = <0x00>;idle-states {entry-method = "psci";cpu-sleep {compatible = "arm,idle-state";arm,psci-suspend-param = <0x00>;entry-latency-us = <0x2bc>;exit-latency-us = <0xfa>;min-residency-us = <0x3e8>;};cluster-sleep {compatible = "arm,idle-state";arm,psci-suspend-param = <0x1000000>;entry-latency-us = <0x3e8>;exit-latency-us = <0x2bc>;min-residency-us = <0xa8c>;wakeup-latency-us = <0x5dc>;};};cpu@0 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x00>;enable-method = "psci";next-level-cache = <0x02>;operating-points = <0x124f80 0x00 0x10d880 0x00 0xdbba0 0x00 0x927c0 0x00>;clocks = <0x03 0x01>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x6e>;phandle = <0x6e>;};cpu@1 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x01>;enable-method = "psci";next-level-cache = <0x02>;};cpu@2 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x02>;enable-method = "psci";next-level-cache = <0x02>;};cpu@3 {device_type = "cpu";compatible = "arm,cortex-a53";reg = <0x00 0x03>;enable-method = "psci";next-level-cache = <0x02>;};l2-cache0 {compatible = "cache";linux,phandle = <0x02>;phandle = <0x02>;};cpu@100 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x100>;enable-method = "psci";next-level-cache = <0x04>;operating-points = <0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00>;clocks = <0x03 0x03>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x05>;phandle = <0x05>;};cpu@101 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x101>;enable-method = "psci";next-level-cache = <0x04>;linux,phandle = <0x06>;phandle = <0x06>;};l2-cache1 {compatible = "cache";linux,phandle = <0x04>;phandle = <0x04>;};};
CPU 節(jié)點(diǎn)
cpus節(jié)點(diǎn)里面包含物理CPU布局,也就是CPU的布局全部在此節(jié)點(diǎn)下描述
注:有些設(shè)備樹中描述大小核CPU,必須要用cpu-map,使用Cluster描述同一類型CPU,但是NXP中沒有使用這種命名命名方式,但是也將大小核心分開描述了
第一個(gè)簇 (Cluster) 的 CPU 節(jié)點(diǎn)
cpu@0
到 cpu@3
: 定義四個(gè) Cortex-A53 CPU核心。
device_type
: 設(shè)備類型為cpu
。compatible
: 兼容屬性,標(biāo)識為arm,cortex-a53
。reg
: CPU的地址單元,分別為0x00 0x00
,0x00 0x01
,0x00 0x02
,0x00 0x03
。enable-method
: 啟用方法為psci
。next-level-cache
: 下一層緩存的引用,值為0x02
。operating-points
: 操作點(diǎn),包含頻率和電壓對。clocks
: 時(shí)鐘源。clock-latency
: 時(shí)鐘延遲,值為0xee6c
。#cooling-cells
: 冷卻單元的數(shù)量,值為0x02
。linux,phandle
和phandle
: 句柄,用于唯一標(biāo)識該節(jié)點(diǎn)。
第二個(gè)簇 (Cluster) 的 CPU 節(jié)點(diǎn)
cpu@100 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x100>;enable-method = "psci";next-level-cache = <0x04>;operating-points = <0x185a60 0x00 0x13c680 0x00 0x101d00 0x00 0x927c0 0x00>;clocks = <0x03 0x03>;clock-latency = <0xee6c>;#cooling-cells = <0x02>;linux,phandle = <0x05>;phandle = <0x05>;};cpu@101 {device_type = "cpu";compatible = "arm,cortex-a72\0arm,armv8";reg = <0x00 0x101>;enable-method = "psci";next-level-cache = <0x04>;linux,phandle = <0x06>;phandle = <0x06>;};
cpu@100
和 cpu@101
: 定義兩個(gè) Cortex-A72 CPU核心。
device_type
: 設(shè)備類型為cpu
。compatible
: 兼容屬性,標(biāo)識為arm,cortex-a72
和arm,armv8
。reg
: CPU的地址單元,分別為0x00 0x100
和0x00 0x101
。enable-method
: 啟用方法為psci
。next-level-cache
: 下一層緩存的引用,值為0x04
。operating-points
: 操作點(diǎn),包含頻率和電壓對。clocks
: 時(shí)鐘源。clock-latency
: 時(shí)鐘延遲,值為0xee6c
。#cooling-cells
: 冷卻單元的數(shù)量,值為0x02
。linux,phandle
和phandle
: 句柄,用于唯一標(biāo)識該節(jié)點(diǎn)。
緩存節(jié)點(diǎn)
l2-cache0 {compatible = "cache";linux,phandle = <0x02>;phandle = <0x02>;};l2-cache1 {compatible = "cache";linux,phandle = <0x04>;phandle = <0x04>;};
l2-cache0
和 l2-cache1
: 定義兩個(gè)二級緩存(L2緩存)。
compatible
: 兼容屬性,標(biāo)識為cache
。linux,phandle
和phandle
: 句柄,用于唯一標(biāo)識該節(jié)點(diǎn)。
總結(jié)
這段設(shè)備樹描述了一個(gè)含有兩個(gè)簇(Cluster)的多核系統(tǒng),其中第一個(gè)簇包含四個(gè)Cortex-A53 CPU核心,第二個(gè)簇包含兩個(gè)Cortex-A72 CPU核心。每個(gè)CPU節(jié)點(diǎn)包含兼容性、寄存器地址、啟用方法、時(shí)鐘、操作點(diǎn)等屬性。還定義了兩個(gè)二級緩存節(jié)點(diǎn),并描述了系統(tǒng)的空閑狀態(tài)。這樣,操作系統(tǒng)可以根據(jù)設(shè)備樹信息正確地初始化和管理各個(gè)CPU核心及其相關(guān)硬件。
使用設(shè)備樹描述時(shí)鐘
例如下方NXP源碼
prg@560c0000 {compatible = "fsl,imx8qm-prg";reg = <0x00 0x560c0000 0x00 0x10000>;clocks = <0x03 0x144 0x03 0x13b>;clock-names = "apb\0rtram";power-domains = <0x0f>;status = "okay";linux,phandle = <0x79>;phandle = <0x79>;};
時(shí)鐘屬性
clocks = <0x03 0x141 0x03 0x138>;
clock-names = "apb\0rtram";
clocks
: 指定設(shè)備所需的時(shí)鐘源。
<0x03 0x141>
: 時(shí)鐘控制器(索引為0x03
)中的時(shí)鐘索引0x141
。<0x03 0x138>
: 時(shí)鐘控制器(索引為0x03
)中的時(shí)鐘索引0x138
。
clock-names
: 為時(shí)鐘源命名。
"apb\0rtram"
: 兩個(gè)時(shí)鐘源的名稱分別是apb
和rtram
。
下一個(gè)例子:
i2c@56226000
節(jié)點(diǎn)描述了一個(gè) I2C 控制器的硬件信息,重點(diǎn)關(guān)注時(shí)鐘相關(guān)的屬性
i2c@56226000 {compatible = "fsl,imx8qm-lpi2c";reg = <0x00 0x56226000 0x00 0x1000>;interrupts = <0x08 0x04>;interrupt-parent = <0x8a>;clocks = <0x03 0x1d3 0x03 0x2f6>;clock-names = "per\0ipg";assigned-clocks = <0x03 0x1d3>;assigned-clock-rates = <0x16e3600>;power-domains = <0x8b>;status = "okay";#address-cells = <0x01>;#size-cells = <0x00>;pinctrl-names = "default";pinctrl-0 = <0x8c>;clock-frequency = <0x186a0>;};
時(shí)鐘屬性解析
clocks = <0x03 0x1d3 0x03 0x2f6>;
clock-names = "per\0ipg";
assigned-clocks = <0x03 0x1d3>;
assigned-clock-rates = <0x16e3600>;
clocks
屬性指定了該 I2C 控制器所依賴的時(shí)鐘源。
<0x03 0x1d3>
和 <0x03 0x2f6>
:
0x03
是時(shí)鐘控制器的引用(即時(shí)鐘控制器節(jié)點(diǎn))。0x1d3
和0x2f6
是時(shí)鐘控制器中不同的時(shí)鐘索引。
這表示該 I2C 控制器需要兩個(gè)時(shí)鐘源,分別位于時(shí)鐘控制器 0x03
的 0x1d3
和 0x2f6
索引處。
assigned-clocks
屬性指定要配置的時(shí)鐘源。在這個(gè)例子中,是 <0x03 0x1d3>
(即 per
時(shí)鐘)。
assigned-clock-rates
屬性定義了該時(shí)鐘的頻率,這里是 0x16e3600
,即 24MHz
。
總結(jié)
在驅(qū)動(dòng)開發(fā)過程中,不需要過多關(guān)注如何在設(shè)備樹中編寫時(shí)鐘信息,而是更應(yīng)該關(guān)注如何在驅(qū)動(dòng)代碼中獲取和解析這些時(shí)鐘信息。時(shí)鐘信息的具體內(nèi)容和配置通常由硬件工程師或系統(tǒng)工程師來編寫和驗(yàn)證。驅(qū)動(dòng)開發(fā)者通過設(shè)備樹提供的接口和 Linux 內(nèi)核的時(shí)鐘管理 API 來操作時(shí)鐘,而不需要深入了解時(shí)鐘的硬件實(shí)現(xiàn)細(xì)節(jié)。這種分工可以提高開發(fā)效率和代碼的可維護(hù)性。
使用設(shè)備樹描述GPIO
使用設(shè)備樹描述一個(gè) GPIO 控制器時(shí),需要定義該控制器的基本屬性,如兼容性、寄存器地址、中斷、GPIO 單元的數(shù)量等。以NXP源碼為例
gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <2>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <2>;linux,phandle = <0xea>;phandle = <0xea>;
};
使用設(shè)備樹描述一個(gè) GPIO 控制器時(shí),需要定義該控制器的基本屬性,如兼容性、寄存器地址、中斷、GPIO 單元的數(shù)量等。以下是一個(gè)描述 GPIO 控制器的示例:
示例設(shè)備樹節(jié)點(diǎn)
gpio@5d0a0000 {compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";reg = <0x00 0x5d0a0000 0x00 0x10000>;interrupts = <0x00 0x8a 0x04>;gpio-controller;#gpio-cells = <2>;power-domains = <0x10e>;interrupt-controller;#interrupt-cells = <2>;linux,phandle = <0xea>;phandle = <0xea>;
};
逐行解析
-
節(jié)點(diǎn)名稱和地址
gpio@5d0a0000 {
gpio@5d0a0000
:表示 GPIO 控制器節(jié)點(diǎn),其地址為0x5d0a0000
。
-
兼容性
compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";
compatible
屬性表示設(shè)備兼容的驅(qū)動(dòng),優(yōu)先級從左到右。
-
寄存器地址
reg = <0x00 0x5d0a0000 0x00 0x10000>;
reg
屬性定義設(shè)備的寄存器地址范圍。這里表示起始地址0x5d0a0000
,大小為0x10000
字節(jié)。
-
中斷
interrupts = <0x00 0x8a 0x04>;
interrupts
屬性定義設(shè)備使用的中斷。0x00
表示中斷類型,0x8a
是中斷號,0x04
是中斷觸發(fā)方式。
-
GPIO 控制器標(biāo)志
gpio-controller; #gpio-cells = <2>;
gpio-controller
屬性表示這是一個(gè) GPIO 控制器。#gpio-cells
屬性定義每個(gè) GPIO 描述的單元數(shù),這里為2
。
-
電源域
power-domains = <0x10e>;
power-domains
屬性指定該設(shè)備所屬的電源域。
-
中斷控制器標(biāo)志
interrupt-controller; #interrupt-cells = <2>;
interrupt-controller
屬性表示這是一個(gè)中斷控制器。#interrupt-cells
屬性定義每個(gè)中斷描述的單元數(shù),這里為2
。
-
phandle
linux,phandle = <0xea>; phandle = <0xea>;
linux,phandle
和phandle
屬性是節(jié)點(diǎn)的唯一標(biāo)識符,用于引用該節(jié)點(diǎn)。
GPIO 單元
在設(shè)備樹中,#gpio-cells
屬性用于定義 GPIO 控制器節(jié)點(diǎn)中的 GPIO 單元(cells)的數(shù)量和結(jié)構(gòu)。這些單元描述了 GPIO 控制器的每個(gè) GPIO 引腳的特性和配置。在具體應(yīng)用中,GPIO 單元通常用于描述某個(gè)設(shè)備連接到的特定 GPIO 引腳及其配置方式。
常見的單元包括:
- GPIO 引腳編號:GPIO 控制器中引腳的編號。
- 標(biāo)志(flags):通常表示 GPIO 的輸入/輸出方向、上拉/下拉配置等。
在這個(gè)例子中,#gpio-cells = <2>;
表示每個(gè) GPIO 引腳用兩個(gè)單元來描述。
具體使用示例**—萬年不變的點(diǎn)一個(gè)LED燈**
假設(shè)有一個(gè)LED燈連接到某個(gè) GPIO 引腳,可以這么描述這個(gè)LED燈
led {compatible = "led_dev";gpios = <&gpio1 5 0>;
};
這里,gpios
屬性定義了一個(gè)連接到 GPIO 控制器的 GPIO 引腳,使用了三個(gè)參數(shù):
- GPIO 控制器的 phandle:
&gpio1
是一個(gè)指向 GPIO 控制器節(jié)點(diǎn)的引用。指定哪個(gè) GPIO 控制器負(fù)責(zé)管理該引腳。 - GPIO 引腳編號:
5
表示 GPIO 控制器中的第 5 號引腳。 - 標(biāo)志(flags):
0
表示無特殊標(biāo)志(通常用于表示 GPIO 引腳的配置,如輸入/輸出方向等)。標(biāo)志的具體定義依賴于平臺和 GPIO 控制器的實(shí)現(xiàn)。