a. 某個設備要使用中斷, 需要在設備樹中如何描述中斷?
想使用中斷,節點中至少有有2個屬性:
interrupts // 表示要使用哪一個中斷, 中斷的觸發類型等等。
interrupt-parent // 這個中斷要接到哪一個設備去? 即父中斷控制器是誰
父中斷控制器有兩種指定方法:
1)只有一箇中斷父設備
interrupt-parent = <&父設備標號>;
interrupts = <... ...>, <... ...>;
ethernet@20000000 {
compatible = "davicom,dm9000";
reg = <0x20000000 0x2 0x20000004 0x2>;
interrupt-parent = <&gpf>; //父中斷控制器爲gpf
interrupts = <7 IRQ_TYPE_EDGE_RISING>;
local-mac-address = [00 00 de ad be ef];
davicom,no-eeprom;
};
2)有多箇中斷父設備
interrupts-extended = <&父設備標號 .....>, <... ... ...>;
buttons {
compatible = "jz2440_button";
eint-pins = <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>;
interrupts-extended = <&intc 0 0 0 3>,
<&intc 0 0 2 3>,
<&gpg 3 3>,
<&gpg 11 3>;
};
b. 上述的interrupts屬性用多少個u32來表示?
由它的父中斷控制器來描述,在父中斷控制器中, 至少有2個屬性:
interrupt-controller; // 表示自己是一箇中斷控制器
#interrupt-cells // 表示自己的子設備裏應該用幾個U32的數據來描述中斷
例如:
gpf {
gpio-controller;
#gpio-cells = <0x2>;
interrupt-controller;
#interrupt-cells = <0x2>; //使用兩個u32數據來描述中斷
phandle = <0x6>;
};
c.如何找到一個子中斷節點的父中斷控制器
一般在描述子中斷節點中都會有一個屬性interrupt-parent,由此屬性描述。
如果子中斷節點中沒有此屬性,需要查看此節點的父節點,一級一級往上直到父節點中出現interrupt-parent。
d.interrupts屬性的具體含義
interrupts屬性的具體含義由各自的父中斷控制器來解釋
s3c2440中有一個主中斷控制器,一個子中斷控制器,以及一個外部中斷控制器(EINTPEND)。下面截取了這些中斷控制器的一些圖,用來說明每個bit代表哪個中斷。
主中斷控制器
副中斷控制器
副中斷控制器
設備樹中的ctrl_irq實際上指的就是各個中斷控制器上的對應位。
一個例子:
jz2440ts@5800000 {
compatible = "jz2440,ts";
reg = <0x58000000 0x100>;
reg-names = "adc_ts_physical";
<連接到副中斷控制器 父中斷號31 副中斷中的bit9 bit10 觸發類型爲3>
interrupts = <1 31 9 3>, <1 31 10 3>;
interrupt-names = "int_ts", "int_adc_s";
clocks = <&clocks PCLK_ADC>;
clock-names = "adc";
};
例子中是一個描述觸摸設備的節點,節點內並沒有指定interrupt-parent,我們可以使用之前提到的方法去找。實際上此節點的父中斷控制器爲主中斷控制器。
關於interrupts屬性的描述可以在linux-4.19-rc3\Documentation\devicetree\bindings\interrupt-controller\samsung,s3c24xx-irq.txt中找到。
- #interrupt-cells : Specifies the number of cells needed to encode an
interrupt source. The value shall be 4 and interrupt descriptor shall
have the following format:
<ctrl_num parent_irq ctrl_irq type>
<連接的中斷控制器 父中斷號 中斷所佔位 中斷觸發類型>
ctrl_num contains the controller to use:
- 0 ... main controller
- 1 ... sub controller
- 2 ... second main controller on s3c2416 and s3c2450
parent_irq contains the parent bit in the main controller and will be
ignored in main controllers
ctrl_irq contains the interrupt bit of the controller
type contains the trigger type to use
結合着上述文檔內的描述,我們可以知道觸摸屏節點裏的對應的中斷是連接到副中斷控制器,父中斷號31,屬於副中斷中的bit9 bit10,觸發類型爲3。查看芯片手冊後可知這兩個中斷爲INT_TC,INT_ADC_S。
另一個例子:
ethernet@20000000 {
compatible = "davicom,dm9000";
reg = <0x20000000 0x2 0x20000004 0x2>;
interrupt-parent = <&gpf>; //父中斷控制器爲gpf
//中斷位bit7
interrupts = <7 IRQ_TYPE_EDGE_RISING>;
local-mac-address = [00 00 de ad be ef];
davicom,no-eeprom;
};
這是一個描述網卡的設備樹節點,它的父節點爲gpf。GPF是一個外部中斷,關於它子節點的中斷描述在linux-4.19-rc3\Documentation\devicetree\bindings\pinctrl\samsung-pinctrl.txt中找到。
- interrupt-controller: identifies the controller node as interrupt-parent.
- #interrupt-cells: the value of this property should be 2.
- First Cell: represents the external gpio interrupt number local to the
external gpio interrupt space of the controller.
- Second Cell: flags to identify the type of the interrupt
- 1 = rising edge triggered
- 2 = falling edge triggered
- 3 = rising and falling edge triggered
- 4 = high level triggered
- 8 = low level triggered
#define IRQ_TYPE_NONE 0
#define IRQ_TYPE_EDGE_RISING 1
#define IRQ_TYPE_EDGE_FALLING 2
#define IRQ_TYPE_EDGE_BOTH (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING)
#define IRQ_TYPE_LEVEL_HIGH 4
#define IRQ_TYPE_LEVEL_LOW 8
結合文檔可知,中斷引腳爲GPF7,使用的是EINT7,並且觸摸沿是上升沿觸發。
IRQ_TYPE_EDGE_RISING定義在linux-4.19-rc3\include\dt-bindings\interrupt-controller\irq.h內。