[진행 중] OHCI 메시지가 발생합니다.
글쓴이: bus710 / 작성시간: 월, 2009/04/13 - 6:14오후
Pid: 0, comm: swapper CPU: 0 PC is at default_idle+0x84/0x94 LR is at default_idle+0x78/0x94 pc : [<c00465e0>] lr : [<c00465d4>] Not tainted sp : c02f5f9c ip : c02f5f9c fp : c02f5fa8 r10: 30020404 r9 : 41129200 r8 : 30020434 r7 : c03918ec r6 : c0372f54 r5 : c02f4000 r4 : c004655c r3 : 80000013 r2 : f0500040 r1 : ffffffff r0 : c0041de0 Flags: Nzcv IRQs on FIQs on Mode SVC_32 Segment kernel Control: C000717F Table: 30030000 DAC: 00000017 [<c00468f0>] (show_regs+0x0/0x4c) from [<c0045890>] (report_bad_irq+0x6c/0xcc) r4 = C02F5F54 [<c0045824>] (report_bad_irq+0x0/0xcc) from [<c0045b98>] (do_level_IRQ+0x84/0xc4) r5 = 0000001A r4 = C0368E0C [<c0045b14>] (do_level_IRQ+0x0/0xc4) from [<c0045cfc>] (asm_do_IRQ+0x4c/0x74) r6 = 00000001 r5 = F0000000 r4 = C02F5F54 [<c0045cb0>] (asm_do_IRQ+0x0/0x74) from [<c0044924>] (__irq_svc+0x24/0x60) r4 = FFFFFFFF [<c004655c>] (default_idle+0x0/0x94) from [<c0046638>] (cpu_idle+0x48/0x64) [<c00465f0>] (cpu_idle+0x0/0x64) from [<c0044024>] (__init_end+0x24/0x2c) r5 = C036847C r4 = 00000000 [<c0044000>] (__init_end+0x0/0x2c) from [<c00089ac>] (start_kernel+0x17c/0x1c0) [<c0008830>] (start_kernel+0x0/0x1c0) from [<30008094>] (0x30008094) handlers: [<c01d2b50>] (usb_hcd_irq+0x0/0x84) irq26: nobody cared
s3c2443 보드에 USB 장치를 붙이려 합니다.
커널 상에서 usb core만 enable 시키면 특별히 메시지가 나오지 않는데,
OHCI도 enable 시키면 저런 메시지가 뜹니다.
예상키로는 인터럽트를 잘 처리하지 못해서 그런 것 같습니다.
위와 유사한 메시지에 대처한 경험이 있으신 분 계십니까??
Forums:
OHCI resource 설정이 잘못된 듯 합니다.
커널 소스에서 OHCI 장치에 대한 platform driver 쪽의 설정을 다시 맞춰 줘야 할 것 같네요. IRQ 번호를 잘못 지정했습니다.
감사합니다!!
감사합니다^^
위의 구문대로 해당 리턴 값을 변경하여 강제로 입막음을 하였습니다;;
이러한 작업은 kernel/drivers/usb/host/ohci-hcd.c 146라인 의 주석을 근거로 하였습니다.
여러개의 USB 장치를 물리는 작업이 아니라서 일단 핸들러 신호를 무시하는 쪽으로
진행하였으며 이에 대한 부작용이 없는지는 좀 더 살펴 보아야 할 것 같습니다....^^
* 관련 작업은 연구실 선배의 도움을 많이 받았습니다^^;
life is only one time
아무래도 부작용이 생길 것 같습니다만...
USB Interrupt를 무시할 경우에는 USB 장치 동작이 원활하지 않게 될 가능성이 높아집니다.
커널 소스를 보시면 arch/arm/mach-s3c2443 또는 arch/arm/plat-s3c24xx 디렉토리 내에
보드의 자원에 대한 설정을 하는 드라이버 코드가 있습니다. 이 중에서 다음과 비슷한
코드가 있는지 확인해 보시기 바랍니다.
IORESOURCE_IRQ 라고 되어 있는 부분이 IRQ 지정 부분입니다. .start와 .end 값은 일반적으로
동일합니다. .start와 .end에 들어갈 값이 IRQ 26번이 되어야 합니다. 만약 IRQ 26번으로
선택되어 있음에도 문제가 발생하는 경우라면 IRQ Handler 코드가 잘못되어 있을 가능성도
있습니다.
P.S. USB 장치를 접속했을 때 ohci_irq 함수가 호출된다면 문제가 없다고 봐도 됩니다.
다만 이 경우에는 다른 장치가 INT 26을 공유하고 있다는 의미가 되므로 보드의 회로를
검사해 볼 필요가 있습니다.
진행 중인 보드의
진행 중인 보드의 경우는 아래 같은 코드가 있습니다.
그리하여.....ctags로 쫓아가 보니.
위와 같이 되어 있었습니다.
일단 핸들러의 코드가 문제라고 봐야겠군요.
(사실 커널을 이해하지 못하고 진행하니 더더욱 의문이 쌓입니다만^^;
감사합니다!!
life is only one time
좀 더 정보가 필요할 듯 하군요.
1. 사용중인 보드는 SMDK2443 보드가 맞습니까? (아니라면 H/W의 오류도 감안해야 합니다. 문제는 S3C2443에서 IRQ 26번은 외부 인터럽트가 아닙니다. 만약 외부 요인에 의한 인터럽트라면 커널 소스의 IRQ mapping이 잘못되어 있다고 볼 수도 있습니다만.. OHCI가 켜짐과 동시에 INT 26이 들어온 것으로 보아 그 문제도 가능성이 낮습니다.)
2. 아래 bushi님도 말씀하셨듯이 drivers/usb/host/ochi-hcd.c 파일의 인터럽트 핸들러(ohci_irq 함수)에 printk를 사용하여 몇가지 디버깅 메시지를 출력하도록 해 볼 필요가 있습니다. 먼저 함수 시작 부분에서 진입을 하는지 확인하고 다음 코드의 return 앞 지점에서 확인을 해 줄 필요가 있습니다.
만약 함수 진입을 하지 않고 panic 상태로 들어간다면 커널 설정의 문제일 가능성이 있습니다. 함수 진입 후 IRQ_NOTMINE을 리턴한다면 한가지 더 테스트를 진행해야 합니다.
3. IRQ_NOTMINE의 경우 처음 처리하신 방법대로 IRQ_NOTMINE을 IRQ_HANDLED로 고친 뒤 (USB 메모리 같은) USB 장치를 Host 쪽에 연결하여 인식이 되는지 확인하고 이상이 없다면 문제 없음으로 봐도 무방할 듯 합니다. (INT_USBH의 신호 규격에 대해서는 datasheet에 나와 있지 않아서 확신할 수 없습니다만... Edge trigger일 가능성이 있습니다.) 만약 장치 인식이 되지 않는다면 IRQ_HANDLED로 고치는 것은 잘못된 겁니다. 이 경우 소프트웨어 및 하드웨어 모두 오류 가능성이 있습니다.
부정확한 정보만
부정확한 정보만 나열 할 것 같아 쓰고 지웠습니다.
벤더가 제공한 BSP 커널이라면 일단 모든 것을 의심하고 처음부터 차근차근 들여다봐야 합니다.
h/w fault 가 아니라는 전제하에서, 가장 가능성이 높은 시나리오는 세가지 정도일 것 같습니다.
1. irq 드라이버의 버그로 평소에 unmask 로 되어 있는 바람에 컨트롤러 초기화 중에 발생한 인터럽트에 반응
(request_irq 를 하기 전)
2. 실리콘 버그로 OHCI 스펙상 의미없는 인터럽트 발생
(hcd 자체는 shared irq 에도 대응할 수 있도록 만들어졌습니다.
그러므로 ohci-hcd 는 컨트롤러의 상태를 뒤져서 인터럽트가 발생할 만한 상황이 아닌 경우에 IRQ_NONE 을 리턴하는 것이 정상입니다)
3. irq 번호의 오류
1번과 3번은 쉽게 확인할 수 있습니다.
1번은 핸들러가 호출되는 지 printk 정도로 뭔가 출력해보면 되고,
3번은 request_irq() 에 사용한 인터럽트 번호를 출력시켜보면 되겠죠.
2번은, 원인이 뭐든 간에 저런 현상이 발생한다면, 수정하신 대로 IRQ_NONE 을 리턴하지 않도록 만드는 방법 밖에 없습니다.
shared irq 라면 문제가 또 복잡해지지만... 아닌게 다행이죠.
OTL
...
감사합니다^^
bushi님 조언 해 주셔서 지난 번 작업에 많은 도움을 받았습니다.
life is only one time
댓글 달기