トップ «前の日記(2003年08月30日) 最新 次の日記(2003年09月04日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2003年08月31日

CAT709

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