トップ «前の日記(2003年02月20日) 最新 次の日記(2003年02月22日)» 編集
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年02月21日

CAT709

カーネルソースをきれいに整形した。特に arch/sh/kernel/io_cat709.c と drivers/pcmcia/sh3_ss.c を書き換えて、複数のCFソケットを同時に使えるようにした。

今までは片方のCFしか使えていなかったんだけども両方同時に使えるようになったぞと。

CFはioport 0x000〜0x3ff の間限定でマッピングすることにすることにした。

#define MAPSIZE 0x400
static unsigned long cat709_port_offset[MAPSIZE];
int cat709_port_map(int start, int stop,  unsigned long physaddr){
  int i;
  if(start > MAPSIZE || stop > MAPSIZE){
    printk("<1>cat709_port_map: Bug! start(0x%03x) or stop(0x%03x) > MAPSIZE\n",start,stop);
    return -1;
  }
  printk("<1>cat709_port_map(start(0x%03x),stop(0x%03x),offset(0x%p))\n",start,stop,physaddr);
  for(i=start; i<=stop; i++)
    cat709_port_offset[i]=physaddr;
  return 0;
}
EXPORT_SYMBOL(cat709_port_map);
unsigned long cat709_isa_port2addr(unsigned long offset)
{
  if( offset < MAPSIZE )
    if(cat709_port_offset[offset] > 0)
      return cat709_port_offset[offset] + offset;

あっはははは。自分でも驚いたけどこんな単純な仕掛けが一番速度的にも優位だ。if文を羅列せずに全部オフセット配列とした。メモリ1キロバイトくらい食うけどそんなもんけちらずにスピード優先とした。irqも同じ仕掛けで、動的にdemux()するようにした。この辺はCAT68701でハマった経験を生かしてあらかじめ対策済み。

カードマネージャが 0x000〜0x3ffしか使わないようにするために、/etc/pcmcia/config.opts ファイルを

include port 0x000-0x2ff, port 0x320-0x3ff
としておけば、この範囲しか使わなくなるのでオーケーだ。