ISAPnP とは ISA Bus に接続された各種 I/O 装置を、ソフトウェアだけで 設定できるようにする仕組みです。ISAPnP は、ISA カード、マザーボード、 BIOS の 全てが対応している必要があります。従って、古いマザーボードでは ISAPnP は 動作しません。
ISA Bus の I/O 装置を動作させるためには、I/O アドレスや IRQ 番号等、 ハードウェアの知識が必要でした。 さらに、I/O アドレスや IRQ 番号等を変更するためには、PC のケースを 開け、ISA カード上のジャンパーピン、スイッチの切り替え、パターンのカットや 半田付けが必要でした。 また、カード固有の設定ソフトウェアが必要なものもありました。
ISAPnP は以下の項目を実現することを目指したものです。
ISAPnP カードは、コンフィグレーションレジスタを持っています。 BIOS や OS は このコンフィグレーションレジスタと情報のやり取りをして、 ISAPnP カードの種類や、識別子を読み込み、I/O アドレス や IRQ 番号等の 設定をします。この情報のやり取りをコンフィグレーションと呼びます。
ISAPnP カードはコンフィグレーションには、必ず応答しますが、リソースが 設定されていない場合、 I/O 装置としては反応しません。ISAPnP に対応していない マザーボードのスロットに、ISAPnP カードを挿入した場合、 ISAPnP カードは ただ、電力を消費するだけで、I/O 装置としては、使えません。
ISAPnP カードはリソースの設定のされかたに、幾つかの種類があります。
ISAPnP カード自身が起動時に、BIOS や OS の PnP の設定をしなくとも、 デフォルトのリソースを持つものがあります。デフォルトのリソースを ジャンパーピンや特別なソフトウェアで変更できるものもあります。
ISAPnP カード自身が起動時に BIOS や OS が PnP の設定をしなくとも、 不揮発性メモリに記憶させた、以前のリソースを設定するものがあります。 一度も設定がされなかった場合、デフォルト値が設定される場合と、 何も設定されない場合があります。
初期のISAPnP カードには、単にコンフィグレーションレジスタを追加しただけで、 PnP 対応としたものがあります。
これが、普通のISAPnP カードです。BIOS や OS がリソースを指定します。
起動時に ISAPnP カード自身がリソースを独自に設定するものとして、 SCSI カードがあります。 Boot BIOS ROM 搭載の SCSI ISAPnP カードは、起動時に BIOS や OS の設定が 済む前に、稼働して SCSI bus に接続されたハードディスク等の情報を取得する 必要があるためです。このような ISAPnP カードは ISAPnP に対応していない、 ハードウェアや OS でも使用できます。
デバイスドライバはリソース設定方法により、3 種類あります。
この種類のデバイスドライバは、ソースファイルを読むか、説明を読んで、固定さ れた I/O ポートアドレスや IRQ を指定するように ISAPnP カードを設定します。
デバイスドライバの I/O ポートアドレスや IRQ をカーネルコンパイル時や、 モジュール読み込み時に、指定できるものがあります。その時の設定と、 ISAPnP の設定を同一にします。
kernel 2.4 の ISAPnP ルーチンが読み込まれたとき、自動的に ISAPnP カードを設定 します。これに対応したデバイスドライバもあります。しかし、正しく設定されない 場合もあります。そのときは、手動で設定する必要があります。
Linux では、I/O ポートアドレス、IRQ と DMA は、kernel のサービスルーチンを 呼び出して、登録しないと使用できません。 特定のアドレスの I/O メモリも、kernel の許可がないと、アクセスできません。
注意 --- I/O メモリとは、VRAM 等の I/O として使用しているメモリのことを指し、 メインメモリの拡張用のメモリのことでは、ありません。ハードウェアをアクセスするときは、デバイスドライバがこれらのリソースの 登録と、使用許可申請をします。 Linux では、/proc/ ディレクトリ以下の 特殊なファイルを読み出すことで、 現在、使用中のリソースを調べることができます。
現在使用中の I/O ポートアドレスを調べることができます。
現在使用中の 割り込み IRQ を調べることができます。
現在使用中の DMA を調べることができます。
kernel 2.4 は 現在使用中の I/O メモリを調べることができます。 kernel 2.2 では、現在使用中の I/O メモリを調べる簡単な方法はありません。
デバイスドライバがリソースの登録をするタイミングは二つあり、一つは、 デバイスドライバが kernel に組み込まれた時と、もう一つはデバイスの アクセスが開始(open)された時です。デバイスドライバがリソースを手放す タイミングも二つあり、一つはデバイスドライバが kernel から取り除かれた時と、 もう一つは、デバイスのアクセスが終了(close)した時です。
フロッピーディスク・ドライブデバイスドライバは、デバイスのアクセスが 開始(open)された時にリソースを登録し、デバイスのアクセスが終了(close)した時に リソースを手放します。 したがって、フロッピーディスクドライブは I/O ポートアドレス 0x3f0-0x3f5, 0x3f7-0x3f7, IRQ 6, DMA 2 を使用しますが、フロッピーディスクドライブを 使用していない場合、これらは /proc/ 以下に出力されません。
Linux では、以下の方法で ISAPnP をサポートします。
kernel 2.4 に組み込まれた機能を使用します。
kernel 2.0 のころから、サポートされている方法です。kernel 2.4 でも使用でき ます。
サウンドカードだけですが、ALSA 自身も ISAPnP をサポートしてます。
ISAPnP ツールは互いに同時に使用することはできません。 例えば、kernel 2.4 の ISAPnP を使用する場合、他の ISAPnP ツールを無効にしなければなりません。
kernel 再構築(recompile)のときに、ISAPnP サポートを無効にします。 CONFIG_ISAPNP=n を設定します。 モジュールにしている場合、/etc/modules.conf に下記の行を追加します。
option isapnp isapnp_disable=1
最も簡単な方法は、isapnptools をアンインストールしてしまうことです。 そうしたくない場合、/sbin/isapnp がどこで実行されているか調べるため、 /etc/rc.d/rc.sysinit 等の初期設定ファイルを解読する必要があります。 RedHat 系の場合、/etc/isapnp.conf のファイル名を変更する方法と、 kernel パラメータに nopnp を渡す方法があります。
ALSA の ISAPnP を無効にするには、alsa-driver-* のコンパイル時に、下記のよう にオプションを指定します。ALSA のバージョンによって、少し違うかもしれません。
$./configure --help オプションの確認 $./configure --with-isapnp=no
使用するサウンドカードによっては、alsa-driver-* のコンパイルオプションに 関わりなく、モジュール読み込みのときに ISAPnP を無効にできるかもしれません。 SoundBlaster16 ISAPnP では、snd_isapnp=0 で無効にできます。 以下は、実際に私が使用している例です。
$cat /etc/modules.conf alias eth0 3c509 # --- BEGIN: Generated by ALSACONF, do not edit. --- # --- ALSACONF verion 0.4.3b --- alias char-major-116 snd alias snd-card-0 snd-card-sb16 alias char-major-14 soundcore alias sound-slot-0 snd-card-0 alias sound-service-0-0 snd-mixer-oss alias sound-service-0-1 snd-seq-oss alias sound-service-0-3 snd-pcm-oss alias sound-service-0-8 snd-seq-oss alias sound-service-0-12 snd-pcm-oss options snd snd_major=116 snd_cards_limit=1 snd_device_mode=0666 snd_device_gid= 0 snd_device_uid=0 options snd-card-sb16 snd_isapnp=0 snd_index=0 snd_id=CARD_0 snd_port=0x220 snd_ mpu_port=0x330 snd_irq=5 snd_dma8=1 snd_dma8_size=64 snd_dma16=5 snd_dma16_size= 128 snd_mic_agc=0 # --- END: Generated by ALSACONF, do not edit. ---