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

5. ISAPnP について

5.1 ISAPnP の概要

ISAPnP とは ISA Bus に接続された各種 I/O 装置を、ソフトウェアだけで 設定できるようにする仕組みです。ISAPnP は、ISA カード、マザーボード、 BIOS の 全てが対応している必要があります。従って、古いマザーボードでは ISAPnP は 動作しません。

ISA Bus の I/O 装置を動作させるためには、I/O アドレスや IRQ 番号等、 ハードウェアの知識が必要でした。 さらに、I/O アドレスや IRQ 番号等を変更するためには、PC のケースを 開け、ISA カード上のジャンパーピン、スイッチの切り替え、パターンのカットや 半田付けが必要でした。 また、カード固有の設定ソフトウェアが必要なものもありました。

ISAPnP は以下の項目を実現することを目指したものです。

ただし、ISAPnP の単独では、自動的にどの I/O アドレスや IRQ 番号等が 使用できるか、判断することはできません。I/O アドレスや IRQ 番号等は、 マザーボード上の I/O 装置や、PCI デバイスも使用するからです。 また、ISAPnP カードは、BIOS でリソースの割り当てをすれば、 普通の ISA カードとして、使用できます。OS がリソースの設定をする必要は 無いのですが、BIOS の割り当てたリソースは OS の管理外になってしまいます。

ISAPnP カードは、コンフィグレーションレジスタを持っています。 BIOS や OS は このコンフィグレーションレジスタと情報のやり取りをして、 ISAPnP カードの種類や、識別子を読み込み、I/O アドレス や IRQ 番号等の 設定をします。この情報のやり取りをコンフィグレーションと呼びます。

ISAPnP カードはコンフィグレーションには、必ず応答しますが、リソースが 設定されていない場合、 I/O 装置としては反応しません。ISAPnP に対応していない マザーボードのスロットに、ISAPnP カードを挿入した場合、 ISAPnP カードは ただ、電力を消費するだけで、I/O 装置としては、使えません。

5.2 ISAPnP カードの種類

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 でも使用できます。

5.3 デバイスドライバの種類

デバイスドライバはリソース設定方法により、3 種類あります。

I/O ポートアドレスや IRQ が固定されているもの

この種類のデバイスドライバは、ソースファイルを読むか、説明を読んで、固定さ れた I/O ポートアドレスや IRQ を指定するように ISAPnP カードを設定します。

I/O ポートアドレスや IRQ が指定できるもの

デバイスドライバの I/O ポートアドレスや IRQ をカーネルコンパイル時や、 モジュール読み込み時に、指定できるものがあります。その時の設定と、 ISAPnP の設定を同一にします。

ISAPnP の自動設定に対応しているもの

kernel 2.4 の ISAPnP ルーチンが読み込まれたとき、自動的に ISAPnP カードを設定 します。これに対応したデバイスドライバもあります。しかし、正しく設定されない 場合もあります。そのときは、手動で設定する必要があります。

5.4 Linux のリソース管理

Linux では、I/O ポートアドレス、IRQ と DMA は、kernel のサービスルーチンを 呼び出して、登録しないと使用できません。 特定のアドレスの I/O メモリも、kernel の許可がないと、アクセスできません。

注意 --- I/O メモリとは、VRAM 等の I/O として使用しているメモリのことを指し、
         メインメモリの拡張用のメモリのことでは、ありません。
ハードウェアをアクセスするときは、デバイスドライバがこれらのリソースの 登録と、使用許可申請をします。 Linux では、/proc/ ディレクトリ以下の 特殊なファイルを読み出すことで、 現在、使用中のリソースを調べることができます。
/proc/ioports

現在使用中の I/O ポートアドレスを調べることができます。

/proc/interrupts

現在使用中の 割り込み IRQ を調べることができます。

/proc/dma

現在使用中の DMA を調べることができます。

/proc/iomem

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/ 以下に出力されません。

5.5 Linux での ISAPnP サポート

Linux では、以下の方法で ISAPnP をサポートします。

kernel 2.4

kernel 2.4 に組み込まれた機能を使用します。

isapnp tool

kernel 2.0 のころから、サポートされている方法です。kernel 2.4 でも使用でき ます。

ALSA

サウンドカードだけですが、ALSA 自身も ISAPnP をサポートしてます。

5.6 ISAPnP ツールを無効にする方法

ISAPnP ツールは互いに同時に使用することはできません。 例えば、kernel 2.4 の ISAPnP を使用する場合、他の ISAPnP ツールを無効にしなければなりません。

kernel 2.4 の ISAPnP を無効にする方法

kernel 再構築(recompile)のときに、ISAPnP サポートを無効にします。 CONFIG_ISAPNP=n を設定します。 モジュールにしている場合、/etc/modules.conf に下記の行を追加します。

option isapnp isapnp_disable=1

isapnptools を無効にする方法

最も簡単な方法は、isapnptools をアンインストールしてしまうことです。 そうしたくない場合、/sbin/isapnp がどこで実行されているか調べるため、 /etc/rc.d/rc.sysinit 等の初期設定ファイルを解読する必要があります。 RedHat 系の場合、/etc/isapnp.conf のファイル名を変更する方法と、 kernel パラメータに nopnp を渡す方法があります。

ALSA の ISAPnP を無効にする方法

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. ---


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