본문 바로가기
Development/Linux

[LINUX] Xilinx Intnerrupt 등록 오류 - missmatch irq

by qWooWp 2023. 2. 15.
반응형

DTS 에서 가저오거나 , 고정된 Interrupt Index 를 바로 request_irq 를 이용하여 호출 하면

 

Claim 과 함께 


"...Flags missmatch irq..."


에러 메시지가 발생합니다. 


이 값을 리턴하는 함수 소스를 확인해 보면

https://github.com/Xilinx/linux-xlnx/blob/master/kernel/irq/manage.c

1502 라인


new->flags 에 IRQF_PROBE_SHARED 옵션이 없으면 위와 같은 메시지로 리턴하도록 되어 있었습니다. 

그래서 IRQF_PROBE_SHARED 를 추가 하면 해당 오류는 사라 집니다. 


하지만 여전히 Unable to claim irq XX; error -16 (EBUSY) 을 리턴하고 있습니다. 


기존 드라이버에서 request_irq 를 할 때 string (인터럽트 소유자) 를 dts 에서 설정된 문자열로 변경하여

테스트 진행 하였지만 동일하게 에러가 발생하였음. 


위의 스트링 값은 등록되게 되면 아래와 같이 입력할 때 확인할 수 있다. 


# cat /proc/interrupts


등록된 장치는 아래 위치에 생성이 됩니다. 


/sys/bus/i2c/drivers/ilitek_2117a 

/sys/module/ilitek2117a

 

uio_pdrv_genirq.ko 파일이 modversion 옵션이 켜져 있어서 이것을 off 한 버전으로 올려보고 다시 테스트 해볼 예정이다. 


원본 드라이버 위치는 에 존재 한다. 

/lib/modules/4.19.0-xilinx-v2019.1/kernel/drivers/uio/uio_pdrv_genirq.ko


이것을 다시 빌드한 파일로 변경해보기로 함. 

modversion 오류는 없어 짐. 


여전히 irq 등록은 되지 않음. 


-EBUSY 값은 다른 드라이버에서 이 인터럽트를 선점하고 있다는 의미 임. 



아래와 같이 확인해보면 dmac 에서 34 번 인터럽트를 사용하고 있다고 나옴. 

root@mimojet_lcd_peta:~# cat /proc/interrupts

           CPU0       CPU1       

16:          1          0     GIC-0  27 Edge      gt

17:          0          0     GIC-0  43 Level     ttc_clockevent

18:       3920       4533     GIC-0  29 Edge      twd

19:          0          0     GIC-0  37 Level     arm-pmu

20:          0          0     GIC-0  38 Level     arm-pmu

21:         43          0     GIC-0  39 Level     f8007100.adc

23:          0          0     GIC-0  57 Level     cdns-i2c

25:          0          0     GIC-0  35 Level     f800c000.ocmc

26:        478          0     GIC-0  82 Level     xuartps

27:          0          0     GIC-0  58 Level     e0006000.spi

28:          7          0     GIC-0  51 Level     e000d000.spi

29:       4834          0     GIC-0  79 Level     mmc0

30:          0          0     GIC-0  45 Level     f8003000.dmac

31:          0          0     GIC-0  46 Level     f8003000.dmac

32:          0          0     GIC-0  47 Level     f8003000.dmac

33:          0          0     GIC-0  48 Level     f8003000.dmac

34:          0          0     GIC-0  49 Level     f8003000.dmac


기존 장치에서 정상 등록시 나오는 항목 GIC-0 의 64 번이라고 나온다. 


결국 원인 : GIC-0 64 사용하기 위해 메핑된 가상 Index 값이 잘못되어 있어서 원인임.

 

해결방법

이를 위해서 Mapping Index 를 가져오기 위한 함수 irq_of_parse_and_map 함수를 사용해야 한다. (of_irq.h)

반응형

댓글