문제

저는 Linux 커널 장치 트리를 사용하여 작업하고 있는데 첫눈에 여러 인터럽트 부모가 있는 노드에 대한 기능이 누락된 것 같습니다.맞춤형 ARM 임베디드 보드를 제어하는 ​​드라이버가 있습니다. 이 드라이버는 여러 GPIO 인터럽트 상위에서 GPIO 및 핀 인터럽트를 가져와 온보드 배터리, 낮은 전압 irq, Reset_pending irq 등을 관리합니다.

누군가가 이 문제를 처리하기 위해 추가 기능을 해킹한 것처럼 보이지만 이는 공식적인 것이 아니며 내가 원하지 않는 인터럽트 소스 파일을 수정하는 것과 관련된 소스를 하나 찾았습니다.수정 사항에는 이와 같이 "인터럽트 확장"이라는 용어에 대한 지원이 추가되었습니다.여기서 인터럽트 부모는 튜플에 지정됩니다.

    #interrupt-cells = <2>;
    interrupts-extended = <&gpio3 21 1>, <&gpio7 13 2>; /* voltage/reset irq */

간단한 gpio 인터럽트 매핑을 달성하기 위해 인터럽트 맵 속성을 사용하는 방법에 대한 수단이나 예를 찾지 못했기 때문에 당황했습니다.

단일 GPIO 인터럽트 상위만 사용하는 경우 이를 수행하는 적절한 방법은 다음과 같습니다.

interrupt-parent = <&gpio1>;
interrupts = <9 2>, <8,1>;

하지만 이는 선언만 허용합니다. 하나 "인터럽트"에 지정된 여러 인터럽트가 있는 상위 인터럽트는 모두 지정된 상위에 속해야 합니다.저는 2개의 인터럽트 부모인 gpio7과 gpio3을 사용하고 있습니다.

장치 트리의 단일 장치 노드에서 서로 다른 인터럽트 부모를 사용하여 여러 인터럽트를 구현하는 적절한 방법은 무엇입니까?

도움이 되었습니까?

해결책

이것이 gpio 인터럽트 상위에 작동하는지 모르겠지만 다른 유형의 인터럽트 컨트롤러의 경우 'interrupt-map' 속성을 사용하고 각 개별 컨트롤러에 phandle을 사용하여 인터럽트 목록을 지정합니다.다음은 드라이버에 'intc' 컨트롤러에서 2개, 'spmi' 컨트롤러에서 1개, 총 3개의 인터럽트가 필요한 경우를 본 예입니다.

interrupts = <0 1 2>;
interrupt-map = <0 &intc 0 134 0
                 1 &intc 0 140 0
                 2 &spmi 0 0x9 0 0>;
interrupt-names = "core_irq", "async_irq", "pmic_id_irq";
interrupt-map-mask = <0 0 0 0>;

이 예에서 intc 노드의 #interrupt-cells 값은 <3>이고 spmi 노드의 #interrupt-cells 값은 4입니다(각각의 phandle과 함께 많은 인수를 사용해야 함을 의미).

Interrupt-names 필드는 선택 사항이지만 코드의 숫자 대신 이름으로 irq를 요청할 수 있습니다(예: platform_get_irq() 대신 platform_get_irq_byname() 사용).

솔직히 말해서, 인터럽트 맵 마스크가 어떤 용도로 사용되는지 잘 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top