[진행 중] OHCI 메시지가 발생합니다.

bus710의 이미지

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 시키면 저런 메시지가 뜹니다.

예상키로는 인터럽트를 잘 처리하지 못해서 그런 것 같습니다.
위와 유사한 메시지에 대처한 경험이 있으신 분 계십니까??

grassman의 이미지

커널 소스에서 OHCI 장치에 대한 platform driver 쪽의 설정을 다시 맞춰 줘야 할 것 같네요. IRQ 번호를 잘못 지정했습니다.

bus710의 이미지

감사합니다^^

kernel/drivers/usb/core/hcd.c
usb_hcd_irq() 함수
 
       if (hcd->driver->irq (hcd, r) == IRQ_NONE)
                return IRQ_HANDLED;
                //return IRQ_NONE;

위의 구문대로 해당 리턴 값을 변경하여 강제로 입막음을 하였습니다;;

이러한 작업은 kernel/drivers/usb/host/ohci-hcd.c 146라인 의 주석을 근거로 하였습니다.

/*
 * On architectures with edge-triggered interrupts we must never return
 * IRQ_NONE.
 */
#if defined(CONFIG_SA1111)  /* ... or other edge-triggered systems */
#define IRQ_NOTMINE     IRQ_HANDLED
#else
#define IRQ_NOTMINE     IRQ_NONE
#endif

여러개의 USB 장치를 물리는 작업이 아니라서 일단 핸들러 신호를 무시하는 쪽으로
진행하였으며 이에 대한 부작용이 없는지는 좀 더 살펴 보아야 할 것 같습니다....^^

* 관련 작업은 연구실 선배의 도움을 많이 받았습니다^^;

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

grassman의 이미지

USB Interrupt를 무시할 경우에는 USB 장치 동작이 원활하지 않게 될 가능성이 높아집니다.
커널 소스를 보시면 arch/arm/mach-s3c2443 또는 arch/arm/plat-s3c24xx 디렉토리 내에
보드의 자원에 대한 설정을 하는 드라이버 코드가 있습니다. 이 중에서 다음과 비슷한
코드가 있는지 확인해 보시기 바랍니다.

static struct resource s3c_usb_resource[] = {
        [0] = {
                .start = S3C24XX_PA_USBHOST,
                .end   = S3C24XX_PA_USBHOST + S3C24XX_SZ_USBHOST - 1,
                .flags = IORESOURCE_MEM,
        },
        [1] = {
                .start = IRQ_USBH,
                .end   = IRQ_USBH,
                .flags = IORESOURCE_IRQ,
        }
};
 
static u64 s3c_device_usb_dmamask = 0xffffffffUL;
 
struct platform_device s3c_device_usb = {
        .name             = "s3c2410-ohci",
        .id               = -1,
        .num_resources    = ARRAY_SIZE(s3c_usb_resource),
        .resource         = s3c_usb_resource,
        .dev              = {
                .dma_mask = &s3c_device_usb_dmamask,
                .coherent_dma_mask = 0xffffffffUL
        }
};

IORESOURCE_IRQ 라고 되어 있는 부분이 IRQ 지정 부분입니다. .start와 .end 값은 일반적으로
동일합니다. .start와 .end에 들어갈 값이 IRQ 26번이 되어야 합니다. 만약 IRQ 26번으로
선택되어 있음에도 문제가 발생하는 경우라면 IRQ Handler 코드가 잘못되어 있을 가능성도
있습니다.

P.S. USB 장치를 접속했을 때 ohci_irq 함수가 호출된다면 문제가 없다고 봐도 됩니다.
다만 이 경우에는 다른 장치가 INT 26을 공유하고 있다는 의미가 되므로 보드의 회로를
검사해 볼 필요가 있습니다.

bus710의 이미지

진행 중인 보드의 경우는 아래 같은 코드가 있습니다.

// kernel/arch/arm/mach-s3c24xx/devs.c
/* USB Host Controller */
 
static struct resource s3c_usb_resource[] = {
        [0] = {
                .start = S3C_PA_USBHOST,
                .end   = S3C_PA_USBHOST + S3C_SZ_USBHOST,
                .flags = IORESOURCE_MEM,
        },
        [1] = {
                .start = IRQ_USBH,
                .end   = IRQ_USBH,
                .flags = IORESOURCE_IRQ,
        }
};
 
static u64 s3c_device_usb_dmamask = 0xffffffffUL;
 
struct platform_device s3c_device_usb = {
        .name             = "s3c-ohci",
        .id               = -1,
        .num_resources    = ARRAY_SIZE(s3c_usb_resource),
        .resource         = s3c_usb_resource,
        .dev              = {
                .dma_mask = &s3c_device_usb_dmamask,
                .coherent_dma_mask = 0xffffffffUL
        }
};
 
EXPORT_SYMBOL(s3c_device_usb);

그리하여.....ctags로 쫓아가 보니.

// kernel/include/asm-arm/arch-s3c24xx/irqs_s3c2443.h
#define IRQ_USBH        S3C2443_IRQ(26)

위와 같이 되어 있었습니다.
일단 핸들러의 코드가 문제라고 봐야겠군요.
(사실 커널을 이해하지 못하고 진행하니 더더욱 의문이 쌓입니다만^^;

감사합니다!!

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

grassman의 이미지

1. 사용중인 보드는 SMDK2443 보드가 맞습니까? (아니라면 H/W의 오류도 감안해야 합니다. 문제는 S3C2443에서 IRQ 26번은 외부 인터럽트가 아닙니다. 만약 외부 요인에 의한 인터럽트라면 커널 소스의 IRQ mapping이 잘못되어 있다고 볼 수도 있습니다만.. OHCI가 켜짐과 동시에 INT 26이 들어온 것으로 보아 그 문제도 가능성이 낮습니다.)

2. 아래 bushi님도 말씀하셨듯이 drivers/usb/host/ochi-hcd.c 파일의 인터럽트 핸들러(ohci_irq 함수)에 printk를 사용하여 몇가지 디버깅 메시지를 출력하도록 해 볼 필요가 있습니다. 먼저 함수 시작 부분에서 진입을 하는지 확인하고 다음 코드의 return 앞 지점에서 확인을 해 줄 필요가 있습니다.

        /* interrupt for some other device? */
        } else if ((ints &= ohci_readl (ohci, &regs->intrenable)) == 0) {
                return IRQ_NOTMINE;
        }

만약 함수 진입을 하지 않고 panic 상태로 들어간다면 커널 설정의 문제일 가능성이 있습니다. 함수 진입 후 IRQ_NOTMINE을 리턴한다면 한가지 더 테스트를 진행해야 합니다.

3. IRQ_NOTMINE의 경우 처음 처리하신 방법대로 IRQ_NOTMINE을 IRQ_HANDLED로 고친 뒤 (USB 메모리 같은) USB 장치를 Host 쪽에 연결하여 인식이 되는지 확인하고 이상이 없다면 문제 없음으로 봐도 무방할 듯 합니다. (INT_USBH의 신호 규격에 대해서는 datasheet에 나와 있지 않아서 확신할 수 없습니다만... Edge trigger일 가능성이 있습니다.) 만약 장치 인식이 되지 않는다면 IRQ_HANDLED로 고치는 것은 잘못된 겁니다. 이 경우 소프트웨어 및 하드웨어 모두 오류 가능성이 있습니다.

bushi의 이미지

부정확한 정보만 나열 할 것 같아 쓰고 지웠습니다.

벤더가 제공한 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

bus710의 이미지

감사합니다^^
bushi님 조언 해 주셔서 지난 번 작업에 많은 도움을 받았습니다.

akudoku.net 나는 이것만은 확신하니, 믿고 나아간다.

life is only one time

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.