ISAPnP-HOWTO 川嶋 勤 Ver 3.0 Mon Nov 31 19:00:00 JST 2002 本文書では Linux で ISAPnP を使う方法を説明しています。本文書は 3 部構 成になっていて、PnP(Plug and Play)の概略、Linux でサポートされている三 つの方法(kernel 2.4 の組み込み機能、isapnptools、サウンドカード限定で すが ALSA)についての具体例、ISAPnP の技術情報について説明しています。 ______________________________________________________________________ 目次 1. 改訂について 2. はじめに 3. この文書の配布について 4. Plug and Play プラグアンドプレイとは 4.1 PnP の実現条件 4.2 PnP の実現方法 4.3 PnP の種類 5. ISAPnP について 5.1 ISAPnP の概要 5.2 ISAPnP カードの種類 5.3 デバイスドライバの種類 5.4 Linux のリソース管理 5.5 Linux での ISAPnP サポート 5.6 ISAPnP ツールを無効にする方法 5.6.1 kernel 2.4 の ISAPnP を無効にする方法 5.6.2 isapnptools を無効にする方法 5.6.3 ALSA の ISAPnP を無効にする方法 6. kernel 2.4 の ISAPnP 6.1 kernel 2.4 ISAPnP のパラメータ 6.2 /proc/isapnp 6.2.1 /proc/isapnp の読み出し例 6.2.2 /proc/isapnp への書き込み 6.3 kernel 2.4 ISAPnP の設定項目 6.4 kernel 2.4 での設定例 6.5 kernel 2.4 での設定の注意 6.6 設定の試験 6.7 kernel 2.4 起動時の設定 7. isapnptools 7.1 isapnptools のインストール 7.2 isapnptools の使い方 7.3 pnpdump の出力 isapnp.conf の例 7.4 isapnptools の設定 7.5 isapnptools とリソースの衝突 7.6 isapnptools による設定例 7.7 isapnptools 起動時の設定 8. ALSA の ISAPnP サポート 8.1 ALSA の設定 9. 参考文献 10. 謝辞 A. ISA Bus について A.1 ISA Bus の歴史と特徴 A.2 現在の ISA Bus A.3 ISA Bus と PC/AT の問題点 A.4 I/O アドレス空間について A.4.1 I/O アドレス空間の問題 A.4.2 ハードウェアへのアクセス B. ISAPnP の仕組み B.1 ISAPnP カードの用語とハードウェア B.1.1 論理デバイス B.1.2 コンフィグレーションレジスタ B.1.3 分離 B.1.4 CSN B.1.5 ISAPnP カードのステート B.1.6 コンフィグレーション時のデータバスドライブ方法 B.1.7 ISAPnP コンフィグレーション時の アクセス方法 B.2 ISAPnP のコンフィグレーション B.2.1 分離の仕組み B.2.2 チェックサムの計算 B.2.3 リソースの読み込み B.2.4 リソースの書き込み B.2.5 リソースの種類 ______________________________________________________________________ 1. 改訂について 本文書は 2001 年 2 月に最初にリリースされました。 kernel 2.4 のバー ジョンアップに伴い、設定の方法が少し変更されたため 2002 年 11 月に改訂 しました。 2. はじめに 本文書は Linux で ISAPnP を使う方法を説明しています。本文書は大別する と 3 つの部分に分かれ、それぞれ PnP の概略、ISAPnP の使い方、ISAPnP の 技術情報について説明しています。 本文書のご利用は自己責任にて、お願いいたします。 3. この文書の配布について copyrighted (c) 2002 Tsutomu Kawashima この文書は GNU パブリックライセンス (GPL) バージョン 2 かそれ以降の条 件、あるいは標準的な Linux ドキュメントプロジェクト (LDP) の条件に基づ いた配布ならば自由にしていただいてかまいません。これらのライセンスはこ のドキュメントが入手できるようなサイトから入手できます。LDP の条件は ( 翻訳をのぞく) いかなる修正も許可していません。修正されたバージョンは GPL の基でのみ配布されるものとすることが可能です。 4. Plug and Play プラグアンドプレイとは Plug and Play 略して PnP は人の手を何ら煩わすことなく、ハードウェアを 挿す (Plug) だけで、使用 (Play) できるようにする仕組みのことです。 PnP を実現するには、広い分野に渡る規格化、標準化が必要です。 4.1. PnP の実現条件 PnP (挿せば使える)を実現するためには、幾つかの条件を規定、規格化する必 要があります。下記の項目で使用している記号について説明します。 [ HD ] ハードウェアで対応 [ HD/OS ] ハードウェア または OS で対応 [ HD+OS ] ハードウェアと OS が協調して対応 [ OS ] OS で対応 PnP (挿せば使える)の実現条件を下記に示します。 [ HD ] 機械的に接続できること 機械的な形状や、ピンの数、オスメスの区別等を規定しないと、挿す (Plug) ことができません。 [ HD ] 電気的に接続できること 機械的に挿せても、電気的に接続できなければなりません。オプション とか、ベンダデファイン(製造元が自由に定義できる部分)が含まれてい ても、いけません。さらに、信号電位、タイミング、ハードウェア上の プロトコルも規定する必要があります。 [ HD/OS ] 接続の有無が判別できること 機械的な機構、電気的な方法、ソフトウェアによる方法等を使用し、接 続の有無が判別できなければなりません。 [ HD/OS ] 分離(isolate)できること バス(Bus)接続ができる機器の場合、個々の機器が分離して、識別でき る必要があります。 [ HD+OS ] 何が接続されているか識別できること 何が接続されているか識別できることが、必要です。多くの PnP の場 合、複数の識別子(種類、製造元、機器、改訂等)を使って、識別をして います。識別子を識別する方法や、識別子の意味が規定されている必要 があります。別の機器と混同しないように、これらの識別子の幾つか は、その PnP の規格団体等で一意に管理されています。 [ HD+OS ] 必要な情報について規定されていること 必要な情報とは、接続されている機種や PnP の規格に依存します。例 えば、PCIの場合、 I/O ポートアドレスや、IRQ 等です。ディスプレ イ・モニタ (DDC)の場合、解像度等です。必要な情報の取り出す方法( プロトコル)や、情報の内容が規定されている必要があります。 [ OS ] リソースの割り当てができること 接続される機器にリソース(I/O ポートアドレスや IRQ 等)の割り当て が必要な場合、現在のリソースと衝突しないように、割り当てることが 必要です。 [ OS ] デバイスドライバの割り当てができること 接続された、機器に対応したデバイスドライバを自動的に見つけ出せる ことが、必要です。人手により、設定する場合、ハードウェアの情報 を、人にとって、わかりやすい方法で、提示する必要があります。デバ イスドライバと機器のリソースが一致するように割り当てることと、デ バイスドライバが割り当てられたリソースで動作できなければ、なりま せん。 4.2. PnP の実現方法 ``PnP の実現条件''を実際にどのように実現しているか、概略を説明します。 [ HD ] 機械的に接続できること・電気的に接続できること これらを実現するには、PnP 対応ハードウェアの供給元に規格を守って もらうしか、ありません。より効果的に、PnP に対応させるため、PnP 規格団体を設立する方法があります。この団体は、シンボルやマークの 制定、ハードウェアの識別子の管理、 PnP 規格の情報(Know-How)の提 供等を行います。ハードウェアの供給元はこの団体に加盟し、PnP 規格 を準拠したものに対して、シンボルの使用許可や、識別子の割り当てを 得ます。一時期の USB のように、規格そのものを団体の加盟者以外に は、秘密にすることもあります(顰蹙を買い、現在 USB 規格は公開され ています)。尚、シンボルやマークは著作権の保護下に置くことで、勝 手に使用できないようにできます。 [ HD/OS ] 接続の有無が判別できること・分離(isolate)できること これらは Bus 接続される ハードウェアに関連する項目です。当初から PnP を目指した Bus 規格では、仕様に織り込み済みですので問題はあ りません。後から、PnP 対応にした ISAPnP では、大きな問題がありま す。 [ HD+OS ] 何が接続されているか識別できること・必要な情報について規 定されていること これらは、PnP 対応ハードウェアに自己紹介させる、仕組みを用意する ことで、実現します。実際には ハードウェアにコンフィグレーション レジスタ群を使用します。このレジスタ群に、ハードウェアの ID(識別 子)や、リソースの情報等を納めます。 [ OS ] リソースの割り当てができること・デバイスドライバの割り当てが できること これらは、OS がリソースとデバイスドライバを管理して、実現しま す。割り当てに必要なリソースの情報はコンフィグレーションレジスタ 群から読み取ります。OS は現在管理しているリソース表から、未使用 のリソースをコンフィグレーションレジスタ群に書き込んで設定し、OS の管理しているリソース表を更新します。デバイスドライバの割り当て は、デバイスドライバの特定と設定の二つの段階に分けられます。デバ イスドライバの特定には、コンフィグレーションレジスタ群から、ID( 識別子)を読み取ることで行います。この ID とデバイスドライバの対 応表(データーベース) から、デバイスドライバを特定します。また は、ID を人にとって理解しやすい方法で、表現し、人にデバイスドラ イバを選んでもらいます(PnP の目的(人手を煩わすことなく)に反しま す)。デバイスドライバが特定できたら、コンフィグレーションレジス タに書き込んだリソース情報と同じものを、デバイスドライバにも適応 します。 4.3. PnP の種類 もともと PnP とは、Intel 社と Microsoft 社により、1993年 3月に発表され た、 "Plug and Play ISA Specification"に由来します。単に PnP といった 場合、ISAPnP のことでした。現在は Plug and Play(挿せば使える)に、対応 したハードウェアや仕組みのことを、すべて PnP と呼んでいます。 PnP に対応したハードウェアはたくさんあります。これらについて、簡単に説 明します。 CPU x86 系の CPU には、CPU の特性が、特別なレジスタに書き込まれてい ます。これを、CPU ID と呼んでいます。 Linux では CPU ID を CPU 内蔵キャッシュメモリ容量の調査と設定、 MTRR の設定に利用していま す。 CPU ID の情報は /proc/cpuinfo で調べることができます。 メモリ(SPD) メモリの種類(EDO, SD, PROM)、容量、ECC やパリティの有無を調べる ことと、タイミング(CAS, RAS のレイテンシー)の設定ができます。 ISAPnP ISA Bus で PnP を実現したものです。``ISAPnP について''で説明しま す。 PCI すべての CPU で共通に使用できることを目指した高速 32bit Bus の規 格です。コネクタやカードの機械的な形状の規定と電気的な特性やタイ ミングの規定と、識別子や、ハードウェアの情報を CPU 等から、読み 書きする方法の規定を含みます。PCI は拡張カードや周辺機器の接続だ けではなく、 Bus そのものの拡張方法やコンピュータ同士の接続につ いても、規格化されています。Linux では、問題なく認識できますが、 拡張カードではデバイスドライバを指定しないと、動作しません。 USB 電源を切ることなく、機器の取り外しや、取り付けができることが特徴 です。手軽に扱えるため、最近は様々な機器のインターフェースに採用 されています。しかし Linux では機器毎にプロトコルが存在するた め、それに対応するのが遅れています(ネットワークに当てはめていう と、パケットの送受はできてるが、サービス ftp smtp pop 等に対応し ていない状況です)。 SCSI-2 コネクタの機械的な形状、ケーブルの特性、電気的な特性やタイミング の規定と、送受するコマンドの規定が規格されています。高速パラレル インターフェースとして、ハードディスクや様々な機器、さらに、コン ピュータまで接続できます。SCSI-2 以前の SCSI は送受するコマンド が規定されていなかったため、機器の組み合わせの相性問題がありまし た。 ATA-3 もともと ATA は IDE ハードディスクの規格でしたが、SCSI コマンド に似た ATAPI コマンドを規定したことで、CDROM, CDR, DVD, テープ、 フロッピーディスク等、多くの機器が接続できるようになりました。 DDC ディスプレイやモニタの特性(解像度等)をビデオカード等から読めるよ うにした規格です。XFree86 4.0 でサポートされるようになりました。 あの面倒くさい Modeline から、解放されるかもしれません。 パラレルポート機器 IBM PC/AT 互換機のパラレルポートが双方向だったことから、発展し IEEE1284 になりました。そして、プリンタ以外にもフロッピーディス クドライブ等、比較的低速なパラレルインターフェースに使用できるよ うになりました。 PC Card 主に、ノートパソコンの拡張用に使用されています。PC Card 規格の起 源は電子手帳に使用するメモリーカードから始まっています。 1986 年 に、最初の規格が JEIDA からガイドラインとして公開されました。そ の後 1989 年にアメリカで、PCMCIA が設立され、1993 年に JEIDA と PCMCIA の規格を統一した PC Card 規格になりました。1997 年に CardBus 規格が発行されました。PnP という言葉の前にできた、最初の PnP です。 Linux では pcmcia-cs として、サポートされてきまし た。kernel 2.4 では、 PC Card のサポートは kernel に組み込まれま した。 略語説明 JEIDA : 日本電子工業振興協会 PCMCIA : Personal Computer Memory Card International Association 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 は以下の項目を実現することを目指したものです。 o PC のケースを開けなくても、I/O アドレスや IRQ 番号等が変更できるこ と。 o カード固有の設定ソフトウェアを不要とすること。 o デバイスドライバが I/O アドレスや IRQ 番号等の変更に対応できるこ と。 ただし、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 ツールを無効にしなければなり ません。 5.6.1. kernel 2.4 の ISAPnP を無効にする方法 kernel 再構築(recompile)のときに、ISAPnP サポートを無効にします。 CONFIG_ISAPNP=n を設定します。モジュールにしている場 合、/etc/modules.conf に下記の行を追加します。 option isapnp isapnp_disable=1 5.6.2. isapnptools を無効にする方法 最も簡単な方法は、isapnptools をアンインストールしてしまうことです。そ うしたくない場合、/sbin/isapnp がどこで実行されているか調べるため、 /etc/rc.d/rc.sysinit 等の初期設定ファイルを解読する必要があります。 RedHat 系の場合、/etc/isapnp.conf のファイル名を変更する方法と、 kernel パラメータに nopnp を渡す方法があります。 5.6.3. 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. --- 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 凡例 o 論理値 --- 偽は 0 、真は 0 以外の整数で 32bit です。 o I/O アドレス --- 0 から 0x3ff までの整数です。 o I/O リスト -- 上記 I/O アドレスを","で繋げたものです。最大で 16 項 目までです。例 100,0x210。 o IRQ 番号 --- 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15です。 o IRQ リスト --- 上記 IRQ 番号を","で繋げたものです。最大で 16 項目ま でです。例 9,10,11,12。 o DMA 番号 --- 0 から 7 までの整数です。 o DMA リスト --- 上記 DMA 番号を","で繋げたものです。最大で 8 項目ま でです。例 1,5。 o メモリアドレスリスト --- 0 から 1048575 (0xfffff)のメモリアドレスを ","で繋げたものです。最大 16 項目までです。 o 冗長モード --- 0,1,2のいずれかです。 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 が有効に なっていません。 6.2.1. /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 と なっているのはカスケードされた割り込みのことを示しています。 6.2.2. /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 での設定の注意 o 設定は ISAPnP カード毎にしてください。 o 設定に空行を含めないようにしてください。 o デバイスドライバが読み込まれる前に設定してください。 o 他の ISAPnP 設定プログラムと併用しないでください。 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 7. isapnptools isapnptools は Linux で比較的古くから、サポートされている ISAPnP 設定 ツールです。isapnptools はコンフィグレーションレジスタを読み出して、標 準出力する pnpdumpコマンドと ISAPnP カードを設定する isapnp コマンドの ふたつのコマンドから、構成されています。 pnpdump の標準出力をファイル にしたものを編集して、isapnp の設定に使います。下記では、この設定ファ イルを isapnp.conf と呼びます。 たぶん、isapnptools は 既にご使用中の Linux にインストールされているで しょう。ここでは、念のためインストールから説明します。 7.1. isapnptools のインストール isapnptools の最新版はisapnptoolsのウェブサイト から入手できます。 2002 年 10 月現在の最新版は (09-May-201 にリリースされた) isapnptools-1.26.tgzです。適当なディレクトリ(ここでは~/Src)に isapnptools-1.26.tgz をダウンロードしたら、展開し、コンパイル、インス トールします。 下記の文で、##はコメントです。 $ tar tvzf isapnptools-1.26.tgz ##中身を確認します。 $ tar xzf isapnptools-1.26.tgz ##展開します。 $ cd isapnptools-1.26 $ less README ##README は必ず読みましょう $ less doc/* ##文書に 一通り目を通しましょう。 $ ./configure --help ##どんなオプションがあるか確認します。 $ ./configure ##オプションなしで、良いみたいです。 $ make ## コンパイルエラーが出たら、下記を参照。 $ su # make install ##インストールします。 # exit $ 尚、標準では、オブジェクトや man ページは /usr/local/ にインストールされます (configure のオプションで変更できます)。 ディストリビュータの isapnptools で は、/sbin/isapnp, /sbin/pnpdump, /usr/share/man/man5/isapnp.conf.5.gz と インストールされることが多いようです。 古い isapnptools-1.23 には、残念なことバグがありますの で、isapnptools-1.23/src/pnpdump_main.c の 87 行目を下記のように変更し ます。 static FILE* o_file = NULL; 7.2. isapnptools の使い方 isapnptools では、pnpdump で ISAPnP カードの設定を読み出し、それを編集 し、 isapnp コマンドで設定する方法を取ります。例えば下記のようにしま す。 $ su # /usr/local/sbin/pnpdump >isapnp.conf # vi isapnp.conf # /usr/local/sbin/isapnp -c isapnp.conf # exit 7.3. pnpdump の出力 isapnp.conf の例 pnpdump は下記のような項目を出力します。kernel 2.4 の /proc/isapnp よ りも、解りやすいのでしょう。これを適切に編集し、isapnp コマンドの設定 ファイルにします。 下記の例では SoundBlaster16 と 33k アナログモデムと 3Com 3C509B の 3 枚の ISAPnP カードがあります。これは ISAPnP のコンフィグレーションレジ スタを読み出したものですから、 kernel 2.4 の /proc/isapnp と同一の内容 を表しています。ここでは、下記の出力 isapnp.conf の例を簡単に説明しま す。 #以降はコメントで、isapnp コマンドは無視します。 # $Id: ISAPnP-HOWTO.sgml,v 1.3 2002/11/30 11:14:44 mdk Exp $ # Release isapnptools-1.24 # # This is free software, see the sources for details. # This software has NO WARRANTY, use at your OWN RISK # # For details of the output file format, see isapnp.conf(5) # # For latest information and FAQ on isapnp and pnpdump see: # http://www.roestock.demon.co.uk/isapnptools/ # isapnptools そのものの説明です。 # Compiler flags: -DREALTIME -DHAVE_PROC -DENABLE_PCI -DHAVE_SCHED_SETSCHEDULER -DHAVE_NANOSLEEP -DWANT_TO_VALIDATE isapnptools をコンパイルしたときのフラグです。 # # Trying port address 0273 # Board 1 has serial identifier 9a ff ff ff ff 80 00 8c 0e # Board 2 has serial identifier 50 30 80 03 e5 02 02 aa 1a # Board 3 has serial identifier 08 97 19 38 e6 98 50 6d 50 # (DEBUG) (READPORT 0x0273) (ISOLATE PRESERVE) (IDENTIFY *) (VERBOSITY 2) (CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING これらは、isapnp コマンドへの指示です。 # Card 1: (serial identifier 9a ff ff ff ff 80 00 8c 0e) # Vendor Id CTL0080, No Serial Number (-1), checksum 0x9A. # Version 1.0, Vendor version 1.1 # ANSI string -->Creative ViBRA16CL PnP<-- # # Logical device id CTL0041 # Device supports vendor reserved register @ 0x39 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f 1 枚目のカードの説明です。 # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy (CONFIGURE CTL0080/-1 (LD 0 # ANSI string -->Audio<-- 1つめの論理デバイスの設定です。 # Multiple choice time, choose one only ! 選択候補はたくさんあるけれど、ひとつだけ選んでね。 # Start dependent functions: priority preferred 選択候補その 1 です。 # IRQ 5. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 5 (MODE +E))) IRQ 5 を使います。 # First DMA channel 1. # 8 bit DMA only # Logical device is a bus master # DMA may execute in count by byte mode # DMA may not execute in count by word mode # DMA channel speed in compatible mode # (DMA 0 (CHANNEL 1)) 1 番目の DMA の設定です。DMA 1 を使います。 # Next DMA channel 5. # 16 bit DMA only # Logical device is a bus master # DMA may not execute in count by byte mode # DMA may execute in count by word mode # DMA channel speed in compatible mode # (DMA 1 (CHANNEL 5)) 2 番目の DMA の設定です。DMA 5 を使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0220 # Maximum IO base address 0x0220 # IO base alignment 1 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0220)) 1 番目の I/O ポートアドレスの設定で、16 バイト分、0x220 から使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0330 # Maximum IO base address 0x0330 # IO base alignment 1 bytes # Number of IO addresses required: 2 # (IO 1 (SIZE 2) (BASE 0x0330)) 2 番目の I/O ポートアドレスの設定で、2 バイト分、0x330 から使います。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0388 # Maximum IO base address 0x0388 # IO base alignment 1 bytes # Number of IO addresses required: 4 # (IO 2 (SIZE 4) (BASE 0x0388)) 3 番目の I/O ポートアドレスの設定で、4 バイト分、0x388 から使います。 # Start dependent functions: priority acceptable 代替えとなるリソースの設定です。 # IRQ 5, 7, 9 or 10. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 5 (MODE +E))) IRQ は 5,7,9,10 の四つの内、一つが使えます。 # First DMA channel 1 or 3. # 8 bit DMA only # Logical device is a bus master # DMA may execute in count by byte mode # DMA may not execute in count by word mode # DMA channel speed in compatible mode # (DMA 0 (CHANNEL 1)) 1 番目の DMA は 1 か 3 が使えます。 # Next DMA channel 5 or 7. # 16 bit DMA only # Logical device is a bus master # DMA may not execute in count by byte mode # DMA may execute in count by word mode # DMA channel speed in compatible mode # (DMA 1 (CHANNEL 5)) 2 番目の DMA は 5 か 7 が使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0220 # Maximum IO base address 0x0280 # IO base alignment 32 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0220)) 1 番目の I/O ポートアドレスは 0x220,0x240,0x260,0x280 のうち一つが使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0300 # Maximum IO base address 0x0330 # IO base alignment 48 bytes # Number of IO addresses required: 2 # (IO 1 (SIZE 2) (BASE 0x0300)) 2 番目の I/O ポートアドレスは 0x300,0x330 のどちらかが使えます # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0388 # Maximum IO base address 0x0388 # IO base alignment 1 bytes # Number of IO addresses required: 4 # (IO 2 (SIZE 4) (BASE 0x0388)) 3 番目の I/O ポートアドレスは 0x338 から 4 バイト置きに 0x3f8 までの内、一つ が使えます。 中略 # End dependent functions (NAME "CTL0080/-1[0]{Audio }") # (ACT Y) 設定を有効にするときに、# をはずします。 )) 1 番目の論理デバイスの設定の終わりです。 # Logical device id CTL7002 # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x39 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy (CONFIGURE CTL0080/-1 (LD 1 # ANSI string -->Game<-- 2 番目の論理デバイスの設定です。 # Multiple choice time, choose one only ! # Start dependent functions: priority preferred # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0200 # Maximum IO base address 0x0200 # IO base alignment 1 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x0200)) I/O ポートアドレスは 0x200 を使います。 # Start dependent functions: priority acceptable # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0200 # Maximum IO base address 0x0208 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x0200)) 代替えとなるリソースです。I/O ポートアドレスは 0x200 と 0x208 のどちらかが 使えます。 # End dependent functions (NAME "CTL0080/-1[1]{Game }") # (ACT Y) 設定を有効にするときに、# をはずします。 )) 2 番目の論理デバイスの設定の終わりです。 # End tag... Checksum 0x00 (OK) # Card 2: (serial identifier 50 30 80 03 e5 02 02 aa 1a) # Vendor Id FUJ0202, Serial Number 813695973, checksum 0x50. # Version 1.0, Vendor version 0.5 # ANSI string -->FUJITSU Modem 33600 PNP/I2<-- # # Logical device id FUJ0000 # Device supports I/O range check register # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy 2 枚目の カードの説明です。 (CONFIGURE FUJ0202/813695973 (LD 0 一つ目の論理デバイスの設定です。 # Multiple choice time, choose one only ! # Start dependent functions: priority acceptable # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x02f8 # Maximum IO base address 0x02f8 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x02f8) (CHECK)) I/O ポートアドレスは 0x2f8 を使います。 # IRQ 3. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 3 (MODE +E))) IRQ は 3 を使います。 # Start dependent functions: priority acceptable 代替えとなるリソースです。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x03f8 # Maximum IO base address 0x03f8 # IO base alignment 8 bytes # Number of IO addresses required: 8 # (IO 0 (SIZE 8) (BASE 0x03f8) (CHECK)) I/O ポートアドレスは 0x3f8 を使います。 # IRQ 4. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 4 (MODE +E))) IRQ は 4 を使います。 中略 # End dependent functions (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") # (ACT Y) 設定を有効にするときに、# をはずします。 )) # End tag... Checksum 0x00 (OK) 2 番目のカードの設定の終わりです。 # Card 3: (serial identifier 08 97 19 38 e6 98 50 6d 50) # Vendor Id TCM5098, Serial Number 2535012582, checksum 0x08. # Version 1.0, Vendor version 1.0 # ANSI string -->3Com 3C509B EtherLink III<-- # # Logical device id TCM5098 # Device supports I/O range check register # Device supports vendor reserved register @ 0x38 # Device supports vendor reserved register @ 0x3c # Device supports vendor reserved register @ 0x3d # Device supports vendor reserved register @ 0x3f # # Edit the entries below to uncomment out the configuration required. # Note that only the first value of any range is given, this may be changed if required # Don't forget to uncomment the activate (ACT Y) when happy 3 枚目のカードの説明です。 (CONFIGURE TCM5098/2535012582 (LD 0 # Compatible device id PNP80f7 # IRQ 3, 5, 7, 9, 10, 11, 12 or 15. # High true, edge sensitive interrupt (by default) # (INT 0 (IRQ 3 (MODE +E))) IRQ は 3,5,7,9,19,11,12,15 の内 一つが使えます。 # Logical device decodes 16 bit IO address lines # Minimum IO base address 0x0210 # Maximum IO base address 0x03e0 # IO base alignment 16 bytes # Number of IO addresses required: 16 # (IO 0 (SIZE 16) (BASE 0x0210) (CHECK)) I/O ポートアドレスは 16 バイト分を 0x210 から 16 バイト置きに 0x3e0 までの内、 一つが使えます。 (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") # (ACT Y) 設定を有効にするときに、# をはずします。 )) # End tag... Checksum 0x00 (OK) 3 枚目のカードの設定の終わりです。 # Returns all cards to the "Wait for Key" state (WAITFORKEY) すべてのカードの設定の終わりです。 7.4. isapnptools の設定 isapnptools の設定は、pnpdump の標準出力をファイルにしたものを編集し て、 isapnp の設定に使います。この設定ファイルを isapnp.conf と呼びま す。 isapnp.conf の設定は かっこの中に書きます。 isapnp.conf には、ISAPnP カードが使用できるリソースが列記されています ので、必要なリソースに対応した行の先頭にある#を取り去り、リソースを有 効にします。または、リソースの行を適切に編集します。具体的には下記のよ うにします。尚、行番号を説明のために付加しています。 1: (CONFIGURE FUJ0202/813695973 (LD 0 2: 3: # Multiple choice time, choose one only ! 4: 5: # Start dependent functions: priority acceptable 6: # Logical device decodes 16 bit IO address lines 7: # Minimum IO base address 0x02f8 8: # Maximum IO base address 0x02f8 9: # IO base alignment 8 bytes 10: # Number of IO addresses required: 8 2 行目から 10 行目までは、削除してかまいません。 11: # (IO 0 (SIZE 8) (BASE 0x02f8) (CHECK)) (IO 0 (SIZE 8) (BASE 0x02f8)) "#"を取り有効にします。(CHECK) をはずしました。 12: # IRQ 3. 13: # High true, edge sensitive interrupt (by default) 14: # (INT 0 (IRQ 3 (MODE +E))) (INT 0 (IRQ 3 (MODE +E))) "#"を取り有効にします。 15: 16: # Start dependent functions: priority acceptable 17: # End dependent functions 18: (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") 19: # (ACT Y) (ACT Y) "#"を取り有効にします。これを忘れると、設定が反映されません。 20: )) 21: (CONFIGURE TCM5098/2535012582 (LD 0 22: # Compatible device id PNP80f7 23: # IRQ 3, 5, 7, 9, 10, 11, 12 or 15. IRQ は 3,5,7,9,10,11,12,15のどれかを選択します。 24: # High true, edge sensitive interrupt (by default) 25: # (INT 0 (IRQ 3 (MODE +E))) (INT 0 (IRQ 10 (MODE +E))) "#"を取り有効にします。IRQ は 10 にしました。 26: # Logical device decodes 16 bit IO address lines 27: # Minimum IO base address 0x0210 28: # Maximum IO base address 0x03e0 29: # IO base alignment 16 bytes 30: # Number of IO addresses required: 16 I/O ポートアドレスは 0x210 から 16 バイト置きに 0x3e0 の範囲から選択します。 31: # (IO 0 (SIZE 16) (BASE 0x0210) (CHECK)) (IO 0 (SIZE 16) (BASE 0x0300) (CHECK)) "#"を取り有効にします。 I/O ポートアドレスは 0x300 にしました。 32: (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") 33: # (ACT Y) (ACT Y) "#"を取り有効にします。これを忘れると、設定が反映されません。 34: )) 25: (WAITFORKEY) これを整理すると、下記のようになります。 (CONFIGURE FUJ0202/813695973 (LD 0 (IO 0 (SIZE 8) (BASE 0x02f8) ) (INT 0 (IRQ 3 (MODE +E))) (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") (ACT Y) )) (CONFIGURE TCM5098/2535012582 (LD 0 (INT 0 (IRQ 10 (MODE +E))) (IO 0 (SIZE 16) (BASE 0x0300) (CHECK) ) (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") (ACT Y) )) (WAITFORKEY) 7.5. isapnptools とリソースの衝突 isapnptolls はリソースの衝突に敏感です。 ``isapnptools の設定''の中 で、33k アナログモデムの設定で、(CHECK) をはずした行があります(下記に 転記します)。 (IO 0 (SIZE 8) (BASE 0x02f8) ) この I/O ポートアドレス 0x2f8 はマザーボード上の標準シリアルポートで す。この 33k アナログモデムでは、標準のシリアルポートと同じ I/O ポート アドレスを使います。BIOS でマザーボード上の標準シリアルポートは無効に していますが、 kernel によって、自動的にリソースが登録されてしまいま す。そのため、リソースが衝突しているように、見えます。isapnp は (CHECK) が指定してあると、リソースの衝突を発見したとき、その時点で、中 断(abort)してしまいますが、(CHECK) を外すと、エラーは報告しますが、リ ソースの設定も実行し、処理も続行します。 isapnp の設定(pnpdump の出力)でリソースの衝突に関係する部分について、 説明します。 # Compiler flags: isapnptools コンパイル時に "--enable-onreserr" を付けると、 -DABORT_ONRESERR が出力されます。このオプションフラグを付けて、 isapnptools をコンパイルすると、isapnp コマンドは設定とリソース が衝突した場合、処理を中断するようになります。 (CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) リソースが衝突したときの動作を指定します。FATALの場合、致命 的(fatal)なエラーとして、isapnp コマンドは処理を中断します。 WARNINGの 場合、警告(warning)を出力し、処理を続行します。 (IO x (SIZE y) (BASE z) (CHECK)) I/O ポートアドレスの設定に (CHECK)が指定されていた場合、 isapnp コマンドはリソースの衝突を検査(check)します。衝突が発見された場 合、 isapnp コマンドは処理を中断します。 また、isapnp コマンドに、使用禁止のリソースを知らせるファイル /etc/isapnp.gone があります。/etc/isapnp.gone の書式を下記に示します。 IO ベースアドレス , 使用する I/O ポートアドレスの大きさ 使用禁止にする I/O ポートアドレスのベースアドレスとその大きさを 指定します。大きさを省略すると、大きさは 8 バイトになります。 IRQ 番号 使用禁止にする IRQ 番号を指定します。 DMA 番号 使用禁止にする DMA 番号を指定します。 MEM ベースアドレス , 使用するメモリの大きさ 使用禁止にするメモリのベースアドレスと大きさを指定します。 /etc/isapnp.goneの例を下記に示します。 IO 0x3f8,8 IRQ 4 DMA 1 DMA 5 IO 0x378,2 IRQ 7 上記のように、isapnp コマンドはリソースの衝突に敏感です。これは動作と しては、正しいのですが、使い勝手が悪くなります。その理由は下記の通りで す。 ISAPnP を一度設定すると、設定したリソースは当然、使用中になります。二 つある I/O ポートアドレスの内、一つ目は変更せず、二つ目の I/O ポートア ドレスを変更しようとした場合、一つ目のI/O ポートアドレスが使用中のリ ソースと衝突してしまいます。 ISAPnP カードの設定は、電源投入時にのみ、 初期化されます。Linux や Windows 系の OS の再起動では、設定は初期化さ れません。 これを回避するには、isapnp コマンドの設定(pnpdump の出力)を下記のよう にします。 (CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL))を (CONFLICT (IO WARNING)(IRQ FATAL)(DMA FATAL)(MEM FATAL))と FATAL を WARNING に変更する。 (IO x (SIZE y) (BASE z) (CHECK))を (IO x (SIZE y) (BASE z) )と、(CHECK)を削除する。 しかし isapnptools のコンパイル時に --enable-onreserr を指定した場合、 isapnp コマンドの設定(pnpdump の出力)で変更することはできません。 --enable-onreserrを付けずに、isapnptoolsを再コンパイルする必要がありま す。 7.6. isapnptools による設定例 下記に設定例を示します。この設定を/etc/isapnp.confというファイル名で作 成します。 (READPORT 0x0273) (ISOLATE PRESERVE) (IDENTIFY *) (VERBOSITY 2) (CONFLICT (IO WARNING)(IRQ WARNING)(DMA WARNING)(MEM WARNING)) (CONFIGURE CTL0080/-1 (LD 0 (INT 0 (IRQ 5 (MODE +E))) (DMA 0 (CHANNEL 1)) (DMA 1 (CHANNEL 5)) (IO 0 (SIZE 16) (BASE 0x0220)) (IO 1 (SIZE 2) (BASE 0x0330)) (IO 2 (SIZE 4) (BASE 0x0388)) (NAME "CTL0080/-1[0]{Audio }") (ACT Y) )) (CONFIGURE CTL0080/-1 (LD 1 # (IO 0 (SIZE 8) (BASE 0x0200)) (NAME "CTL0080/-1[1]{Game }") # (ACT Y) )) (CONFIGURE FUJ0202/813695973 (LD 0 (IO 0 (SIZE 8) (BASE 0x02f8) ) (INT 0 (IRQ 3 (MODE +E))) (NAME "FUJ0202/813695973[0]{FUJITSU Modem 33600 PNP/I2}") (ACT Y) )) (CONFIGURE TCM5098/2535012582 (LD 0 (INT 0 (IRQ 10 (MODE +E))) (IO 0 (SIZE 16) (BASE 0x0300) ) (NAME "TCM5098/2535012582[0]{3Com 3C509B EtherLink III}") (ACT Y) )) (WAITFORKEY) 何故、33k アナログモデムの設定が kernel 2.4 の設定例には無くて、 isapnptoolsの設定にはあるのかといいますと、kernel 2.4 の標準シリアル ポートデバイスドライバは、ISAPnP に対応しており自動設定で済みますが、 kernel 2.2 の標準シリアルポートデバイスドライバは、ISAPnP に対応してい ないので、設定する必要があるためです。 7.7. isapnptools 起動時の設定 現在、ご使用の Linux に isapnptools がインストール済みであれば、起動時 の設定もされているはずです。ディストリビューションによっても違います が、ここでは、RedHat 系の /etc/rc.d/rc.sysinitスクリプトを使う場合を説 明します。 /etc/rc.d/rc.sysinit の /proc のマウント直後に下記のように 追加します。 mount -t proc /proc /proc if [ -x /usr/local/sbin/isapnp -a -f /etc/isapnp.conf ]; then /usr/local/sbin/isapnp /etc/isapnp.conf fi 8. ALSA の ISAPnP サポート サウンドドライバ ALSA は独自に ISAPnP のサウンドカードをサポートしてい ます。 ALSA は Advanced Linux Sound Architecture から入手できます。本書ではALSA のインス トールについては説明しません。 ALSA の ISAPnP を有効にするには、alsa-driver-*のコンパイル時に、下記の ようにオプションを指定します。ALSAのバージョンによって、少し違うかもし れません。 $./configure --help オプションの確認 $./configure --with-isapnp=yes 8.1. ALSA の設定 ALSA の設定は、alsaconf を使用すると、簡単に設定できます。 alsaconf を 使用しない場合、ALSA driver 附属の文書 README を参考に、 /etc/modules.conf に設定を記載します。 ISAPnP に固有の設定はサウンド カード毎に異なりますが、 SoundBlaster16 ISAPnP では、snd_isapnp=1 がデ フォルトで有効になっています。下記に設定例を示します。 $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=1 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. --- 9. 参考文献 o ISAPnP 規格 Plug and Play ISA Specification Version 1.0a May 5,1994 pnpisa.zip RTF の文書が入手できます。 o JFの文書 Plug-and-Play-HOWTO 。 o PC98 System Design Guide o PC99 System Design Guide o kernel 2.4 ソース linux/drivers/pnp o isapnptools ソース isapnptools-version/doc/ 10. 謝辞 本文書の作成にあたり、下記の方々に大変お世話になりました。 瀬藤 誠 さん 千旦裕司 さん 武井伸光 さん 佐野武俊 さん A. ISA Bus について 本文書のこの項以降は技術文書です。ISAPnP について、より深く、理解した い人向けに書いてありますが、ハードウェア、C 言語、kernel の基礎知識が あることを前提にしています。 A.1. ISA Bus の歴史と特徴 ISA Bus は 1983 年に IBM 社が発売した、8088 CPUを搭載した PC/XT の I/O チャネルがもとになっています。この I/O チャネルは 62 ピンのコネクタを 使用しています。 1984 年 に IBM社 は 80286 CPU を搭載した PC/AT を発売 します。これに、伴って I/O チャネルも拡張され、PC/XT のものに 36 ピン のコネクタを追加しました。 PC/AT は多数の互換機が作成され、その互換機 メーカたちにより、PC/AT の I/O チャネルは ISA(Industry Standard Architecture) Busと呼ばれるようになりました。多くの PC/AT 互換機には 6 本の 62 + 36 ピンのスロットと、 2 本の 62 ピンのスロットの合計、8 本の ISA Bus スロットがありました。 ISA Bus は PC/XT 由来の 62 ピンのスロットには、アドレスバス 20bit、 データバス 8bit、割り込み 6 本、DMA 3 組があります。 PC/AT で追加され た 36 ピンのスロットには、アドレスバス 上位 7bit、データバス 上位 8bit、割り込み 5 本、DMA 4 組があります(80286 CPU のアドレスは 24bit なので、4bit の追加で足りるはずですが、何故か 7bit 増えています)。 これら以外に、CPU との制御線、クロック、リセット、電源があります。 Bus クロックは CPU のクロックに依存し、6MHz,8MHz,10MHz 等がありました。 ISA Bus の信号線は、80286 CPU, DMA コントローラ 8237A、割り込みコント ローラ 8259A に接続されていて、これらのデバイス固有のタイミングで制御 されています。ISA Bus は 80286 CPU 専用のバスだったといってもよいで しょう。 x86 系の CPU は I/O アドレス空間をメモリ空間とは別に持っています。 I/O アドレス空間は 16bit 長ですが、80286 時代の PC/AT 用拡張カードの中には 下位 12bit しか見ていないカードや、1 個の I/O アドレスしか使用していな いのに、8 個の I/O アドレスを浪費するカードがありました。 PC/AT とその互換機のマザーボード上の I/O 装置には、キーボートコント ローラ、タイマ、リアルタイムクロック(RTC 時計)しか搭載されていません。 ビデオ、シリアルポート、プリンタポート、ハードディスク・フロッピーディ スクコントローラ、拡張メモリ等は ISA Bus にアタプタ(拡張カード)を挿し て、使用しました。これではスロットが足らないため、シリアル、パラレル、 ハードディスク・フロッピーディスクコントローラカードを 1 枚にまとめた マルチ I/O カードや、サウンド、SCSI、CDROM コントローラ、ジョイス ティック・マウス コントローラを 1 枚にまとめたお楽しみカードというよう なカードが登場しました。 80386 CPU が出現したとき、ISA Bus は 80386 CPU に対応できませんでし た。また、高速なメモリは ISA Bus に置くと誤動作するので、CPU のすぐそ ばに置くようになりました。その後、80486 や Pentium が出現し EISA や、 高速ビデオカードに対応した VL Bus が採用されたこともありました。そし て、高速で、CPU に依存しない PCI Bus 規格が登場し、PC/AT 互換機の標準 Bus は ISA Bus から PCI Bus に移りました。 新しい Bus が PC/AT 互換機に採用される度に ISA Bus は消えて無くなるだ ろうといわれてきました。しかし、今のところ ISA Bus は生き残っていま す。その理由として、下記に幾つか挙げておきます。 o ISA Bus と周辺機器のインターフェースが簡単な回路で実現できること。 o 自作のカードや、安価なカードが多数存在したこと。 o ISA PnP により、拡張カードの取り扱いが楽になったこと。 o PCI が ISA Bus リソースと重ならないように実装されたこと。 o ISA Busで十分な性能が得られる用途があること。 しかし、Microsoft 社と Intel 社の提唱する PC のハードウェア標準規格、 ``PC 98 Hardware Design Guide''では、 ISA Bus の搭載は不可となってしま いました。今後、自作する人に対し PCI Bus インターフェース用 LSI が安価 で提供され、 PCI Bus が ISA Bus のように簡単に使えるようになったと き、ISA Bus は無くなるだろうと思います。 A.2. 現在の ISA Bus 2000 年現在の ISA Bus と CPU Pentium III とは下図 1 のように接続されて います。 DRAM AGP USB Super I/O chip | | | | Pentium III -- GTL Bus -- North Bridge -- PCI Bus -- South Bridge -- ISA Bus | | | +------- IO APIC (interrupt) -----------------------+--------------+ 図 1 Pentium III と 440BX Chip セット 図 1 を説明します。 Pentium III 現在の最新 CPU です。 GTL Bus 最新の CPU (Pentium II や Celeron等を含む)の Bus の名称です。Bus クロックは 100MHz です。 North Bridge CPU と DRAM,AGP,PCI Bus インターフェース機能が受け持ちます。型番 は 82443BX です。 South Bridge 昔の PC/AT のマザーボードに搭載されていた機能、割り込み、DMA,RTC 等、 PCI Bus 接続の ATA(IDE)インターフェースや USB と PCI-ISA Bus Bridge 機能を持ちます。型番は 82371EB です。 Super I/O chip フロッピディスク、パラレル・シリアルポート、キーボード、マウスイ ンターフェースを持ちます。 ISA Bus に接続されています。各社から 提供されています。 IO APIC 新しい、割り込みコントローラです。PC/AT の割り込みを拡張し、16 個以上の割り込みが使え、PCI Bus とISA Bus の割り込みを別にできま す。型番は 82093AA です。 もともと 8088/80286 CPU のそばにあった ISA Bus は、何段ものインタ フェースを経由して、Pentium III と接続されています。 ISA Bus のタイミ ングは クロック 8MHz の、80286 時代のタイミングとほぼ、同じです。 A.3. ISA Bus と PC/AT の問題点 ISA Bus の問題点は、PC/AT 互換機の問題と言い換えることができます。 リセットの問題 x86 系の CPU で 8086(8088)と同じ動作をリアルモードといいます。 x86 系の CPU は 最新の Pentium III も含めて、CPU を リセットする と、このリアルモードになります。プロテクトモードは様々な保護機能 や、仮想メモリ機能を持つモードのことです。 80286 CPU は機械語命 令で、リアルモードから、プロテクトモードに移行できますが、プロテ クトモードから、リアルモードに戻る機械語命令を持っていませんでし た。80286 CPU 時代の幾つかのプログラムはリアルモードで無いと動作 しないものがあるため、リアルモードに戻るため、CPU をリセットする ハードウェアを PC/AT 互換機に追加しました。キーボードコントロー ラの出力ポート (I/O アドレス 0x64) の bit 0 に 0 を書き込むと、 リセットできるので、キーボードリセットと呼ばれています。この、 キーボードリセットでは ISA Bus はリセットされません。 ISA Bus が リセットされるのは、電源投入時だけです。 I/O アドレスの問題 x86 系の CPU は 16 bit の I/O アドレスを持っています。PC/AT で は、アドレス 0x0000 から 0x00FF までを、マザーボード上で使用し、 拡張カードは 0x0100 から 0x03FF までを使用します(合わせて 10bit 1024バイトになります)。ところが、どちらも I/O アドレス 16bit を 完全デコードせず、手を抜いています。マザーボードでは、I/O アドレ ス の bit15 から 10 を無視し、しかも、bit9 と bit8 がともに 0 の 時、選択されてしまいます。拡張カードは I/O アドレスの bit15 から 10 を無視しています。そのため、I/O アドレス空間は イメージ(ゴー スト)だらけになっています。つまり、マザーボードでは 0x0000,0x1000,0x2000... は全て同じ I/O が反応し、拡張カードでは 0x0100,0x0400,0x0800... は全て同じ I/O が反応してしまいます。さ らに、1 個の I/O アドレスしか必要が無くとも、マザーボード上で は、最低単位でも 16 個、多くの拡張カードでは 8 個の I/O アドレス を浪費しています。この手抜きは デコーダ回路を簡素化するために行 われましたが、 I/O アドレスに連続した広い領域を取ることができま せん。 DMA の問題 PC/AT の DMA コントローラは (大昔の) 8080 用の 8237A を使用して います。 8237A はアドレス空間 16bit 、データ幅 8bit なの で、64kbyte までしか転送できません。PC/AT では、かなり複雑な方法 で 8237A を 2 個使用し、データ幅 16bit の転送ができます。また 8bit のレジスタを使用し、アドレス空間 24bit に拡大されています。 ただし、一度に転送できるデータ長は、 16bit までに、制限されてい ます。さらに、DMA の転送速度は現在の CPU のプログラム転送速度に 劣ります。 割り込みの問題 x86 CPU 自体は 2 本の割り込み線があります。NMI と INT です。 NMI は 割り込み禁止にすることができないもので、主に致命的なエラー(メ モリの異常や、電源が落ちた等)の時に使用します。 INT は 割り込み 禁止にできることと、割り込み発生時 8bit の割り込みベクタを読み込 むことで、256 個の割り込みに対応できます。 PC/AT では 割り込みコ ントローラ 8259A を 2 個使用し、15 個の割り込みが使用できま す。8259A は 8本 の IRQ 端子を持っていて、IRQ 端子毎に別々の割り 込みベクタを設定(プログラム)できます。8259A を 2 個使うために は、一方の IRQ 端子を他方の 8259Aの端子のために使うため、16 個で はなく 1 つ足りない、15 個の割り込みになります。これらの割り込み をハードウェア割り込みといいます。 また、x86 系 CPU にはソフトウェア割り込み機械語命令(ニーモニック は INT です)がありますが、ハードウェア割り込みと同じように動作し ます。 8259A が 割り込みベクタ 8 を出力し、CPU の INT 端子を有効 にしたことと、ソフトウェア割り込み機械語命令 INT 8 の動作は全く 同じで、CPU には区別が付きません。8259A のレジスタを調べた り、IRQ 端子を有効にした、ハードウェアに問い合わせて、ハードウェ アかソフトウェアの割り込みを区別します。これは、欠点とも利点とも 考えられます。 欠点として、ハードウェアかソフトウェアか区別する プログラムが必要になることです。利点としては、ハードウェアが動作 していない(bugっていたり、まだ完成していない)ときに、ソフトウェ アで試験ができることです。 x86 系 CPU はベクタ番号から計算した、メモリ内容(勿論あらかじめ、 値を設定しておきます)をもとにしたアドレスへサブルーチンコールし ます。 PC/AT 発売当初は割り込みが 15 個もあれば、十分と考えられていまし たが、現在では、不足しています。 Bus 速度の問題 ISA Bus の転送速度はピークでも、8Mbyte/sec 以下です。8bit 幅の I/O 命令で ISA Bus をアクセスした場合 1Mbyte/sec を下回ります。 分離の問題 ISA Bus には、すべてのスロットに信号線が共通に配線されています。 そのため、 ISA カード毎にアクセスする方法がありません。同じ Bus 接続でも、SCSI は装置毎に、ID 番号を人手で重複しないように設定 し、その ID 番号を使い、装置を区別しアクセスしています。 PCI で は装置(スロット)と PCI Bus コントローラを 1 対 1 に接続している 制御線があります。PCI では、この制御線を有効にすると、対応したひ とつだけの装置(スロット)が反応し、同じ Bus 上にある他の装置(ス ロット)は反応しません。 A.4. I/O アドレス空間について ISA Bus は I/O アドレス空間を使用し、ハードウェアを制御します。 I/O ア ドレス空間へのアクセスに関係する問題を下記に示します。 A.4.1. I/O アドレス空間の問題 x86 系 CPU は I/O アドレス空間をメモリアドレス空間と別に持っています が、 I/O アドレス空間を持つ CPU は少数派なのです。何故、少数派かといえ ば、I/O アドレス空間を別に持つ、必要は必ずしも無かったからです。 I/O のハードウェアがメモリと同じように、アクセスして、動作するように設計さ れていれば、問題は無いからです。I/O アドレス空間をアクセスする機械語命 令や、 CPU の信号線やアクセスタイミングに I/O アドレス空間専用のものを 用意する必要も無いので、I/O アドレス空間を持たない方が有利でした。しか し、キャシュメモリの搭載、命令のスケジューラ、保護機能、CPU の高速化等 により、 I/O アドレス空間を持つ方が有利となってきました。その理由を下 記に示します。 キャシュメモリの搭載 メモリは CPU の管理下にあり、メモリ内容を変更するのは、原則とし て CPU だけですが、ハードウェアは独自にメモリ内容を変更します。 メモリアドレス空間にハードウェアを割り当てる場合、その領域をキャ シュ不可にする必要があります。x86 系の MTRR はメモリアドレス空間 にハードウェアを割り当てるときに使用されます。 命令のスケジュール 現在の CPU は複数機械語命令を同時に取り込み、並列に実行できるよ うになっています。そのため、命令の実行順序や、メモリアドレス空間 へのアクセス順序を変更することがあります。ハードウェアに対し、実 行順序やアクセス順序が変更された場合、誤動作する可能性がありま す。 保護機能 ハードウェアが割り当てられたアドレス空間では、メモリアドレス空間 とは、異なる保護機能が必要です。メモリアドレス空間では、読み出し 不可、書き込み専用は意味のない、保護ですが、ハードウェアでは有効 な保護になります。また、読み出し不可、書き込み不可、しかしアクセ スは可能という保護もハードウェアではあり得ます。さらに、これらの 保護機能はビット単位で行う必要があります。 CPU の高速化 CPU が高速化すれば、メモリへも高速にアクセス可能で、アクセスタイ ムは同一である方が、有利でしょう。しかし、ハードウェアのアクセス 速度は様々で、超低速のものもあります。ハードウェアを同じ空間に割 り当てるよりも、別の空間に割り当てた方が、 CPU Bus や メモリ Bus の設計が容易になります。 A.4.2. ハードウェアへのアクセス ハードウェアへのアクセスに関連する話題を下記に示します。 ハードウェアへのアクセスの特殊性 ハードウェアへのアクセスはメモリのアクセスとは、同じではありませ ん。下記にいつかの機械語命令のコードの例を示し、I/O とメモリとの 違いを説明します。 コード 1 load io # io アドレスのデータを読み込む load io store io store io # io アドレスへデータを書き込む コード 2-1 load io ioにアクセスしない処理 コード 2-2 ioにアクセスしない処理 load io コード 3-1 load32 io # 32bit 単位でアクセス and 0xff # 8bit 分を取り出す。 コード 3-2 load8 io # 8bit 単位でアクセス コード 1 がメモリへのアクセスであれば、読み込んだデータを書き戻すだ けですから、無意味なコードでしょう。CPU によっては、機械語命令を実 行しないかもしれません。しかし、コード 1 がハードウェアへのアクセス の場合、この通りに、2 回読んで、2 回書くように("読 読 書 書" と)実 行する必要があります。 "読 書 読 書" や、"読 書 書 読" では動作しな いように、設計されたハードウェアかもしれません。 コード 2 は最初にハードウェアにアクセスするか、後でハードウェアにア クセスするかの違いですが、時間が経過すると、ハードウェアは別のデー タを返すかもしれません。 コード 3 はアクセスするときのデータバス幅の違いです。読み込んだデー タはともに 8bit の同じデータでしょう。しかし、32bit 幅のアクセスで は、24bit 分よけいなアクセスをしています。そのため、ハードウェアの 動作は全く異なるものになるでしょう。 また、同じ I/O アドレスへのアクセスでも、読み込みと書き込みの動作が 異なることも、ありますし、アクセスさえあれば、読み込み書き込みを問 わないこともあります。 I/O アクセスプログラムの問題 x86 系 CPU が I/O アドレス空間にアクセスする機械語命令を I/O 命 令と呼んでいます。I/O 命令のアドレッシングモードは、ふたつしかあ りません。絶対アドレスと DX レジスタ間接です。絶対アドレスアド レッシングモードは、I/O アドレスを直に指定するので、機械語命令が ROM に書き込まれた場合や、プロテクトモードでは、 I/O アドレスを 書き換えることはできません。また、アドレスは 0 から 255 の範囲に 限られます。 DX レジスタ間接アドレッシングモードは、DX レジスタ に I/O アドレスを、渡せば良いので、I/O アドレスを書き換えること ができます。ところが、x86 系 CPU は CPU レジスタの役割が固定され ている上、レジスタが少ないため、DX レジスタを他の用途に使用して いることや、プログラマが 8080 CPU 機械語に慣れていることから、 DX レジスタ間接アドレッシングモードはあまり使われませんでした。 Busが ISAPnP になっても、絶対アドレッシングモードを使用している デバイスドライバがあり、リソースが衝突して、せっかくの PnP 機能 が生かせないものがあります(そう、いまでも) 。ただし、IBM PC/AT互 換機では I/O アドレス 0 から 255 は システム I/O に使用しますの で、ISAPnP カードには割り当てることはありません。 バイトオーダの問題 エンディアンの問題とも、いいます。16bit 以上の整数値が 8bit 単位 でどのようにメモリに格納されるかということです。x86 系の CPU で は、最下位から、格納され、その他の CPU (例えば 68k や Alpha)で は、最上位から格納されます。例えば、0x123456AB は x86 系で は、"AB 56 34 12" の順に、 68k では"12 34 56 AB" の順に格納され ます。それぞれに、利点があって、x86 系では、ビット数の拡張に向い ていて、68k では、可読性に富んでいます。ビット数の拡張とは、現在 16bit のデータを格納するとき、将来を見越して、64bit の領域を用意 し、xx yy 00 00 ... のように、未使用領域を 0 にしておくと、 32bit でも、64bit でも、同じ先頭アドレスでアクセスできます。 ISAPnP (実は PCI も) コンフィグレーションレジスタは x86 系のバイ トオーダになっています。また、同種の問題として、最上位ビットの位 置の問題があります。x86 系では、 32bit の場合、 bit31 が最上位 ビットですが、ある CPU では bit0 が最上位ビットになっています。 B. ISAPnP の仕組み ISAPnP の仕組みについて説明します。より詳しい ISAPnP の仕組みについて は、 ``参考文献''を参照してください。 B.1. ISAPnP カードの用語とハードウェア 本書で使用している ISAPnP カードの用語と、ISAPnP 固有のハードウェアに ついて、説明します。 B.1.1. 論理デバイス ISAPnP カードは一つのカードに複数の機能を搭載しているものがあります。 この複数の機能を論理デバイスと呼びます。例えば、サウンドカードは、サウ ンド機能と、ジョイスティック機能の二つの論理デバイスを持ちます。単機能 のカードの場合、論理デバイスが一つあるということになります。論理デバイ スは 256 個まで持てます。一つの論理デバイスは、最大で、 8 つの I/O ア ドレス空間、4 つのメモリアドレス空間、2 つの割り込み、2 つの DMA チャ ンネルを持つことができます。 B.1.2. コンフィグレーションレジスタ OS と ISAPnP カードとは、ISAPnP カードの持つコンフィグレーションレジス タを介して、8bit 単位で情報のやり取りをします。コンフィグレーションレ ジスタは 0 から 0xff まで、アドレス番号が割り当てられています。アドレ ス番号 0 から 0x2f までは ISAPnP カードに 一つだけあり、カードレベルレ ジスタと呼びます。アドレス番号 0x3f から 0xff までは、ISAPnP カード上 の論理デバイスの数だけ何組かあり、デバイスレベルレジスタと呼びます。ひ とつのアドレス番号に対し、複数のデータを持ったものがあります。その意味 では、アドレス番号というよりもコマンド番号と考えた方が解りやすいかもし れません。 B.1.3. 分離 複数枚ある ISAPnP カードから、1 枚を特定することです。 B.1.4. CSN CSN(Card Select Number) は ISAPnP カードを特定するための 1byte の数値 です。 OS は CSN を ユニークに管理する必要があります。無事 ISAPnP カー ドの分離に成功すると、OS は ISAPnP カードに CSN を割り当てます。 OS が CSN を出力すると、ISAPnP カードは自分に割り当てられた CSN の時だけ反応 します。CSN が 0 の場合、特別に全ての ISAPnP カードが反応します。 CSN 0 はISAPnP カードを全てリセットするときや、分離の時に使います。 B.1.5. ISAPnP カードのステート ISAPnP カードは幾つかのステート(状態 state)があります。 Wait 電源投入直後のOS による初期化を待っているか、コンフィグレーショ ン終了後の正常な動作中の状態です。 Sleep OS からの "Wake" コマンドを待っている状態です。 Wake コマンドを 受け取ると、Wait ステートに移行します。 Isolation 分離シーケンス実行中の状態です。分離に失敗すると、Sleep ステート に移行します。成功すると、CSN コマンドを待ち、CSN コマンドを受け 取ると、 Config ステートに移行します。 Config コンフィグレーション実行中の状態です。 OS がコマンドを出力し、ステートを移行させます。 B.1.6. コンフィグレーション時のデータバスドライブ方法 ISAPnP カードの分離が済むまでは、複数のカードが反応してしまいます。そ こで、ISAPnP カードのコンフィグレーションレジスタからの読み出しの場 合、 ISAPnP カードは データバスに 論理値 0(Low)のビットのみを駆動し、 論理値 1(High) のビットは駆動せず、ハイインピーダンスにします。ハイイ ンピーダンスにするとは、電気的に切り離したのと同じ状態にすることです。 ISAPnP 対応のマザーボードのデータバスはハイインピーダンスの場合、論理 値 1(High)になるように、細工(電気抵抗でプルアップ)されていますので、論 理値 1(High)のビットも正しく読み出せます。 もし、データバスの同じビットに対し、あるカードが論理値 1 を駆動し、別 のカードが論理値 0 を駆動した場合、論理値 1 を出したカードはビットが 0 にならないようにがんばり、論理値 0 を出したカードはビットを 0 にしよう とがんばってしまいます。その結果、両者のカードの間に大電流が流れ、両方 のカードが壊れてしまいます。論理値 1(High) を駆動せず、ハイインピーダ ンスにすれば、プルアップしている電気抵抗によって電流が制限されています ので、カードは壊れません。また、論理値 0 同士の場合は、どちらかのカー ドも、論理値 0 になれば、それ以上電流は流れないので、両カードは壊れま せん。 B.1.7. ISAPnP コンフィグレーション時の アクセス方法 ISAPnP はコンフィグレーションのとき、三つの I/O アドレスを使います。 アドレスポート 0x279 アドレスポートは プリンタポートの読み取り専用のステイタスポート と同じ I/O アドレスを書き込み用に変更して、使用しています。 OS はアドレスポートに ISAPnP のコンフィグレーションレジスタのアドレ ス番号を書き込みます。 ライトデータポート 0xa79 ライト(write)データポートはプリンタポートの読み取り専用のステイ タスポートのイメージと同じ I/O アドレスを使用します。ISAPnP 対応 マザーボードでは、 I/O アドレスのフルデコードが義務づけられてい るので、実際にはイメージではありません。 OS はライトデータポート へ、コンフィグレーションレジスタに設定したいデータを書き込みま す。 リードデータポート 0x203 + 4*n から 0x3ffまでの内 一つ リードデータポートの I/O アドレスは 0x203,0x207,0x20b,0x20f...0x3ffの中から、未使用の I/O アドレスを 一つ使用します。OS はリードデータポートから、コンフィグレーショ ンレジスタのデータを読み出します。実際の I/O アドレスは、分離中 に調べます。 ISAPnP 対応ハードウェアのコンフィグレーションレジスタのアクセス方法は 下記の通りです。 書き込み アドレスポートに、コンフィグレーションレジスタのアドレス番号を書 き込みます。次に、書き込むべきデータ数の分だけ、ライトデータポー トに、データを書き込みます。 読み込み アドレスポートに コンフィグレーションレジスタのアドレス番号を書 き込みます。次に、読み込むべきデータ数の分だけ、リードデータポー トから、データを読み込みます。 B.2. ISAPnP のコンフィグレーション ISAPnP のコンフィグレーションについて、説明します。 B.2.1. 分離の仕組み ISAPnP カードの仕組みで最も難しいものが、分離(isolation)です。分離とは ISA Bus 上にある複数枚のカードから、一枚だけを識別し、番号を付けること です。 ISAPnP カードは 32bit のベンダーID と 32bit のシリアルID の合計 64bit の ID を持っています。この ID は他の全ての ISAPnP カードと異なる ように付けられています。この ID と ID のチェックサム 8bit の合計 72bit を使って、 ISAPnP カードを分離します。 分離のアルゴリズムの基本的な考えは勝ち抜き戦のようなものです。勝ち抜き 戦は、ID を LSB から順に 1 ビットづつ調べて行います。勝敗は下記のよう に決めます。 勝ち組 ID の調査中のビットが 1 のカード。勝ち組は手を挙げて、勝利を他の カードに知らせる。 負け組 ID の調査中のビットが 0 のカード。負け組は、手を挙げているカード が無いか、調べる。 敗者復活 誰も勝者がいなければ(手が挙がらないとき)、次の勝負に進める。 負け組は敗者復活のときにしか、次の勝負に進めません。そして、優勝した カードには、番号(CSN:Card Select Number)を付けて、勝負から降りて(勝ち 抜けて)もらいます。敗者たちは、次の勝ち抜き戦に出場します。この勝ち抜 き戦を繰り返し、カードが全て無くなるまで勝負を続けます。 例として、カード A は 101、カード B は 011、カード C は 001 の 2 進数 3bit の ID を持っているとします。勝負は最下位ビットから始めます。 勝負 | A | B | C | 手 | 判定 =====+=======+=======+=======+====+=========== 1-1 | A = 1 | B = 1 | C = 1 | 挙 | みんな勝ち 1-2 | A = 0 | B = 1 | C = 0 | 挙 | B の勝ち 1-3 | xxxxx | B = 0 | xxxxx | | B の優勝 -----+-------+-------+-------+----+----------- 2-1 | A = 1 | I am | C = 1 | 挙 | 両方勝ち 2-2 | A = 0 | NO. | C = 0 | | 敗者復活 2-3 | A = 1 | one! | C = 0 | 挙 | A の優勝 -----+-------+-------+-------+----+----------- 3-1 | I am | | C = 1 | 挙 | C の勝ち 3-2 | NO. | | C = 0 | | 敗者復活 3-3 | two. | | C = 0 | | C の優勝 -----+-------+-------+-------+----+----------- 4-1 | | | | |カード無し =====+=======+=======+=======+====+=========== CSN | 2 | 1 | 3 | こうして、全てのカードには CSN が付けられたので、今後カードとは、 CSN を使用し、コンフィグレーションを続けます。 勿論、実際の ISAPnP の分離のアルゴリズム(シーケンス)はもう少し複雑で す。基本となるアルゴリズムは下記の通りです。 OS がデータリードポートアドレスからデータを 2 回読み込みます。 ISAPnP カードは ID の 調査中のビットが 1 の場合、データを 0x55, 0xAA の順で出 力します(勝ち組)。ID の調査中のビットが 0 の ISAPnP カードは、データバ スを 2 回読み込み、最初のデータの下位 2ビットが 01 で、次のデータの下 位 2 ビットが 10 の場合、Sleep ステートに移行します(負け組)が、データ の下位 2 ビットが、 01,10 で無かった場合、Isolate ステートを続行しま す(敗者復活)。 OS は読み込んだ最初のデータが 0x55、 次のデータが 0xAA だった場合、 ID は 1 、そうでない場合、 0 と判断します。 このアルゴリズムを仮に Iso 操作と呼びます。この操作を ID のチェックサ ムを求める為に、64 回繰り返し、ISAPnP カードが出力するチェックサムを取 得するために、8 回繰り返します。最後に両者のチェックサムを比較 し、ISAPnPカード の有無を判断します。実際の ISAPnP 分離のアルゴリズム は下記のようになります。 1. OS は CSN を 0x01に初期化し、データリードポートアドレスを 0x203 に します。 2. データリードポートアドレスが 0x3ff を越えた場合、9. へ行き終了しま す。 3. OSは 現在のデータリードポートアドレスを ISAPnP カードに設定し、 ISAPnP カードを Isolate ステートに移行させます。 4. OS の チェックサムを初期化し、Iso 操作を 64 回 繰り返しチェックサム を計算します。 5. Iso 操作を 8 回 繰り返し、ISAPnP カードのチェックサムと OS のチェッ クサムを比較します。一致したら、6.へ、一致しなかったら 8. へ行きま す。 6. チェックサムが一致した場合、ISAPnP カードに CSN を割り当てます。 7. CSN を更新し、次の ISAPnP カードのため、3. へ行きます。 8. チェックサムが一致しなかった場合、データリードポートアドレスを更 新(4 を加算)し、2.へ行きます。 9. ISAPnP カードが無かったとして、終了します。 尚、チェックサムの計算方法により、チェックサムは 0 で無いことが、保 証されています。従って、ISAPnP カードがあれば、必ず 0x55,0xAA が読 み出せるので、リードデータポートアドレスは確定できますし、ISAPnP カードの分離もできます。 B.2.2. チェックサムの計算 チェックサムの計算は LFSR(linear feedback shift register) を使います。 LFSR は 8bit 長で、bit0 と bit1 と ISAPnP の ID ビットの排他的論理和が bit7 にフィードバックされています。LFSR は OS から 0x6a に初期化され、 ID ビットが更新されるときに、シフトされます。 ISAPnP の ID は 64bit で すから、LFSR を 64 回シフトした結果がチェックサムになります。この計算 法により、チェックサムは 0 でないことが、保証されます。 尚、このチェックサムの計算は CRC チェックサムの一種です。 B.2.3. リソースの読み込み リソースの読み込みには二つの方法があります。一つは、ISAPnP カードの分 離後、続けて ISAPnP カードにアクセスする方法です。 ISAPnP カードは分離 後、リソースデータを連続して、出力します。OS は コンフィグレーションレ ジスタを調べてリソースデータの終了を調べます。もう一つは、下記の手順を 使い、OS が ISAPnP カードのリソースを読み込む方法です。 1. OS は CSN を出力します。 2. OS は ISAPnP カードの論理デバイスを指定します。 3. OS は ISAPnP のリソースの種類を指定します。 4. ISAPnP カードは指定された論理デバイスのリソースを出力します。 5. OS はリソースを読み込みます。 B.2.4. リソースの書き込み 下記の手順で OS は ISAPnP カードのリソースを書き込みます。 1. OS は CSN を出力します。 2. OS は ISAPnP カードの論理デバイスを指定します。 3. OS は ISAPnP のリソースの種類を指定します。 4. OS は指定した論理デバイスのリソースを書き込みます。 5. ISAPnP カードはリソースを設定します。 B.2.5. リソースの種類 リソースの種類は、下記の通りです。種類ごとにフィールドがあり、さらに、 それ毎に、サブフィールドがあります。 メモリ メモリのフィールドは 四つあります。メモリのサブフィールドはベー スアドレス、コントロール、制限値の 三つがあります。ベースアドレ スはメモリアドレスの上位 16bit です。コントロールは メモリのアク セスが 8bit か 16bitの指定と、制限値の種類です。制限値は 16bit 幅で、コントロールの指定により、メモリの長さか、メモリアドレスの 上限値になります。 I/O アドレス I/O アドレスのフィールドは八つあります。 I/O アドレスのサブ フィールドはベースアドレス、最大アドレス、アライメント境界、アド レス長の四つがあります。ベースアドレスと最大アドレスは 10bit で す。アライメント境界とアドレス長は 8bit です。 IRQ IRQ のフィールドは一つだけです。 IRQ のサブフィールドは IRQ マス クとトリガ方式の二つあります。 IRQ マスクは 16bit で、ビット位置 で IRQ 番号が指定されます。トリガ方式は 4 種類ありますが、 ISA で使用するのは立ち上がりエッジ方式だけです。 DMA DMA のフィールドは一つだけです。 DMA のサブフィールドは DMA マス クと転送方式の二つあります。 DMA マスクは 8bit で、ビット位置で DMA番号が指定されます。転送方式は データバス幅、連続転送・断続転 送等が指定されます。