2017-01-25 15 views
0

Linux OS가 core0에서 실행되고 core1에서 RTOS가 실행되는 imx6 sabrelite 보드를 사용하고 있습니다. RTOS에서 GIC 인터럽트 레지스터를 설정했지만 Linux OS가이를 덮어 씁니다. IRQ 88,142,143,150을 활성화하고이를 Linux 소스 코드의 코어 1 (RTOS)에 배포해야합니다. 나는 irq_gic.c 파일을 살펴 보았지만 앞으로 나아갈 생각을 갖지 못했습니다.Linux에서 IRQ 활성화 및 배포

시리얼 콘솔에서 cat/proc/interrupts를 시도했지만 위의 IRQ 번호를 볼 수 없습니다. 리눅스에서 위의 인터럽트를 사용할 수 없다는 뜻입니까?

Linux 소스 코드에서 인터럽트를 활성화하고 배포하는 방법은 무엇입니까?

귀하의 제안을 환영합니다!

미리 감사드립니다.

답변

0

ARM SMP 코어는 프로세서 당 인터럽트 (PPI), 공유 프로세서 인터럽트 (SPI) 및 소프트웨어 생성 된 인터럽트 (SGI)를 제공하는 GIC와 종종 연결됩니다.

장치 트리 파일에서 GIC 드라이버가 호출되었습니다.

my_driver [email protected]{ 
    compatible = "eeti,egalax_ts"; 
    interrupt-parent = <&intc>; 
    interrupts = <X Y Z> 
}; 
: 당신은 장치 트리에서 드라이버에 대한 항목을 만들 수 있습니다

intc: [email protected] { 
    compatible = "arm,cortex-a9-gic"; 
    #interrupt-cells = <3>; 
    interrupt-controller; 
    reg = <0x00a01000 0x1000>, 
     <0x00a00100 0x100>; 
    interrupt-parent = <&intc>; 
}; 

당신은 당신의 .dtsi 파일에 동일한에 대한 항목을 확인할 수 있습니다 (아치/팔/부팅/DTS/imx6qdl.dtsi)

X : SPI 인터럽트의 경우 0, PPI의 경우 1.

예 : 인터럽트 유형의 인터럽트 번호.

Z : 트리거 유형 및 수준 플래그

당신이 기능을 통해 드라이버에서 인터럽트를 (위에서 언급 한) 활성화해야

:

request_irq(IRQ_NUM, my_interrupt_handler,IRQ_FLAG, "my_driver", my_dev); 

당신의 인터럽트는 당신에게 다음 등록됩니다되면 cat/proc/interrupts에서 동일한 항목을 볼 수 있습니다.

그런 다음 GIC가로 봐에 대한 더 많은 이해를 위해

[[email protected]]# cat /proc/irq/24/smp_affinity 
00000001 

와 같은 varify 수 0

[[email protected]]# echo 1 > /proc/irq/24/smp_affinity 

핵심에 바인딩해야 할 핵심 0에 인터럽트를 배포하려면 당신 메인 라인 커널 Documentation/devicetree/bindings/arm/gic.txt

+0

안녕하세요, vinod, 답장을 보내 주셔서 감사합니다. maxcpus = 1 옵션을 사용하여 Linux OS를 하나의 코어로 제한했습니다. 그래서 여기서 smp_affinity 옵션을 사용할 수 없습니다. 내 생각은 GIC 배포자 인터페이스와 irq_gic.c의 타겟 레지스터를 코어 1에 매핑하도록 설정하는 것입니다. 그러나 변경 사항을 어디에 넣어야할지 모르겠습니다. 너는 어떤 생각을 가지고 있니? –

+0

안녕하세요 Saravanan, 이해했습니다. 나는 그것에 대해 확실하지 않다. 하지만 gic_notifier() 함수 또는 gic_init_bases() 함수에서 시도해 볼 수 있다고 생각합니다. 한번 시도해보고 결과를 알려주시겠습니까? –