INtimeドキュメンタリトップへ

PCIボードを検出しろ!!

10月11日・・・PCIボード検出の意味は!?

PCIデバイスの検出について納得しましたが、はて? PCIデバイスを検出して、他どうするのか?

これについてマネージャーに聞いたところ・・

「PCIデバイスを検出する(PciFindDeviceにより)ということはそのデバイスのI/O領域に対して入出力ができるということだから、デバイスの特定するレジスタ領域からメモリの状態を読み込んだり、あるいは、書き込んだりすることによって、PCIデバイスを制御するんです・・・。」

「・・・・・・・・・・・・・・・・・・・・・・・・・・はぁ・・・・・・・・・・・・・・・・・・・。」


その後、マネージャーはなにやらごそごそと、PCIバスの詳細について記述のある本をとりだし、説明を始めました。

「これはPCIデバイスのコンフィギュレーションレジスタの構造を解かりやすくテーブルにしたものだから参考に・・・」

「・・・・・・・・・・・・・・・・・解りやすく・・・・・・・・・?」  
   ≪・・・どこが・・・?≫


31 16 15 0

デバイスID

ベンダID
ステータス
コマンド
クラス・コード
レビジョンID
BIST
ヘッダ・タイプ
レイテンシ・タイマ
キャッシュ・ライン・サイズ
ベース・アドレス・レジスタ
予約
予約
拡張ROMベース・アドレス
予約
予約
最大レイテンシ
最小グラント
インタラプト・ピン
インタラプト・ライン
00h
04h
08h
0Ch
10h
14h
18h
1Ch
20h
24h
28h
2Ch
30h
34h
38h
3Ch

途中経過

「・・・・・この中で解っているものって言ったら 「ベンダーID」と「デバイスID」くらいのものしかないですよ・・・・。」

「それではこうなったら解りやすくなる?下図は以前に使用したPciFindDeviceで引数として渡す構造体の詳細を示したものだけど、なにかイメージ湧かない?」


「なにか・・・いめーじ・・・確かにベンダーID、デバイスID・・・

おっっと!!・・・これはPCIデバイスのコンフィギュレーションレジスタの構造と似ていますね!!」



typedef struct { WORD wBusNum; .............バス番号 入力フィールド WORD wDeviceNum; ..........デバイス番号 入力フィールド WORD wFunction; ...........ファンクション番号 入力フィールド WORD wVendorId; ...........ベンダーID 入力フィールド WORD wDeviceId; ...........デバイスID 入力フィールド WORD wDeviceIndex; ........デバイス検索番号 WORD wCommand; ............コマンド WORD wClassId; ............クラス・コード BYTE byInterfaceId; .......クラス・コード BYTE byRevId; .............レビジョンID BYTE byCLS; ...............キャッシュラインサイズ BYTE byLatency; ...........レイテンシ・タイマ DWORD dwBaseAddr[6]; ......ベースアドレスレジスタ DWORD dwCIS; WORD wSubSystem VendorId; WORD wSubSystemId; DWORD dwRomBaseAddr; ......拡張ROMベースアドレス BYTE byIntLine; ...........インタラプト・ライン BYTE byIntPin; ............インタラプト・ピン BYTE byMaxLatency; ........最大レイテンシ BYTE byMinGrant; ..........最小グラント
} PCIDEV, *LPPCIDEV;

本日の感想

「そうです、PciFindDeviceはこの構造体にベンダーIDとデバイスIDの情報を格納し、PCIデバイスを確定し、そのデバイスのコンフィギュレーションレジスタの値をこの中に書き込んでいるんです。」

「・・・・・。」

「PCIデバイスの先頭から64バイトはコンフィギュレーションレジスタ空間ヘッダといって、PCIバスの仕様で、決定されている領域です。
ベンダーが固有のカスタマイズする領域はベースアドレスからなんですよ。」


「・・・・・。」


「つまり、PCIバスの仕様で、通常ベンダーがI/O空間として、あるいはメモリ空間として構築できる領域はベースアドレスレジスタからです。」



「つまり・・・?」

「つまりベースアドレスレジスタがマニュアルでいうI/Oベースアドレスです。」

「すばらしい・・・!!!明白!!・・・ということはマニュアルに書いてある0+8h とか 0+0Chはベースアドレスから何番地離れているか(オフセット値)を示していたわけか!!

つまり、ボード検出時に取得しなければならないものは・・・ベースアドレス!!

・・・ベースアドレスといえば・・ dwBaseAddr[0]; のことですか!!」


「そうですね・・・それともうひとつあります。割り込みレベルです・・・ADボードは割り込みを使用するんでしょ?」


「なるほど・・・!!」



※TenAsys®, INtime®, eVM® and iRMX® are registered trademarks in USA of the TenAsys Corporation.