kernel 2.4 の ISAPnP の文書は linux/Documentations/isapnp.txtです。 ISAPnP のソースファイル群は linux/drviers/pnp/以下にあります。 kernel 2.4 で ISAPnP を有効にするには、 kernel 再構築の時に CONFIG_ISAPNP=y または mを指定します。
kernel 2.4 ISAPnP のパラメータを下記に示します。通常は使う必要は無いと 思います。このパラメータは ISAPnP がモジュールの場合に使います。
/etc/modules.confに下記のように、行を追加して使用します。 option isapnp isapnp_rdp=0x203,isapnp_reset=0
凡例
論理値が真のとき、ISAPnP をサポートしません。論理値が偽のとき、ISAPnP を サポートします。初期値は偽です。
ISAPnP の'Read Data Port'を指定します。ISAPnP の規格を参考にしてください。
ISAPnP を設定するとき、すべての ISAPnP カードをリセット(バスから切り離す)する か否か、指定します。論理値が真のとき、リセットします。初期値は真で、 ISAPnP カードをリセットします。
論理値が真のとき PCI のリソースを無視します。論理値が偽のとき、PCI と ISAPnP で、リソースの競合が起きないように、ISAPnPを設定します。初期値は偽 です。
ISAPnP サポートの出力するメッセージのモードを指定します。初期値は 1 です。
ISAPnP で使用しない IRQ 番号を指定します。初期値はすべての IRQ 番号を使います。
ISAPnP で使用しない DMA 番号を指定します。初期値はすべての DMA 番号を使い ます。
ISAPnP で使用しない I/O アドレスを指定します。 初期値はすべての I/O アドレ スを使います。
ISAPnP で使用しない メモリアドレスを指定します。初期値はすべてのメモリアドレスを使用します。
kernel 2.4 での ISAPnP サポートは /proc/isapnp を使用します。 /proc/isapnp を読み出して設定を調べ、適切な設定を /proc/isapnp へ書き込みます。 /proc 以下に isapnp が無い場合、kernel で 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 への書き込みにより、ISAPnP を設定します。
kernel 2.4 の文書 linux/Documents/isapnp.txtを参考にしてください。 /proc/isapnp を読み出した結果を基に、設定します。 /proc/isapnp へ書き込むコマンドは下記の通りです。
一番最初に ISAPnP カードを指定します。番号とベンダ名を指定します。通常、 番号は 0 です。ベンダ名は /proc/isapnp から Card n 'ベンダ:....' のようにわかります。
ISAPnP カードの設定したい論理デバイスを指定します。番号と論理デバイス名 は /proc/isapnp から Logical device 番号 '論理デバイス名:'の ようにわかります。
指定した、論理デバイスを自動的に設定します。たぶん、あなたの 望んだような結果には、ならないでしょう。
指定した論理デバイスの I/O ポートアドレスを設定します。 番号は /proc/isapnp での Port の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している I/O ポートアドレス を /proc/ioports から調べて、設定します。
指定した論理デバイスの IRQ を指定します。 番号は /proc/isapnp での IRQ の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している IRQ を /proc/interrupts から調べて、設定します。
指定した論理デバイスの DMA を設定します。 番号は /proc/isapnp での DMA の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果と PC の現在使用している DMA を /proc/dma から調べて、設定します。
指定した論理デバイスのメモリアドレスを設定します。 番号は /proc/isapnp での Memory の順番を指定します。 最初の番号は 0 にします。 値は /proc/isapnp を読み出した結果から、設定します。 I/O が使用しているメモリは /proc/iomem や /sbin/lspci コマンドで調べられます。
ISAPnP の論理デバイスのレジスタの値を変更します。特殊なコマンドです。
指定した論理デバイスを無効にします。
指定した論理デバイスを有効にします。最後にこれを指定しないと、設定はすべて 無視されます。(isapnp_proc.c では先頭の 3 文字だけ検査しています)
下記に設定例を示します。
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 アナログモデムは自動設定で、動作していますので、設定はしていません。
設定が正しいか試験してみましょう。
#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
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