CAT709+HDD

CAT709にIDEインターフェースを増設してみた。(えびめも 2003-11-06 より)
20031106b.jpg 20031106c.jpg
配線の量は比較的多いけどIC1個のみで小さくシンプルにできた。
IDEインターフェースといっても回路的には2年前にcyber205さんと共同開発したCAT68701用の拡張IDEインターフェースと同じだ。SH3のPCMCIAバスタイミングを利用し、アドレスデコーダしかない。IC1個のシンプルな回路だ。PINT割り込み信号はCAT709側が3.3V入力なので5VTTLをそのまま入れてはまずいし論理も反対だからLS05を入れてある。LS05が部品箱になかったので2SC1815トランジスタで代用した。PINTはCAT709側で3.3Vにpullupされているのでオープンコレクタで大丈夫だ。その他の信号はTTLレベルで大丈夫。ICはLSかHCTを使えばいいだろう。HCだとCAT709の出力が3.3Vなのでダメ。回路図にはパスコンは略してあるが電源付近に47uFとICの近くに104を挟むべし。
本当は、IDEの仕様にはデータバスや各信号にLS245相当のバッファと22オームダンピング抵抗を入れろと書かれているのだが、手作りで面倒だったので略した。でも動いたので善としておく。というか略してるものだらけなのでちゃんと基板を作るならIDEの仕様を正しく見て作らなければならないだろう。ATA(IDE)/ATAPIの徹底研究TECHI に詳しく書いてある。
今回IO16#信号はL固定とした。

EXIDE_v1_2.jpg
  • カーネルパッチ
    • 【arch/sh/kernel/io_cat709.c】 初期化部分追加
       int cat709_irq_demux(int irq){
      +  irq=ipr_irq_demux(irq);  // PINT割り込みを使うなら必要
        return cat709_irq_demux_tables[irq];
      }
      
      int setup_cat709(void){
        printk("setup_cat709\n");
      
        cat709_port_map_init();
        /* AX88796 mapped 0x300-0x31f to 0xba004000 */
        cat709_port_map(0x300,0x31f,0xba004000,0);
      
        // CAT709 extened ide interface setup
      #define EXTIDEBASE 0xba00c000
        // linuxから見て0x1f0-0x1f7を、ハードの0xba00c000に1bitシフトで接続している
        cat709_port_map(0x1f0,0x1f7,EXTIDEBASE+0x000,1);
        cat709_port_map(0x3f6,0x3f6,EXTIDEBASE+0x10c,1);
      }
      
       void init_cat709_IRQ(void){
        int i;
        printk("init_cat709_IRQ\n");
       
        ctrl_outb(0x0,   INTC_IRR0); /* clear interrupt request */
        ctrl_outw(0xaaaa,INTC_ICR1);
        ctrl_outb(0x0,   INTC_IRR0); /* clear interrupt request */
       
      +  // CAT709 extened ide interface setup
      +  // PINT割り込みのイネーブラ
      +#define INTC_PINTER 0xa4000014
      +  ctrl_outw(ctrl_inw(INTC_PINTER)|0x0800,INTC_PINTER);
    • 【arch/sh/kernel/irq_ipr.c】こっちはPINT割り込みに関するsh-linuxカーネルの仕様的な?問題修正
       static void enable_pint_irq(unsigned int irq)
       {
               unsigned long val, flags;
        
               save_and_cli(flags);
               val = ctrl_inw(INTC_INTER);
               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);
       }

それからPINT11を使うのでPINT割り込みのページも見て欲しい。下はカーネルコマンドライン。拡張IDE I/Fのベースアドレスが0xba00c000で、ideは0x1f0,0x3f6それから、IRQを75と伝えている。

console=ttySC0,115200 root=1f02 ro ide0=0x1f0,0x3f6,75

root=0301*1 とすれば /dev/hda1 を rootfs としてマウントできるはずだ。

関連リンク

コメント