USB OHCI 드라이버 활성화했을때 나오는 에러 잡기
USB Core만 활성화 시켰을 때는 문제가 없었으나,,
HID를 사용하기 위해 OHCI 드라이버를 enable 하자 아래와 같은 메지지가 한참 나오고 나서야
USB 장치가 동작하였다. 그것도 아주 느린 반응 속도로;;;
다시 뺐다가 끼우면 정상적으로 동작하는 경우로써;;
에러 처음 문장에서 나오듯이 IRQ 문제인듯;;;
======================================================================================
irq26: nobody cared
Pid: 0, comm: swapper
CPU: 0
PC is at default_idle+0x84/0x94
LR is at default_idle+0x78/0x94
pc : [<c0044bd0>] lr : [<c0044bc4>] Not tainted
sp : c0255f98 ip : c0255f98 fp : c0255fa4
r10: 3001e46c r9 : 41129200 r8 : 3001e49c
r7 : c02c6854 r6 : c0257d1c r5 : c0254000 r4 : c0044b4c
r3 : 60000013 r2 : f0500000 r1 : 00000032 r0 : c003c1e0
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment kernel
Control: C000717F Table: 32B90000 DAC: 00000017
[<c00449d0>] (show_regs+0x0/0x50) from [<c0043da0>] (report_bad_irq+0x6c/0xcc)
r4 = C0255F50
[<c0043d34>] (report_bad_irq+0x0/0xcc) from [<c0043e84>] (do_level_IRQ+0x84/0xc0)
r5 = 0000001A r4 = C02A7428
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r6 = C0255F50 r5 = F0000000 r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0044b4c>] (default_idle+0x0/0x94) from [<c00449b4>] (cpu_idle+0x3c/0x58)
[<c0044978>] (cpu_idle+0x0/0x58) from [<c0042260>] (rest_init+0x24/0x2c)
r5 = C02A6A9C r4 = C02B1500
[<c004223c>] (rest_init+0x0/0x2c) from [<c0008998>] (start_kernel+0x168/0x1b4)
[<c0008830>] (start_kernel+0x0/0x1b4) from [<30008094>] (0x30008094)
[<c0047ae8>] (dump_stack+0x0/0x14) from [<c0043da4>] (report_bad_irq+0x70/0xcc)
[<c0043d34>] (report_bad_irq+0x0/0xcc) from [<c0043e84>] (do_level_IRQ+0x84/0xc0)
r5 = 0000001A r4 = C02A7428
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r6 = C0255F50 r5 = F0000000 r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0044b4c>] (default_idle+0x0/0x94) from [<c00449b4>] (cpu_idle+0x3c/0x58)
[<c0044978>] (cpu_idle+0x0/0x58) from [<c0042260>] (rest_init+0x24/0x2c)
r5 = C02A6A9C r4 = C02B1500
[<c004223c>] (rest_init+0x0/0x2c) from [<c0008998>] (start_kernel+0x168/0x1b4)
[<c0008830>] (start_kernel+0x0/0x1b4) from [<30008094>] (0x30008094)
handlers:
[<c0186904>] (usb_hcd_irq+0x0/0x90)
irq26: nobody cared
Pid: 0, comm: swapper
CPU: 0
PC is at __do_irq+0x34/0x8c
LR is at do_level_IRQ+0x6c/0xc0
pc : [<c0043bb0>] lr : [<c0043e6c>] Not tainted
sp : c0255e28 ip : c0255e50 fp : c0255e4c
r10: 3001e46c r9 : 41129200 r8 : c0255eb0
r7 : 00000030 r6 : c0255eb0 r5 : 00000030 r4 : c03cfea0
r3 : 40000013 r2 : c0255eb0 r1 : c03cfea0 r0 : 00000030
Flags: nZcv IRQs on FIQs on Mode SVC_32 Segment kernel
Control: C000717F Table: 32B90000 DAC: 00000017
[<c00449d0>] (show_regs+0x0/0x50) from [<c0043da0>] (report_bad_irq+0x6c/0xcc)
r4 = C0255DE0
[<c0043d34>] (report_bad_irq+0x0/0xcc) from [<c0043e84>] (do_level_IRQ+0x84/0xc0)
r5 = 0000001A r4 = C02A7428
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r6 = C0255DE0 r5 = F0000000 r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0043b7c>] (__do_irq+0x0/0x8c) from [<c0043e6c>] (do_level_IRQ+0x6c/0xc0)
r8 = 3001E49C r7 = C02C6854 r6 = C0255EB0 r5 = 00000030
r4 = C02A78A0
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c004ce40>] (s3c_irq_demux_subirq+0x5c/0x68)
r6 = C0255EB0 r5 = F0000000 r4 = C0255EB0
[<c004cde4>] (s3c_irq_demux_subirq+0x0/0x68) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c00579f8>] (__do_softirq+0x0/0xe0) from [<c0057d60>] (irq_exit+0x44/0x4c)
r6 = C0255F50 r5 = F0000000 r4 = FFFFFFFF
[<c0057d1c>] (irq_exit+0x0/0x4c) from [<c0044154>] (asm_do_IRQ+0xf0/0x108)
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0044b4c>] (default_idle+0x0/0x94) from [<c00449b4>] (cpu_idle+0x3c/0x58)
[<c0044978>] (cpu_idle+0x0/0x58) from [<c0042260>] (rest_init+0x24/0x2c)
r5 = C02A6A9C r4 = C02B1500
[<c004223c>] (rest_init+0x0/0x2c) from [<c0008998>] (start_kernel+0x168/0x1b4)
[<c0008830>] (start_kernel+0x0/0x1b4) from [<30008094>] (0x30008094)
[<c0047ae8>] (dump_stack+0x0/0x14) from [<c0043da4>] (report_bad_irq+0x70/0xcc)
[<c0043d34>] (report_bad_irq+0x0/0xcc) from [<c0043e84>] (do_level_IRQ+0x84/0xc0)
r5 = 0000001A r4 = C02A7428
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r6 = C0255DE0 r5 = F0000000 r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0043b7c>] (__do_irq+0x0/0x8c) from [<c0043e6c>] (do_level_IRQ+0x6c/0xc0)
r8 = 3001E49C r7 = C02C6854 r6 = C0255EB0 r5 = 00000030
r4 = C02A78A0
[<c0043e00>] (do_level_IRQ+0x0/0xc0) from [<c004ce40>] (s3c_irq_demux_subirq+0x5c/0x68)
r6 = C0255EB0 r5 = F0000000 r4 = C0255EB0
[<c004cde4>] (s3c_irq_demux_subirq+0x0/0x68) from [<c00440b0>] (asm_do_IRQ+0x4c/0x108)
r4 = FFFFFFFF
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c00579f8>] (__do_softirq+0x0/0xe0) from [<c0057d60>] (irq_exit+0x44/0x4c)
r6 = C0255F50 r5 = F0000000 r4 = FFFFFFFF
[<c0057d1c>] (irq_exit+0x0/0x4c) from [<c0044154>] (asm_do_IRQ+0xf0/0x108)
[<c0044064>] (asm_do_IRQ+0x0/0x108) from [<c00427c4>] (__irq_svc+0x24/0x60)
r6 = 00000001 r5 = F0000000 r4 = FFFFFFFF
[<c0044b4c>] (default_idle+0x0/0x94) from [<c00449b4>] (cpu_idle+0x3c/0x58)
[<c0044978>] (cpu_idle+0x0/0x58) from [<c0042260>] (rest_init+0x24/0x2c)
r5 = C02A6A9C r4 = C02B1500
[<c004223c>] (rest_init+0x0/0x2c) from [<c0008998>] (start_kernel+0x168/0x1b4)
[<c0008830>] (start_kernel+0x0/0x1b4) from [<30008094>] (0x30008094)
handlers:
[<c0186904>] (usb_hcd_irq+0x0/0x90)
==========================================================================================
커널을 자세히 알지 못하기 때문에 ㅠ.ㅠ
땜빵하였다 -_-;; 일단 되게 만드는게 우선이니깐 ^^;;
File : drivers/usb/core/hcd.c (2.6.16기준 1655 Line)
if (hcd->driver->irq (hcd, r) == IRQ_NONE)
//return IRQ_NONE; original
return IRQ_HANDLED;
리턴 값을 IRQ_HANDLED 로 주면 된다.