ISAPnP の仕組みについて説明します。より詳しい ISAPnP の仕組みについては、 参考文献を参照してください。
本書で使用している ISAPnP カードの用語と、ISAPnP 固有のハードウェアについて、 説明します。
ISAPnP カードは一つのカードに複数の機能を搭載しているものがあります。 この複数の機能を論理デバイスと呼びます。 例えば、サウンドカードは、サウンド機能と、ジョイスティック機能の二つの 論理デバイスを持ちます。 単機能のカードの場合、論理デバイスが一つあるということになります。 論理デバイスは 256 個まで持てます。 一つの論理デバイスは、最大で、 8 つの I/O アドレス空間、4 つのメモリアドレス 空間、2 つの割り込み、2 つの DMA チャンネルを持つことができます。
OS と ISAPnP カードとは、ISAPnP カードの持つコンフィグレーションレジスタを 介して、8bit 単位で情報のやり取りをします。 コンフィグレーションレジスタは 0 から 0xff まで、アドレス番号が割り当てられ ています。アドレス番号 0 から 0x2f までは ISAPnP カードに 一つだけあり、 カードレベルレジスタと呼びます。 アドレス番号 0x3f から 0xff までは、ISAPnP カード上の論理デバイスの数だけ 何組かあり、デバイスレベルレジスタと呼びます。 ひとつのアドレス番号に対し、複数のデータを持ったものがあります。その意味では、 アドレス番号というよりもコマンド番号と考えた方が解りやすいかもしれません。
複数枚ある ISAPnP カードから、1 枚を特定することです。
CSN(Card Select Number) は ISAPnP カードを特定するための 1byte の数値です。 OS は CSN を ユニークに管理する必要があります。 無事 ISAPnP カードの分離に成功すると、OS は ISAPnP カードに CSN を割り当て ます。 OS が CSN を出力すると、ISAPnP カードは自分に割り当てられた CSN の時だけ 反応します。CSN が 0 の場合、特別に全ての ISAPnP カードが反応します。 CSN 0 はISAPnP カードを全てリセットするときや、分離の時に使います。
ISAPnP カードは幾つかのステート(状態 state)があります。
電源投入直後のOS による初期化を待っているか、 コンフィグレーション終了後の正常な動作中の状態です。
OS からの "Wake" コマンドを待っている状態です。 Wake コマンドを受け取ると、Wait ステートに移行します。
分離シーケンス実行中の状態です。分離に失敗すると、Sleep ス テートに移行します。成功すると、CSN コマンドを待ち、CSN コマンドを受け取ると、 Config ステートに移行します。
コンフィグレーション実行中の状態です。
ISAPnP カードの分離が済むまでは、複数のカードが反応してしまいます。 そこで、ISAPnP カードのコンフィグレーションレジスタからの読み出しの場合、 ISAPnP カードは データバスに 論理値 0(Low)のビットのみを駆動し、 論理値 1(High) のビットは駆動せず、ハイインピーダンスにします。 ハイインピーダンスにするとは、電気的に切り離したのと同じ状態にすることです。 ISAPnP 対応のマザーボードのデータバスはハイインピーダンスの場合、 論理値 1(High)になるように、細工(電気抵抗でプルアップ)されていますので、 論理値 1(High)のビットも正しく読み出せます。
もし、データバスの同じビットに対し、あるカードが論理値 1 を駆動し、別の カードが論理値 0 を駆動した場合、論理値 1 を出したカードはビットが 0 に ならないようにがんばり、論理値 0 を出したカードはビットを 0 にしようと がんばってしまいます。その結果、両者のカードの間に大電流が流れ、 両方のカードが壊れてしまいます。 論理値 1(High) を駆動せず、ハイインピーダンスにすれば、 プルアップしている電気抵抗によって電流が制限されていますので、 カードは壊れません。 また、論理値 0 同士の場合は、どちらかのカードも、論理値 0 になれば、 それ以上電流は流れないので、両カードは壊れません。
ISAPnP はコンフィグレーションのとき、三つの I/O アドレスを使います。
アドレスポートは プリンタポートの読み取り専用のステイタスポートと 同じ I/O アドレスを書き込み用に変更して、使用しています。 OS はアドレスポートに ISAPnP のコンフィグレーションレジスタのアドレス番号を 書き込みます。
ライト(write)データポートはプリンタポートの読み取り専用のステイタスポートの イメージと同じ I/O アドレスを使用します。ISAPnP 対応マザーボードでは、 I/O アドレスのフルデコードが義務づけられているので、実際にはイメージでは ありません。 OS はライトデータポートへ、コンフィグレーションレジスタに設定したいデータを 書き込みます。
リードデータポートの I/O アドレスは 0x203,0x207,0x20b,0x20f...0x3ffの中から、 未使用の I/O アドレスを一つ使用します。OS はリードデータポートから、コンフィグ レーションレジスタのデータを読み出します。実際の I/O アドレスは、分離中に 調べます。
ISAPnP 対応ハードウェアのコンフィグレーションレジスタのアクセス方法は 下記の通りです。
アドレスポートに、コンフィグレーションレジスタのアドレス番号を書き込みます。 次に、書き込むべきデータ数の分だけ、ライトデータポートに、データを 書き込みます。
アドレスポートに コンフィグレーションレジスタのアドレス番号を書き込みます。 次に、読み込むべきデータ数の分だけ、リードデータポートから、データを 読み込みます。
ISAPnP のコンフィグレーションについて、説明します。
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 のカード。負け組は、手を挙げているカードが無いか、調べる。
誰も勝者がいなければ(手が挙がらないとき)、次の勝負に進める。
例として、カード 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 分離のアルゴリズムは下記のようになります。
チェックサムの計算は LFSR(linear feedback shift register) を使います。 LFSR は 8bit 長で、bit0 と bit1 と ISAPnP の ID ビットの排他的論理和が bit7 にフィードバックされています。LFSR は OS から 0x6a に初期化され、 ID ビットが更新されるときに、シフトされます。 ISAPnP の ID は 64bit ですから、LFSR を 64 回シフトした結果がチェックサムに なります。この計算法により、チェックサムは 0 でないことが、保証されます。
尚、このチェックサムの計算は CRC チェックサムの一種です。
リソースの読み込みには二つの方法があります。一つは、ISAPnP カードの分離後、 続けて ISAPnP カードにアクセスする方法です。 ISAPnP カードは分離後、リソースデータを連続して、出力します。OS は コンフィグ レーションレジスタを調べてリソースデータの終了を調べます。 もう一つは、下記の手順を使い、OS が ISAPnP カードのリソースを読み込む方法 です。
下記の手順で OS は ISAPnP カードのリソースを書き込みます。
リソースの種類は、下記の通りです。種類ごとにフィールドがあり、さらに、それ毎 に、サブフィールドがあります。
メモリのフィールドは 四つあります。 メモリのサブフィールドはベースアドレス、コントロール、制限値の 三つがあります。 ベースアドレスはメモリアドレスの上位 16bit です。 コントロールは メモリのアクセスが 8bit か 16bitの指定と、制限値の種類です。 制限値は 16bit 幅で、コントロールの指定により、メモリの長さか、メモリアドレスの 上限値になります。
I/O アドレスのフィールドは八つあります。 I/O アドレスのサブフィールドはベースアドレス、最大アドレス、アライメント境界、アドレス長の四つがあります。ベースアドレスと最大アドレスは 10bit です。 アライメント境界とアドレス長は 8bit です。
IRQ のフィールドは一つだけです。 IRQ のサブフィールドは IRQ マスクとトリガ方式の二つあります。 IRQ マスクは 16bit で、ビット位置で IRQ 番号が指定されます。トリガ方式は 4 種 類ありますが、 ISA で使用するのは立ち上がりエッジ方式だけです。
DMA のフィールドは一つだけです。 DMA のサブフィールドは DMA マスクと転送方式の二つあります。 DMA マスクは 8bit で、ビット位置で DMA番号が指定されます。 転送方式は データバス幅、連続転送・断続転送等が指定されます。