在設備樹中描述中斷

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內。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章