2014-10-29 30 views
2

我有兩個不同的設備樹源代碼片段。讀取具有中斷屬性的設備樹節點

UART1: [email protected] { 
       device_type = "serial"; 
       compatible = "ns16550"; 
       reg = <0xef600400 8>; 
       virtual-reg = <0xef600400>; 
       clock-frequency = <0x00a8c000>; 
       current-speed = <0>; 
       interrupt-parent = <&UIC0>; 
       interrupts = <1 4>; 
        }; 


serial0: [email protected] { 
        cell-index = <0>; 
        device_type = "serial"; 
        compatible = "ns16550"; 
        reg = <0x4500 0x100>; 
        clock-frequency = <0>; 
        interrupts = <42 2>; 
        interrupt-parent = <&mpic>; 
      }; 

我想知道這是什麼中斷= < 1 4>;中斷= < 42 2>;代表?

我們從哪裏得到< 1 4>,< 42 2>來自?

+1

這裏有一些信息,但它看起來像這些值將硬件特定:http://www.devicetree.org/Device_Tree_Usage – 2014-10-29 20:58:34

+0

@AmitSinghTomar你將不得不看看這個設備的設備樹綁定,但第一個數字通常表示中斷線,第二個通常指示是否是上升沿觸發,下降沿,電平觸發等。 – 2014-10-29 21:32:31

回答

7

您需要更多的上下文來確定這些interrupts屬性所代表的內容。以類似的東西到你的第一個例子,讓我們來看看arch/powerpc/boot/dts/bamboo.dts,它具有以下內容:

 UART1: [email protected] { 
      device_type = "serial"; 
      compatible = "ns16550"; 
      reg = <0xef600400 0x00000008>; 
      virtual-reg = <0xef600400>; 
      clock-frequency = <0>; 
      current-speed = <0>; 
      interrupt-parent = <&UIC0>; 
      interrupts = <0x1 0x4>; 
     }; 

interrupts屬性描述此設備的中斷控制器的連接。假設控制器有多個輸入(即中斷線),我們需要找出該設備將與哪個線路交互。

不同的控制器可能有不同的解複用他們的IRQ的方法,因此屬性類型的變化。在這種情況下,我們來看看中斷控制器。我們看到,[email protected]節點具有以下屬性:

  interrupt-parent = <&UIC0>; 

&UIC0語法告訴我們,有一個能通過UiC0標籤在設備樹的其他地方。這是我們的中斷控制器。如果我們發現標籤,我們可以看到:

UIC0: interrupt-controller0 { 
    compatible = "ibm,uic-440ep","ibm,uic"; 
    interrupt-controller; 
    cell-index = <0>; 
    dcr-reg = <0x0c0 0x009>; 
    #address-cells = <0>; 
    #size-cells = <0>; 
    #interrupt-cells = <2>; 
}; 

首先,我們看到,#interrupt-cells是2 - 這意味着每個中斷描述符佔據兩個單元。由於串口設備的interrupt屬性有兩個單元(0x1和0x4),這告訴我們有一箇中斷線被描述。

compatible屬性告訴我們這是一個IBM UIC中斷控制器。如果我們看一看司機爲控制器,我們可以看到:

static struct irq_domain_ops uic_host_ops = { 
    .map = uic_host_map, 
    .xlate = irq_domain_xlate_twocell, 
}; 

這XLATE功能是什麼來的中斷源interrupts屬性映射到一個硬件中斷號(也可能是它的IRQ型)。該irq_domain_xlate_twocell功能是非常簡單的:

int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr, 
      const u32 *intspec, unsigned int intsize, 
      irq_hw_number_t *out_hwirq, unsigned int *out_type) 
{ 
    if (WARN_ON(intsize < 2)) 
     return -EINVAL; 
    *out_hwirq = intspec[0]; 
    *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; 
    return 0; 
} 

所以(正如彼得·L的他的評論中提及),在這種情況下,兩個細胞<0x1 0x4>表示斷線1,和電平高(爲0x4 == IRQ_TYPE_LEVEL_HIGH)中斷類型。

你的第二個例子稍微複雜一些:它使用一個mpic中斷控制器,它有自己的xlate函數。查看arch/powerpc/sysdev/mpic.cmpic_host_xlate瞭解內部細節。

+0

那麼,如何找到「IBM UIC中斷控制器」設備驅動程序? dtc文件表示它與ibm-uic-440ep和ibm-uic兼容,但是當我用這些關鍵字搜索它們時,我找不到這些驅動程序中的一個。 dts文件中的「驅動程序名稱」和兼容參數之間是否存在映射關係? – 2018-02-23 13:40:53

+0

驅動程序幾乎總是使用設備樹中的「兼容」屬性與其設備匹配。如果您在樹中搜索「ibm,uic',則會在'arch/powerpc/platforms/4xx/uic.c'中找到該驅動程序。但是,UIC驅動程序有點不同,因爲它不使用匹配表。如果您需要更多詳細信息,請發佈問題,我可以添加更詳細的答案。 – 2018-02-26 01:19:30

相關問題