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

12. ISAPnP の仕組み

ISAPnP の仕組みについて説明します。より詳しい ISAPnP の仕組みについては、 参考文献を参照してください。

12.1 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

CSN(Card Select Number) は ISAPnP カードを特定するための 1byte の数値です。 OS は CSN を ユニークに管理する必要があります。 無事 ISAPnP カードの分離に成功すると、OS は ISAPnP カードに CSN を割り当て ます。 OS が CSN を出力すると、ISAPnP カードは自分に割り当てられた CSN の時だけ 反応します。CSN が 0 の場合、特別に全ての ISAPnP カードが反応します。 CSN 0 はISAPnP カードを全てリセットするときや、分離の時に使います。

ISAPnP カードのステート

ISAPnP カードは幾つかのステート(状態 state)があります。

Wait

電源投入直後のOS による初期化を待っているか、 コンフィグレーション終了後の正常な動作中の状態です。

Sleep

OS からの "Wake" コマンドを待っている状態です。 Wake コマンドを受け取ると、Wait ステートに移行します。

Isolation

分離シーケンス実行中の状態です。分離に失敗すると、Sleep ス テートに移行します。成功すると、CSN コマンドを待ち、CSN コマンドを受け取ると、 Config ステートに移行します。

Config

コンフィグレーション実行中の状態です。

OS がコマンドを出力し、ステートを移行させます。

コンフィグレーション時のデータバスドライブ方法

ISAPnP カードの分離が済むまでは、複数のカードが反応してしまいます。 そこで、ISAPnP カードのコンフィグレーションレジスタからの読み出しの場合、 ISAPnP カードは データバスに 論理値 0(Low)のビットのみを駆動し、 論理値 1(High) のビットは駆動せず、ハイインピーダンスにします。 ハイインピーダンスにするとは、電気的に切り離したのと同じ状態にすることです。 ISAPnP 対応のマザーボードのデータバスはハイインピーダンスの場合、 論理値 1(High)になるように、細工(電気抵抗でプルアップ)されていますので、 論理値 1(High)のビットも正しく読み出せます。

もし、データバスの同じビットに対し、あるカードが論理値 1 を駆動し、別の カードが論理値 0 を駆動した場合、論理値 1 を出したカードはビットが 0 に ならないようにがんばり、論理値 0 を出したカードはビットを 0 にしようと がんばってしまいます。その結果、両者のカードの間に大電流が流れ、 両方のカードが壊れてしまいます。 論理値 1(High) を駆動せず、ハイインピーダンスにすれば、 プルアップしている電気抵抗によって電流が制限されていますので、 カードは壊れません。 また、論理値 0 同士の場合は、どちらかのカードも、論理値 0 になれば、 それ以上電流は流れないので、両カードは壊れません。

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 対応ハードウェアのコンフィグレーションレジスタのアクセス方法は 下記の通りです。

書き込み

アドレスポートに、コンフィグレーションレジスタのアドレス番号を書き込みます。 次に、書き込むべきデータ数の分だけ、ライトデータポートに、データを 書き込みます。

読み込み

アドレスポートに コンフィグレーションレジスタのアドレス番号を書き込みます。 次に、読み込むべきデータ数の分だけ、リードデータポートから、データを 読み込みます。

12.2 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 のカード。負け組は、手を挙げているカードが無いか、調べる。

敗者復活

誰も勝者がいなければ(手が挙がらないとき)、次の勝負に進める。

負け組は敗者復活のときにしか、次の勝負に進めません。 そして、優勝したカードには、番号(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 カードの分離もできます。

チェックサムの計算

チェックサムの計算は 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 カードのリソースを読み込む方法 です。

  1. OS は CSN を出力します。
  2. OS は ISAPnP カードの論理デバイスを指定します。
  3. OS は ISAPnP のリソースの種類を指定します。
  4. ISAPnP カードは指定された論理デバイスのリソースを出力します。
  5. OS はリソースを読み込みます。

リソースの書き込み

下記の手順で OS は ISAPnP カードのリソースを書き込みます。

  1. OS は CSN を出力します。
  2. OS は ISAPnP カードの論理デバイスを指定します。
  3. OS は ISAPnP のリソースの種類を指定します。
  4. OS は指定した論理デバイスのリソースを書き込みます。
  5. ISAPnP カードはリソースを設定します。

リソースの種類

リソースの種類は、下記の通りです。種類ごとにフィールドがあり、さらに、それ毎 に、サブフィールドがあります。

メモリ

メモリのフィールドは 四つあります。 メモリのサブフィールドはベースアドレス、コントロール、制限値の 三つがあります。 ベースアドレスはメモリアドレスの上位 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番号が指定されます。 転送方式は データバス幅、連続転送・断続転送等が指定されます。


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