このページは「24環境」の情報です

PINT割り込み

PINT割り込みの話。PINT0〜7はIRQ40,PINT8〜15はIRQ41が発生するのだが、arch/sh/kernel/irq_ipr.c にて、PINT割り込みbitをソフトウェアで判断して、

PINT0  IRQ64
 :
PINT15 IRQ80

に割り振ることができる。割り振っているのは ipr_irq_demux()関数なので、こいつを呼び出さなくてはならない。arch/sh/kernel/io_cat709.c にて

int cat709_irq_demux(int irq){
  irq=ipr_irq_demux(int irq);  // ← 追加
  return cat709_irq_demux_tables[irq];
}

の1行を追加しところPINT0〜PINT7(負論理)がIRQ64〜IRQ72として動作した。しかしPINT8〜15が正常に動作しなかった。arch/sh/kernel/irq_ipr.c を見ると、(適当に編集しているが)

int ipr_irq_demux(int irq)
{
    unsigned long creg, dreg, d, sav;
    if(irq == PINT8_IRQ){
//        creg = PORT_PFCR;
        dreg = PORT_PFDR;
//        sav = ctrl_inw(creg);
//        ctrl_outw(sav | (portcr_mask >> 16), creg);
        d = (~ctrl_inb(dreg) ^ (ctrl_inw(INTC_ICR2) >> 8)) & (ctrl_inw (INTC_INTER) >> 8) & 0xff; 
//        ctrl_outw(sav, creg);
        if(d == 0) return irq;
        return PINT_IRQ_BASE + 8 + pint_map[d];
    }

PORT_PFCR(ポートFコントロールレジスタ)を操作して『その他の機能』に変化させているので暴走?してしまう。このコードの意味がわからないが、とりあえず上のようにコメントアウトしたら正常動作した。

関連リンク

コメント

  • 「その他の機能」ではなくて「入力」にしないといけないようです。私も以前はまりました -- Tango 2004-02-15 (日) 22:30:56
  • たぶんSH-LinuxでPINT割り込みを使っている人がいないのではないかなー。 -- えびはら 2004-02-17 (火) 02:53:20
  • PINT割り込み使ってます、が正常に動作しません。割り込みが入る確認もできません。何かよい方法はないでしょうか? -- SH初心者です 2004-02-17 (火) 15:59:35
  • PINT割り込みは、レベルなので、デバイスが割り込みを発生しているかどうかはテスタで測ってもいいんです。割り込みが入っているかどうか確認するには -- Tango 2004-02-17 (火) 21:11:43
  • ↑supercat:/proc# more interrupts とでもすれば割り込みの要因と回数が確認できますネ -- Tango 2004-02-17 (火) 21:12:54
  • 返信ありがとうございます。ハードで無理やり割り込みを入れたところPINTが確認できました -- SH初心者です 2004-02-18 (水) 18:09:28
  • しかし特定の条件でしか割り込みの確認ができず困っています。 -- SH初心者です 2004-02-18 (水) 18:11:41
  • 条件:メジャー番号41のドライバを組み込みアプリで実行したとき です -- SH初心者です 2004-02-18 (水) 18:14:34
  • enable_irqで割り込み許可をしたら、割り込みが入るものではないんでしょうか? -- SH初心者です 2004-02-18 (水) 19:03:17
  • arch/sh/kernel/irq_ipr.c に↓のパッチをあてたらどうですか? -- えびはら 2004-02-18 (水) 19:19:08
            val |= 1 << (irq - PINT_IRQ_BASE);
            ctrl_outw(val, INTC_INTER);     /* enable PINTn */
            portcr_mask |= 3 << (irq - PINT_IRQ_BASE)*2;
    +
    +       if(irq - PINT_IRQ_BASE < 8)
    +         enable_ipr_irq(PINT0_IRQ);
    +       else
    +         enable_ipr_irq(PINT8_IRQ);
    +
            restore_flags(flags);
     }
  • ドライバー側にrequest_irqもしくはsetup_irqがないとか。。。 -- Tango 2004-02-18 (水) 22:03:48
  • http://www.geocities.co.jp/SiliconValley-Sunnyvale/5444/io_cat709.lzhを落として解凍して247行目以降を参考にしてみてください -- Tango 2004-02-18 (水) 22:09:58
  • PINTER レジスタで PINT割り込みをイネーブルにする! -- えびちゃん 2004-02-18 (水) 22:10:13
  • メジャー番号を変えるとうまくいかないということなのかな? とするとPINT割り込みとは論点が違うかも -- Tango 2004-02-19 (木) 23:50:59
  • すみません、メジャー番号ではなく、IRQ番号41でした。 -- SH初心者 2004-02-20 (金) 09:09:04
  • 「ハードで無理やり割り込みを入れたところPINTが確認できました」 というのは、今までは割り込みを受けるほうばかり考えていたけれど、デバイスが割り込み信号を発生していないなんてことは無いかな? -- Tango 2004-02-20 (金) 21:55:33
  • 上記のipr_irq_demuxはPINT端子が期待するレベルがあれば64〜79(PINT0〜15)の値を返すような仕組みができるのですが、期待するレベルが無い場合には41を返してドライバーとしては空振りさせるようにするのですね。つまり、上記のipr_irq_demuxを使うのであれば、41は空振りするようにして、ドライバーは41は使っちゃだめよということです。 -- Tango 2004-02-20 (金) 22:07:22
  • デバック方法はdo_IRQ関数にprintkを使ってもしIRQ40or41が入ってきた場合出力する -- SH初心者です 2004-02-21 (土) 19:03:02
  • というものです。PINTER イネーブルにしているのですが割り込みが検出できません。 -- SH初心者です 2004-02-21 (土) 19:04:39
  • ドライバ側がIRQを登録(requetirqなどで)しないとソフト的に割り込みは発生しないんでしょうか? -- SH初心者です 2004-02-21 (土) 19:10:28
  • 割り込みに関してはデバイス側に問題はないようです。 -- SH初心者です 2004-02-21 (土) 19:11:59
    int cat709_irq_demux(int irq){
      if(irq == PINT8_IRQ){
    の中でCPUの割り込みレジスタ類を printkしてみるというのはいかがでしょうか? PINT0やPINT8が発生しているのか?そのときのレジスタはどうなのか見てみる必要があります。-- Tango 2004-02-21 (土) 19:35:22
  • 私のほうではこんな風に割り込みが見えます。PINT10(74)にデバイスの割り込みを入れてPINT8のグループの割り込み番号41は使用しません
    Tango:/proc# more interrupts
              CPU0
    14:       8519         IPR-IRQ  ide0
    16:       4880         IPR-IRQ  timer
    23:          0         IPR-IRQ  sci
    24:         64         IPR-IRQ  sci
    25:       3196         IPR-IRQ  sci
    35:          1         IPR-IRQ  NE2000
    36:          3         IPR-IRQ  rtc
    41:          0         IPR-IRQ  PINT8
    74:         12        PINT-IRQ  SL811
    • Tango 2004-02-21 (土) 19:50:06
  • ついでに言うと割込みルーチンの中で printk を使うと割込みルーチンの実効時間が遅くなるのでデバックが終わったらさっさと削ったほうが良いです。それから printk の表示は即時性が無いのですが、即時性を持たせたいときは printk("<1> hogehoge\n"); という具合に <1> を入れましょう。割込みルーチンの中でこのようにすると表示が完了するまで付き合ってくれます。もちろんその分遅いんですが。 -- えびはら 2004-03-01 (月) 23:15:38
  • PINTは色々試してみたのですが、動かすことはできませんでした。printkをやたらと挿入するのは危険なんですね。参考になります。ありがとうございました。 -- SH初心者です 2004-03-10 (水) 10:10:04