次のページ 前のページ 目次へ

6. kernel 2.4 の ISAPnP

kernel 2.4 の ISAPnP の文書は linux/Documentations/isapnp.txtです。 ISAPnP のソースファイル群は linux/drviers/pnp/以下にあります。 kernel 2.4 で ISAPnP を有効にするには、 kernel 再構築の時に CONFIG_ISAPNP=y または mを指定します。

6.1 kernel 2.4 ISAPnP のパラメータ

kernel 2.4 ISAPnP のパラメータを下記に示します。通常は使う必要は無いと 思います。このパラメータは ISAPnP がモジュールの場合に使います。

/etc/modules.confに下記のように、行を追加して使用します。
option isapnp isapnp_rdp=0x203,isapnp_reset=0

凡例

isapnp_disable=論理値

論理値が真のとき、ISAPnP をサポートしません。論理値が偽のとき、ISAPnP を サポートします。初期値は偽です。

isapnp_rdp= I/O アドレス

ISAPnP の'Read Data Port'を指定します。ISAPnP の規格を参考にしてください。

isapnp_reset=論理値

ISAPnP を設定するとき、すべての ISAPnP カードをリセット(バスから切り離す)する か否か、指定します。論理値が真のとき、リセットします。初期値は真で、 ISAPnP カードをリセットします。

isapnp_skip_pci_scan=論理値

論理値が真のとき PCI のリソースを無視します。論理値が偽のとき、PCI と ISAPnP で、リソースの競合が起きないように、ISAPnPを設定します。初期値は偽 です。

isapnp_verbose=冗長モード

ISAPnP サポートの出力するメッセージのモードを指定します。初期値は 1 です。

isapnp_reserve_irq=IRQ リスト

ISAPnP で使用しない IRQ 番号を指定します。初期値はすべての IRQ 番号を使います。

isapnp_reserve_dma=DMA リスト

ISAPnP で使用しない DMA 番号を指定します。初期値はすべての DMA 番号を使い ます。

isapnp_reserve_io=I/O アドレスリスト

ISAPnP で使用しない I/O アドレスを指定します。 初期値はすべての I/O アドレ スを使います。

isapnp_reseve_mem=メモリアドレスリスト

ISAPnP で使用しない メモリアドレスを指定します。初期値はすべてのメモリアドレスを使用します。

6.2 /proc/isapnp

kernel 2.4 での ISAPnP サポートは /proc/isapnp を使用します。 /proc/isapnp を読み出して設定を調べ、適切な設定を /proc/isapnp へ書き込みます。 /proc 以下に isapnp が無い場合、kernel で isapnp が有効になっていません。

/proc/isapnp の読み出し例

/proc/isapnp を読み出すと下記のような項目が出力されます。 下記の例では SoundBlaster16 と 33k アナログモデムと 3Com 3C509B の 3 枚 の ISAPnP カードがあります。これは ISAPnP のコンフィグレーションレジスタを 読み出したものです。 /proc/isapnp の読み出し例を簡単に説明します。

Card 1 'CTL0080:Creative ViBRA16CL PnP' PnP version 1.0 Product version1.1
この ISAPnP カードのベンダ名は CTL0080 です。
  Logical device 0 'CTL0041:Audio'
論理デバイス 0 の名前は CTL0041 です。
    Device is active
この論理デバイスはすでに active 有効になっています。
    Active port 0x220,0x330,0x388
    Active IRQ 5 [0x2]
    Active DMA 1,5
現在の設定です。
    Resources 0
      Priority preferred
      Port 0x220-0x220, align 0x0, size 0x10, 16-bit address decoding
      Port 0x330-0x330, align 0x0, size 0x2, 16-bit address decoding
      Port 0x388-0x3f8, align 0x0, size 0x4, 16-bit address decoding
      IRQ 5 High-Edge
      DMA 1 8-bit byte-count compatible
      DMA 5 16-bit word-count compatible
使用可能なリソースです。I/O ポートアドレスは 0x220,0x330,0x388 の三つを
使います。IRQ は 5, DMA は 1 と 5 を使います。
      Alternate resources 0:1
        Priority acceptable
        Port 0x220-0x280, align 0x1f, size 0x10, 16-bit address decoding
        Port 0x300-0x330, align 0x2f, size 0x2, 16-bit address decoding
        Port 0x388-0x3f8, align 0x0, size 0x4, 16-bit address decoding
        IRQ 5,7,2/9,10 High-Edge
        DMA 1,3 8-bit byte-count compatible
        DMA 5,7 16-bit word-count compatible
代替えとなるリソースです。
1 番目の I/O ポートアドレスは 0x220,0x240,0x260,0x280 のうち一つが使えます。
2 番目の I/O ポートアドレスは 0x300,0x330 のどちらかが使えます。
3 番目の I/O ポートアドレスは 0x338 から 4 バイト置きに 0x3f8 まで内、一つ
が使えます。
IRQ は 5,7,2/9,10 の 四つの内、一つが使えます。 2/9 はカスケード接続された割り
込みであることを、示しています。
1 番目の DMA は 1 か 3 が使えます。
2 番目の DMA は 5 か 7 が使えます。

(中略)
  Logical device 1 'CTL7002:Game'
論理デバイス 1 の名前は CTL7002 です。
    Device is not active
この論理デバイスは not active 無効になっています。
    Resources 0
      Priority preferred
      Port 0x200-0x200, align 0x0, size 0x8, 16-bit address decoding
使用可能なリソースです。 I/O ポートアドレスは 0x200 を使います。
      Alternate resources 0:1
        Priority acceptable
        Port 0x200-0x208, align 0x7, size 0x8, 16-bit address decoding
代替えとなるリソースです。 I/O ポートアドレスは 0x200 と 0x208 のどちらかが使
えます。

Card 2 'FUJ0202:FUJITSU Modem 33600 PNP/I2' PnP version 1.0 Product version 0.5
この ISAPnP カードのベンダ名は FUJ0202 です。
  Logical device 0 'FUJ0000:Unknown'
論理デバイス名は FUJ0000 です。
    Supported registers 0x2
    Device is active
    Active port 0x2f8
    Active IRQ 3 [0x3]
    Active DMA 0,0
現在の設定です。
    Resources 0
      Priority acceptable
      Port 0x2f8-0x2f8, align 0x7, size 0x8, 16-bit address decoding
      IRQ 3 High-Edge
使用可能なリソースです。I/O ポートアドレスは 0x2f8, IRQ は 3 を使います。
      Alternate resources 0:1
        Priority acceptable
        Port 0x3f8-0x3f8, align 0x7, size 0x8, 16-bit address decoding
        IRQ 4 High-Edge
代替えとなるリソースです。I/O ポートアドレスは 0x3f8, IRQ は 4 を使います。
      Alternate resources 0:2
        Priority acceptable
        Port 0x3e8-0x3e8, align 0x7, size 0x8, 16-bit address decoding
        IRQ 4 High-Edge
(中略)
      Alternate resources 0:8
        Priority acceptable
        Port 0x100-0xfff8, align 0x7, size 0x8, 16-bit address decoding
        IRQ 3,4,5,7,2/9,10,11,12,15 High-Edge
代替えとなるリソースです。I/O ポートアドレスは 0x100 から 8 バイト置きに
0xfff8 までの内、一つが使えます。
IRQ は 3,4,5,7,2/9,10,11,12,15 の内、どれか一つが使えます。

Card 3 'TCM5098:3Com 3C509B EtherLink III' PnP version 1.0 Product version 1.0
この ISAPnP カードのベンダ名は TCM5098 です。
  Logical device 0 'TCM5098:Unknown'
論理デバイス名は TCM5098です。
    Supported registers 0x2
    Compatible device PNP80f7
論理デバイス名の別名です。
    Device is active
    Active port 0x300
    Active IRQ 10 [0x2]
現在の設定です。
    Resources 0
      Priority preferred
      Port 0x210-0x3e0, align 0xf, size 0x10, 16-bit address decoding
      IRQ 3,5,7,2/9,10,11,12,15 High-Edge
使用可能なリソースです。
I/O ポートアドレスは 0x210 から 16 バイト置きに0x3e0 までの内、一つが
使えます。
IRQ は 3,4,5,7,2/9,10,11,12,15 の内、どれか一つが使えます。
リソースの内 Port と IRQ の表記について簡単に説明します。

Port 0x210-0x3e0, align 0xf, size 0x10, 16-bit address decoding
Port 最小アドレス - 最大アドレス, 境界、大きさ、アクセスモード
使用できるベースアドレスは 最小から最大アドレスの範囲にある値と 境界の論理積の結果、

Port ベースアドレス = 最小アドレスから最大アドレスの範囲の値 & 境界

になります。この場合、0x210,0x220,0x230...0x3d0,0x3e0 となります。

IRQ 3,5,7,2/9,10,11,12,15 High-Edge
IRQ 割り込みのリスト 割り込みトリガの方式
このリストの中から、ひとつを選んで使用できます。 リストの中で 2/9 となっているのはカスケードされた割り込みのことを示しています。

/proc/isapnp への書き込み

/proc/isapnp への書き込みにより、ISAPnP を設定します。

6.3 kernel 2.4 ISAPnP の設定項目

kernel 2.4 の文書 linux/Documents/isapnp.txtを参考にしてください。 /proc/isapnp を読み出した結果を基に、設定します。 /proc/isapnp へ書き込むコマンドは下記の通りです。

card 番号 ベンダ名

一番最初に ISAPnP カードを指定します。番号とベンダ名を指定します。通常、 番号は 0 です。ベンダ名は /proc/isapnp から Card n 'ベンダ:....' のようにわかります。

dev 番号 論理デバイス名

ISAPnP カードの設定したい論理デバイスを指定します。番号と論理デバイス名 は /proc/isapnp から Logical device 番号 '論理デバイス名:'の ようにわかります。

auto

指定した、論理デバイスを自動的に設定します。たぶん、あなたの 望んだような結果には、ならないでしょう。

port 番号 値

指定した論理デバイスの I/O ポートアドレスを設定します。 番号は /proc/isapnp での Port の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している I/O ポートアドレス を /proc/ioports から調べて、設定します。

irq 番号 値

指定した論理デバイスの IRQ を指定します。 番号は /proc/isapnp での IRQ の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している IRQ を /proc/interrupts から調べて、設定します。

dma 番号 値

指定した論理デバイスの DMA を設定します。 番号は /proc/isapnp での DMA の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している DMA を /proc/dma から調べて、設定します。

memory 番号 値

指定した論理デバイスのメモリアドレスを設定します。 番号は /proc/isapnp での Memory の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果から、設定します。 I/O が使用しているメモリは /proc/iomem/sbin/lspci コマンドで調べられます。

poke|pokew|poked レジスタ 値

ISAPnP の論理デバイスのレジスタの値を変更します。特殊なコマンドです。

deactivate

指定した論理デバイスを無効にします。

activate

指定した論理デバイスを有効にします。最後にこれを指定しないと、設定はすべて 無視されます。(isapnp_proc.c では先頭の 3 文字だけ検査しています)

6.4 kernel 2.4 での設定例

下記に設定例を示します。

SoundBlaster16 用の設定です。論理デバイス 1 CTL7002 は'dev 1 CTL7002'となるはず ですが、'dev 0 CTL7002'にしないと、エラーになります。

$cat SB16
card 0 CTL0080
dev 0 CTL0041
port 0 0x220
port 1 0x330
port 2 0x388
irq 0 5
dma 0 1
dma 1 5
active
dev 0 CTL7002
port 0 0x200
active

3C509用の設定です。

$cat 3c509
card 0 TCM5098
dev 0 TCM5098
port 0 0x300
irq  0 10
active

33k アナログモデムは自動設定で、動作していますので、設定はしていません。

6.5 kernel 2.4 での設定の注意

6.6 設定の試験

設定が正しいか試験してみましょう。

#cat SB16 >/proc/isapnp
設定に問題があれば、メッセージが表示されるか、/var/log/messagesに 記録されます。以下にエラーメッセージの例を示します。
Sep 29 21:55:09 localhost kernel: isapnp: device 'CTL7002' order 0 not found
Sep 29 21:55:35 localhost kernel: isapnp: wrong command 'logdev'
設定に問題がなければ、とくにメッセージは表示されず、 /var/log/messagesにも、なにも記録されません。 /proc/isapnp を読み出すと、設定したデバイスが Device is activeに なるはずです。 以下に設定が成功した場合の /proc/isapnp を示します。
Card 1 'CTL0080:Creative ViBRA16CL PnP' PnP version 1.0 Product version 1.1
  Logical device 0 'CTL0041:Audio'
    Device is active
中略
  Logical device 1 'CTL7002:Game'
    Device is active
中略
Card 3 'TCM5098:3Com 3C509B EtherLink III' PnP version 1.0 Product version 1.0
  Logical device 0 'TCM5098:Unknown'
    Supported registers 0x2
    Compatible device PNP80f7
    Device is active

6.7 kernel 2.4 起動時の設定

ISAPnP の設定は、kernel 起動後、できるだけ早く行う必要があります。 ISAPnP の設定には /proc を使用するので、/proc がマウントされた直後に行う のが良いでしょう。 ディストリビューションによっても違いますが、ここでは、RedHat 系の /etc/rc.d/rc.sysinitスクリプトを使う場合を説明します。 /etc/rc.d/rc.sysinit の /proc のマウント直後に下記のように追加します。

mount -t proc /proc /proc
#isapnp in kernel
if [ -d /etc/isapnp.d ]; then
    for i in /etc/isapnp.d/*; do
         echo "ISA PnP setup :$i"
         cat $i >/proc/isapnp
    done
fi

そして、/etc/isapnp.d ディレクトリを作成し、その中に ISAPnP の設 定ファイルを置きます。設定ファイルの内容は kernel 2.4 での設定例を参照してください。

$ls /etc/isapnp.d
3c509  SB16


次のページ 前のページ 目次へ