CAT709にIDEインターフェースを増設してみた。(えびめも 2003-11-06 より)
配線の量は比較的多いけど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固定とした。
- カーネルパッチ
- 【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 としてマウントできるはずだ。
関連リンク
コメント