2014-10-29 3 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 –

+0

@AmitSinghTomar이 장치의 장치 트리 바인딩을 살펴보아야하지만 첫 번째 장치 번호는 일반적으로 인터럽트 라인을 나타내고 두 번째는 보통 상승 에지 트리거, 하강 에지, 레벨 트리거 등을 나타냅니다. –

답변

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] 노드가 다음과 같은 속성이 있음을 참조하십시오 UIC0 레이블 다른 장치 트리에가 있다는

  interrupt-parent = <&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 인터럽트 컨트롤러임을 나타냅니다. 우리가이 컨트롤러 용 드라이버를 보는 경우에, 우리는 다음을 참조하십시오 xlate 기능이 하드웨어 IRQ 번호 (그리고 아마도 그 IRQ 형)에 인터럽트 소스 'interrupts 속성을 매핑하는 데 사용되는 것입니다

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

있다. 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) 인터럽트 유형.

두 번째 예제는 약간 더 복잡합니다. 자체적 인 xlate 기능을 가진 mpic 인터럽트 컨트롤러를 사용합니다. 내부 세부 사항은 mpic_host_xlate (arch/powerpc/sysdev/mpic.c)을보십시오.

+0

"IBM UIC 인터럽트 컨트롤러"장치 드라이버는 어떻게 찾을 수 있습니까? dtc 파일은 ibm-uic-440ep 및 ibm-uic과 호환되지만 이러한 키워드로 검색 할 때 이러한 드라이버 중 하나를 찾을 수 없다고 말합니다. "driver name"과 dts 파일의 호환 매개 변수 사이에 매핑이 있습니까? –

+0

드라이버는 거의 항상 장치 트리의 "compatible"속성을 사용하여 장치와 일치합니다. 트리에서'ibm, uic'을 grep하면'arch/powerpc/platforms/4xx/uic.c'에서 드라이버를 찾을 수 있습니다. 그러나 UIC 드라이버는 데이터 이동 색인을 사용하지 않는다는 점에서 조금 다릅니다. 자세한 내용을 원하면 질문을 게시하고보다 정교한 답변을 추가 할 수 있습니다. –