기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.
[V310] 오드로이드 보드에 터치 드라이버를 포팅 중인데요..
request_irq로 등록을 했지만, isr이 불려지지 않습니다.
정확히 등록되었는지 확인하기 위해 shell로 들어가서
#cat /proc/interrupts 를 처 보니
등록한 isr 이름이 뜨더군요.
그래서 터치를 해보니, 인터럽트 신호는 High->Low로 떨어지는데,
request_irq로 등록한 함수가 불려 지지 않네요.
그리고 그때 #cat /proc/interrupts 를 처 보니
count가 올라가지 않더군요.
이런 경우에는 어디를 찾아 봐야 할까요?
고수님들 갈켜 주세용용용!!!
로그 메세지를 찍어 보니 아래와 같이나오네요
터치 드라이버의 probe 할때 request_irq를 통해 IRQ를 등록해 주고,
테스트 삼아 probe에서 enable_irq함수를 호출해 주었더니
아래와 같이 나왔습니다.
-------------------------------------------------------------------
-------------------------------------------------------------------
[ 2.638990] [Egalax_i2c] Register egalax_i2c cdev, major: 253
[ 2.644581] [Egalax_i2c] /proc/egalax_dbg created
[ 2.649210] [Egalax_i2c] Driver init done!
[ 2.653309] [Egalax_i2c] Start probe
[ 2.657020] input: eGalax_Touch_Screen as /devices/virtual/input/input1
[ 2.663639] [Egalax_i2c] Register input device done
[ 2.668454] ------------[ cut here ]------------
[ 2.672904] WARNING: at kernel/irq/manage.c:290 enable_irq+0x4c/0x74()
[ 2.679399] Unbalanced enable for IRQ 332
[ 2.683391] Modules linked in:
[ 2.686452] [<c003cbb8>] (unwind_backtrace+0x0/0xf8) from [<c0067a1c>] (warn_slowpath_common+0x54/0x7c)
[ 2.695813] [<c0067a1c>] (warn_slowpath_common+0x54/0x7c) from [<c0067ad8>] (warn_slowpath_fmt+0x30/0x40)
[ 2.705360] [<c0067ad8>] (warn_slowpath_fmt+0x30/0x40) from [<c00a2c3c>] (enable_irq+0x4c/0x74)
[ 2.714045] [<c00a2c3c>] (enable_irq+0x4c/0x74) from [<c0424118>] (egalax_i2c_probe+0x37c/0x3f8)
[ 2.722810] [<c0424118>] (egalax_i2c_probe+0x37c/0x3f8) from [<c02ac59c>] (i2c_device_probe+0xc4/0xe8)
[ 2.732098] [<c02ac59c>] (i2c_device_probe+0xc4/0xe8) from [<c0220ca0>] (driver_probe_device+0x9c/0x1c4)
[ 2.741560] [<c0220ca0>] (driver_probe_device+0x9c/0x1c4) from [<c0220e54>] (__driver_attach+0x8c/0x90)
[ 2.741574] [<c0220e54>] (__driver_attach+0x8c/0x90) from [<c02204f0>] (bus_for_each_dev+0x60/0x8c)
[ 2.741587] [<c02204f0>] (bus_for_each_dev+0x60/0x8c) from [<c021fd24>] (bus_add_driver+0xa0/0x250)
[ 2.741599] [<c021fd24>] (bus_add_driver+0xa0/0x250) from [<c0221108>] (driver_register+0x70/0x150)
[ 2.741612] [<c0221108>] (driver_register+0x70/0x150) from [<c02ad3cc>] (i2c_register_driver+0x30/0x8c)
[ 2.741631] [<c02ad3cc>] (i2c_register_driver+0x30/0x8c) from [<c02a6c04>] (egalax_i2c_ts_init+0x264/0x2b0)
[ 2.741649] [<c02a6c04>] (egalax_i2c_ts_init+0x264/0x2b0) from [<c0035548>] (do_one_initcall+0x34/0x1cc)
[ 2.741663] [<c0035548>] (do_one_initcall+0x34/0x1cc) from [<c0008604>] (kernel_init+0x1b0/0x24c)
[ 2.741678] [<c0008604>] (kernel_init+0x1b0/0x24c) from [<c0037400>] (kernel_thread_exit+0x0/0x8)
[ 2.741695] ---[ end trace 25bf89327d107c94 ]---
[ 2.742759] [Egalax_i2c] Request irq(332) gpio(254) with result:0
[ 2.742765] [Egalax_i2c] Register early_suspend done
[ 2.742770] [Egalax_i2c] I2C probe done
/proc/interrupts 에는 안나올 수도 있습니다.
확실히 등록을 확인하려면, interrupt controller관련 mask register를 간단하게 찍어보시는게
제일 확실한 방법입니다.