このページは「24環境」の情報です
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
- たぶんSH-LinuxでPINT割り込みを使っている人がいないのではないかなー。 -- えびはら
- PINT割り込み使ってます、が正常に動作しません。割り込みが入る確認もできません。何かよい方法はないでしょうか? -- SH初心者です
- PINT割り込みは、レベルなので、デバイスが割り込みを発生しているかどうかはテスタで測ってもいいんです。割り込みが入っているかどうか確認するには -- Tango
- ↑supercat:/proc# more interrupts とでもすれば割り込みの要因と回数が確認できますネ -- Tango
- 返信ありがとうございます。ハードで無理やり割り込みを入れたところPINTが確認できました -- SH初心者です
- しかし特定の条件でしか割り込みの確認ができず困っています。 -- SH初心者です
- 条件:メジャー番号41のドライバを組み込みアプリで実行したとき です -- SH初心者です
- enable_irqで割り込み許可をしたら、割り込みが入るものではないんでしょうか? -- SH初心者です
- arch/sh/kernel/irq_ipr.c に↓のパッチをあてたらどうですか? -- えびはら
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
- http://www.geocities.co.jp/SiliconValley-Sunnyvale/5444/io_cat709.lzhを落として解凍して247行目以降を参考にしてみてください -- Tango
- PINTER レジスタで PINT割り込みをイネーブルにする! -- えびちゃん
- メジャー番号を変えるとうまくいかないということなのかな?
とするとPINT割り込みとは論点が違うかも -- Tango
- すみません、メジャー番号ではなく、IRQ番号41でした。 -- SH初心者
- 「ハードで無理やり割り込みを入れたところPINTが確認できました」 というのは、今までは割り込みを受けるほうばかり考えていたけれど、デバイスが割り込み信号を発生していないなんてことは無いかな? -- Tango
- 上記のipr_irq_demuxはPINT端子が期待するレベルがあれば64〜79(PINT0〜15)の値を返すような仕組みができるのですが、期待するレベルが無い場合には41を返してドライバーとしては空振りさせるようにするのですね。つまり、上記のipr_irq_demuxを使うのであれば、41は空振りするようにして、ドライバーは41は使っちゃだめよということです。 -- Tango
- デバック方法はdo_IRQ関数にprintkを使ってもしIRQ40or41が入ってきた場合出力する -- SH初心者です
- というものです。PINTER イネーブルにしているのですが割り込みが検出できません。 -- SH初心者です
- ドライバ側がIRQを登録(requetirqなどで)しないとソフト的に割り込みは発生しないんでしょうか? -- SH初心者です
- 割り込みに関してはデバイス側に問題はないようです。 -- SH初心者です
int cat709_irq_demux(int irq){
if(irq == PINT8_IRQ){
の中でCPUの割り込みレジスタ類を
printkしてみるというのはいかがでしょうか?
PINT0やPINT8が発生しているのか?そのときのレジスタはどうなのか見てみる必要があります。-- Tango
- 私のほうではこんな風に割り込みが見えます。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
- ついでに言うと割込みルーチンの中で printk を使うと割込みルーチンの実効時間が遅くなるのでデバックが終わったらさっさと削ったほうが良いです。それから printk の表示は即時性が無いのですが、即時性を持たせたいときは printk("<1> hogehoge\n"); という具合に <1> を入れましょう。割込みルーチンの中でこのようにすると表示が完了するまで付き合ってくれます。もちろんその分遅いんですが。 -- えびはら
- PINTは色々試してみたのですが、動かすことはできませんでした。printkをやたらと挿入するのは危険なんですね。参考になります。ありがとうございました。 -- SH初心者です