トップ «前の日記(2003年11月04日) 最新 次の日記(2003年11月07日)» 編集
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年11月06日 曇り

CAT709

CAT709用のIDEインターフェース完成!

配線の量は比較的多いけどIC1個のみで小さくシンプルにできた。
PDF
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
+  cat709_port_map(0x1f0,0x1f7,EXTIDEBASE+(0x1f0<<1),1);
+  cat709_port_map(0x3f6,0x3f6,EXTIDEBASE+(0x3f6<<1),1);
 
  /* cat709 onboard cf socket direct map IDE */
  // cat709_port_map(0x1f0,0x1f7,0xba0001f0,0);
  // cat709_port_map(0x3f6,0x3f6,0xba0003f6,0);
}
 
 
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
+#define INTC_PINTER 0xa4000014
+  ctrl_outw(ctrl_inw(INTC_PINTER)|0x0800,INTC_PINTER);
 
  
【arch/sh/kernel/irq_ipr.c】こっちは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割り込みのページも見て欲しい。下はカーネルコマンドライン。要はIRQを75と伝えている。
console=ttySC0,115200 root=1f02 ro ide0=0x1f0,0x3f6,75
root=0301 とすれば /dev/hda1 を rootfs としてマウントできるはずだ。

このような接続となる。

EK709-CASEに組み込んでみた。CFソケット3箇所ともぶつからず、40Gの2.5inchHDDを内蔵させることができた。天井側にマジックテープで固定してある。アクセスランプはフロントパネル側に穴を開けて取り付けた。いい感じだ。
起動時画面
Kernel command line: console=ttySC0,115200 root=1f02 ro ide0=0x1f0,0x3f6,75
ide_setup: ide0=0x1f0,0x3f6,75
:略
Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4
ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
hda: TOSHIBA MK4018GAS, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 75
hda: attached ide-disk driver.
hda: host protected area => 1
hda: 78140160 sectors (40008 MB), CHS=77520/16/63
Partition check:
 hda: [PTBL] [4864/255/63] hda1 hda2 < hda5 hda6 hda7 hda8 hda9 >
操作は普通のLinuxと同じ。以前ノートPCに使っていたHDDなのでやたらとパテーションが多い。
supercat:~# fdisk /dev/hda
The number of cylinders for this disk is set to 4864.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
 
Command (m for help): p
 
Disk /dev/hda: 255 heads, 63 sectors, 4864 cylinders
Units = cylinders of 16065 * 512 bytes
 
   Device Boot    Start       End    Blocks   Id  System
/dev/hda1   *         1      2432  19535008+   7  HPFS/NTFS
/dev/hda2          2433      4864  19535040    5  Extended
/dev/hda5          2433      3707  10241406    b  Win95 FAT32
/dev/hda6          3708      4011   2441848+  83  Linux
/dev/hda7          4012      4315   2441848+  83  Linux
/dev/hda8          4316      4331    128488+  82  Linux swap
/dev/hda9          4332      4864   4281291   83  Linux
 
Command (m for help): q
 
supercat:~# mount /dev/hda9 /mnt
supercat:~# ls /mnt/
ebihara  guest
supercat:~#
CAT709はSH3のEREA6に最大のwaitを挟んでいるので性能は期待してはいけない。
# hdparm -t /dev/hda
/dev/hda:
 Timing buffered disk reads:  64 MB in 19.09 seconds =  3.35 MB/sec
まぁこんなもんだろう。以前のCAT68701のEX-IDEとほとんど同じだ。裏ワザを使ってCPU CLOCKを176MHzにして実験してみた。
# hdparm -t /dev/hda
/dev/hda:
 Timing buffered disk reads:  64 MB in 17.29 seconds =  3.70 MB/sec
ちょっとは速くなっているがやっぱりwaitが効いていると思われる。WAITレジスタを減らしてみたら効果があると思う。