FreeBSD で PnP の ISA カードの利用法



掲載1997年4月20日


この間、某DOS/Vパ○ダ○スで買った1980円のISAイーサネットカードがPnPだったため、 今回紹介する方法を使いました。製品は赤と白のまだら模様の箱に入っていた NE2000互換のOEM製品です。大量に積んであったから買った人もいるかも。

注:毎度の事ながら、今回説明する方法は私がやったら うまくいっただけで必ずしもうまくいくとは限りません。また、OSが壊れても 保証しません。

  1. まず、ISAのPnP対応のパッチが必要です。

    それでは、PnP対応のパッチと説明が載っている FreeBSD-ISA_PnP_June8.tar.gz をダウンロードしてください。
    ここは会津大学にリンクしていますが、基本的にFreeBSD/2.2.1-RELEASE/xperimnt/ISA_PnPのしたに存在します。その他のダウンロードサイトでも同じです。

  2. ファイルの展開

    適当なディレクトリを作成して、先程ダウンロードしたファイルを展開します。
    % mkdir ~/tmp
    % cp FreeBSD-ISA_PnP_June8.tar.gz ~/tmp
    % zcat FreeBSD-ISA_PnP_June8.tar.gz | tar xvf -
    

    展開が終ったら、FreeBSD-pnp というディレクトリができていると思います。

  3. カードの情報を得る

    次に、カードの持っている情報を得るために pnpinfo というプログラムを作成します。
    % pwd
    ~/tmp/FreeBSD-pnp
    % cd pnpinfo
    % make
    
    make の後に pnpinfo という実行形式のファイルがあると思います。そのプログラムを 実行してください。ここで注意して欲しいのは一般ユーザーでは実行できないので スーパーユーザーになってください。

    % su
    Password:********
    # ./pnpinfo
    Checking for Plug-n-Play devices...
    Trying Read_Port at 203
    Trying Read_Port at 243
    Trying Read_Port at 283
    Card assigned CSN #1
    Board Vendor ID: ACC1660
    Board Serial Number: 0018affc
    Device Description: ACCTON EN166X MPX2 ETHERNET CARD^@
    PnP Version: 1.0
    Vendor Version: 16
    Logical Device ID: @@@9519 (19950000)
    Device supports I/O Range Check
    Vendor register funcs 00
    Compatible Device ID: PNP80d6 (d680d041)
    Device does not decode the full 16-bit ISA address
    I/O Range maximum address: 0x200
    I/O Range maximum address: 0x3e0
    I/O alignment for minimum: 32
    I/O length: 32
    IRQ: 2 3 4 5 10 11 12 15 
    IRQ: High true edge sensitive
    End Tag
    
    ここでは私のカードの情報を出力しました。

  4. カーネルのソースにパッチをあてる

    次に、カーネルのソースにパッチをあてます。 しかし、もしものことを考えて、 ソースのバックアップを取っておきましょう。ハードディスクに余裕のない かたは別にいいです。 ここは、FreeBSDのバージョンによってあてる場所が違います。

    もし、2.1.5の人は

    # cp ~/tmp/FreeBSD-pnp/kernel.patch.2.1.5 /usr/src
    # cd /usr/src
    # patch -p0 < kernel.patch.2.1.5
    

    もし、2.2以上の方は

    # cp ~/tmp/FreeBSD-pnp/kernel.patch.2.2-current /usr/src/sys
    # cd /usr/src/sys
    # patch -p0 < kernel.patch.2.2-current
    
    として下さい。
    ちなみに、私は 3.0-970124-SNAP を使っていますが kernel.patch.2.2-current を 利用しました。

  5. ソースをいじる

    PnPのカードはパッチを当てるだけではダメで、ソースにある一定の情報を書き込んで あげなくてはいけません。そこで、先程つくった pnpinfo を利用してソースに 書き込みます。
    # cd /usr/src/sys/i386/isa
    # vi pnp.c
    
    50行目ぐらいに、
            /* Configuration for the Supra Express 288i PnP */
            {
                    0x00008803,             /* Serial Number */
                            -1,             /* Logical Device Number */
                    {
                            { 15, -1 },     /* Primary IRQ Number, Type */
                            { -1, -1 }      /* Second  IRQ Number, Type */
                    },
                    { -1, -1 },             /* DRQ Number */
                    {
                            0x3e8,          /* Ports 1 */
                               -1,          /* Ports 2 */
                               -1,          /* Ports 3 */
                               -1,          /* Ports 4 */
    
    となっているはずです。ソースの大体50行目から75行目ぐらいまでが Supra Express 288i PnP の情報なので、その後ろに Supra Express 288i PnP の 様に情報を記述します。
    例えば、私の場合は76行目から
            /* Configuration for the ACCTON EN166X MPX2 ETHERNET CARD */
            {
                    0x0018affc,             /* Serial Number */
                            -1,             /* Logical Device Number */
                    {
                            { 11, 3 },      /* Primary IRQ Number, Type */
                            { -1, -1 }      /* Second  IRQ Number, Type */
                    },
                    { -1, -1 },             /* DRQ Number */
                    {
                            0x240,          /* Ports 1 */
                               -1,          /* Ports 2 */
                               -1,          /* Ports 3 */
                               -1,          /* Ports 4 */
                               -1,          /* Ports 5 */
                               -1,          /* Ports 6 */
                               -1,          /* Ports 7 */
                               -1,          /* Ports 8 */
                    },
                    {
                            { -1, -1, -1 }, /* Memory desc1 - base, ctrl, range */
                            { -1, -1, -1 }, /* Memory desc2 - base, ctrl, range */
                            { -1, -1, -1 }  /* Memory desc3 - base, ctrl, range */
                    }
            },
    
    を加えました。大事なのは , です。 これが無いとエラーが出ます。
    私が書き込んだのは Serial Number , Primary IRQ Number, Type ,Ports 1 です。 Serial Number は pnpinfo の情報を利用し、IRQ Number と Ports は Windows95の 設定を見て書き込みました。分からない場所は"-1"を書いておきました。

    また、34行目に

    #include "pnp.h"
    
    とありますが、下記の様に書き換えて下さい。
    #include <i386/isa/pnp.h>
    
    これをしないとカーネルのコンパイルでエラーがでると思います。

  6. カーネルの再コンパイル

    1. 再コンパイルの準備

      /usr/src の下に sys というディレクトリがあるでしょうか? sys はカーネルの 再コンパイルに必要なディレクトリですので、/stand/sysinstall などでインストール して下さい。

    2. 設定ファイルへ追加

      /usr/src/sys/i386/conf の下に自分のマシンの設定ファイルを用意します。GENERIC を コピーして使うのが一般的です。既に用意してある場合はそのファイルをコピーして 使ってください。
      そのファイルに使用するコントローラーとデバイスを書き込みます。新しい コントローラーとして pnp0 を加えます。そして、カードが対応しているデバイス 名を加えます。今回はNE2000互換なのでed0を加えます。
      controller pnp0
      device ed0 at isa? port 0x240 net irq 11 vector edintr
      
      の2行を加えます。

    3. カーネルの再コンパイル

      今度は実際に自分の設定ファイルを使ってカーネルを作り直して下さい。
      # config 設定ファイル
      # cd ../../compile/設定ファイル
      # make depend
      # make 
      

    4. そのカーネルを指定してリブート

      それではできた kernel を / に別の名前でコピーして reboot してみて下さい。 Boot: と出て来たら新しい kernel の名前を指定してあげて下さい。それで でうまく起動したら、dmesg コマンドで本当に認識しているか確認してみて下さい。

      ちなみに私のマシンでは

      Copyright (c) 1992-1996 FreeBSD Inc.
      Copyright (c) 1982, 1986, 1989, 1991, 1993
              The Regents of the University of California.  All rights reserved.
      
      FreeBSD 3.0-970124-SNAP #0: Sun Apr 20 22:46:28 JST 1997
                       :
                       :
      		 :
      Checking for Plug-n-Play devices...
      Board Vendor ID: ACC1660     Board Serial Number: 0018affc
              Configuring (Logical Device 0)
      Probing for devices on the ISA bus:
      sc0 at 0x60-0x6f irq 1 on motherboard
      sc0: VGA color <16 virtual consoles, flags=0x0>
      ed0 at 0x240-0x25f irq 11 on isa
      ed0: address 00:00:e8:18:af:fc, type NE2000 (16 bit)
                        :
      		  :
      
      となっています。

  7. 実際に使ってみよう。

    10Base-Tのクロスケーブルを買ってきてThinkPadと通信してみました。パラレルの 転送よりははるかに早いです。1980円x数枚で家庭内LANを組めるとはいい時代になった ものだ。

AKIYAMA Home Page FreeBSDについて


akiyama@ma1.seikyou.ne.jp