5 Interrupts
인터럽트는 주소 변환과 다르며, 트리의 원래 구조를 따르지 않는다. 대신, 인터럽트 신호는 머신의 어느 곳에서나 시작되고 종료될 수 있다. 인터럽트 신호는 자연스러운 트리 형태 대신에 노드 간의 링크로 표현된다. 인터럽트 연결은 다음 속성을 사용하여 기술할 수 있다.
- interrupt-controller
- #interrupt-cells
- interrupt-parent
- interrupts
interrupt-controller 속성은 인터럽트 신호를 수신하는 디바이스로 노드를 선언하는 빈 속성이다.
#interrupt-cells 속성은 인터럽트 컨트롤러 노드의 속성이다. 인터럽트 컨트롤러의 인터럽트 지정자에 몇 개의 셀이 있는지 정의하는 데 사용된다.
interrupt-parent 속성은 연결된 인터럽트 컨트롤러에 대한 phandle을 포함하는 디바이스 노드의 속성이다. interrupt-parent가 없는 노드는 부모 노드에서 속성을 상속할 수 있다.
마지막으로, interrupts 속성은 각 인터럽트 출력 신호에 하나씩 인터럽트 지정자 목록을 포함하는 디바이스 노드의 속성이다.
다음 두 노드는 QorIQ P1010 디바이스의 인터럽트 연결을 보여준다.
Listing 1. Example: Interrupt connections on a QorIQ P1010 device
mpic: pic@40000 {
interrupt-controller;
#address-cells = <0>;
#interrupt-cells = <4>;
reg = <0x40000 0x40000>;
compatible = "fsl,mpic";
device_type = "open-pic";
};
serial0: serial@4500 {
cell-index = <0>;
device_type = "serial";
compatible = “fsl,ns16550”,"ns16550";
reg = <0x4500 0x100>;
clock-frequency = <0>;
interrupts = <42 2 0 0>;
interrupt-parent = <&mpic>;
};
Listing 1에서, 인터럽트 컨트롤러는 주소 오프셋이 0x40000인 pic에서 정의된다. 루트 노드의 interrupt-parent 속성에 phandle을 할당하기 위해, mpic 레이블이 인터럽트 컨트롤러 노드에 추가되었다.
MPIC의 경우, 인터럽트 속성에는 두 개나 네 개의 값이 있다. 첫 번째 셀은 항상 해당 인터럽트의 xIVPR 레지스터 인덱스를 지정한다. 처음 16개는 외부 인터럽트이고 나머지는 내부 인터럽트이다. 따라서 내부 인터럽트는 레퍼런스 매뉴얼에 설명된 것보다 16 큰 값을 갖는다. 위에서 pic 노드의 #interrupt-cells는 4로 정의되어, 각 인터럽트 지정자가 4개의 셀을 가지고 있음을 나타낸다. 위의 예에서, 인터럽트 번호는 42이다. 42 - 16 = 26, P1010 레퍼런스 매뉴얼에 따르면 DUART 인터럽트에 해당한다.
두 번째 값은 레벨 감지를 나타낸다. MPIC의 경우 레벨 감지는 다음과 같이 정의된다:
- 0 = 로우-하이 에지 감지 유형 사용
- 1 = 액티브-로우 레벨 감지 유형 사용
- 2 = 액티브-하이 레벨 감지 유형 사용
- 3 = 하이-로우 에지 감지 유형 사용
세 번째와 네 번째 값이 있으면, interrupt-type과 type-info를 나타낸다. MPIC의 경우, interrupt-type은 다음과 같이 정의된다:
- 0 = 일반
- 1 = 오류 인터럽트
- 2 = MPIC 프로세서간 인터럽트
- 3 = MPIC 타이머 인터럽트
오류 인터럽트의 경우, type-info는 오류 인터럽트 번호이다. type-info는 IPI와 타이머에도 유효하다.
MPIC 바인딩에 대한 전체 설명은 Documentation/devicetree/bindings/powerpc/fsl/mpic.txt에서 찾을 수 있다.
참고
Listing 1에서, device_type은 더 이상 사용되지 않으며(deprecated) 사용해서는 안된다. 또한, #cell-index를 사용하지 않는 것이 좋다. 만약 사용될 경우, 바인딩은 프로그래밍 모델에서 무엇에 해당하는지 구체적일 필요가 있으며, 또는 더 구체적인 명명된 속성을 고려해야 한다.
ARM GIC의 경우, 바인딩은 비슷해 보이지만 다르다. 첫 번째 셀은 인터럽트 유형을 정의한다:
- 0 = SPI 인터럽트
- 1 = PPI 인터럽트
두 번째 셀에는 인터럽트 번호가 포함되어 있다. SPI는 0-987번을 인터럽트하고, PPI는 0-15번을 인터럽트한다.
세번째 셀은 레벨 감지를 나타낸다:
- 1 = 로우-하이 에지 감지
- 2 = 하이-로우 에지 감지
- 4 = 액티브-하이 레벨 감지
- 8 = 액티브-로우 레벨 감지
GIC 바인딩에 대한 전체 설명은 Documentation/devicetree/bindings/arm/gic.txt에서 찾을 수 있다.
대체 인터럽트 컨트롤러의 경우, 두 셀에 대한 완전한 설명을 위해 특정 바인딩을 검사해야 하지만, 일반적으로 첫 번째 셀에 인터럽트 번호를 지정하고 두 번째 셀에 인터럽트 플래그(예: 에지/레벨 트리거, 액티브-하이, 액티브-로우 등)를 정의한다.
'NXP i.MX SoC Family > Device Trees' 카테고리의 다른 글
Introduction to Device Trees - Device tree inclusion (0) | 2022.10.13 |
---|---|
Introduction to Device Trees - Example: Device tree node (0) | 2022.10.13 |
Introduction to Device Trees - Memory mapping and addressing (0) | 2022.10.12 |
Introduction to Device Trees - Syntax (0) | 2022.10.11 |
Introduction to Device Trees - Basic device tree (0) | 2022.10.11 |