第 5 章 インタフェースモジュール制御 80
5.2 ハードウェアリソース情報取得・表示
5.2.3 ハードウェアリソース情報取得方法
DOS System開発らくらくパッケージの総合ライブラリを使用することで、ハードウ ェアリソース情報の取得をプログラム上から簡単に行うことができます。
■概要
総合ライブラリを使用することで、プログラム上から簡単にハードウェアリソース情報を取得す ることができます。
総合ライブラリのAPI関数をプログラム上から使用する場合は「include」ディレクトリ内の
「IFCM.H」を使用し、「lib」ディレクトリ内からご使用のコンパイラ, メモリモデルに合った総
合ライブラリをリンクして使用してください。
総合ライブラリのリソース取得機能を利用する場合、PCIコンフィギュレーション情報として、以 下の4つがポイントとなります。
コンフィギュレーション情報 内 容
Vendor ID ベンダID。PCIデバイスメーカを示すIDです。
弊社製品は1147hになっています。
Device ID デバイスID。ベンダIDで指定されるPCIデバイスメーカが自
社のデバイスに割り当てた16ビットのIDです。
弊社製品のデバイスIDは製品型式になっています。
(例)PCI-2702Cなら0A8Eh(2702), PCI-466102なら1235h(4661) になります。
※ 詳細は各GPDシリーズをご確認ください。
Base Address I/Oポートやメモリの先頭アドレスです。BIOSがPCIデバイス
に、自動的に割り当てます。
PCIデバイスは1枚で最大6つのBaseAddressを持つことができ ます。最下位ビットが1の時、このBaseAddressはI/O空間を意 味します。実際のI/Oポートアドレスは、この値をFFFChでマ スクした値です。
また、最下位ビットが0の時、このベースアドレスはメモリ 空間を意味します。実際のメモリアドレスは、この値を FFFFFFF0hでマスクした値です。
Interrupt Line 割り込み番号です。BaseAddress同様BIOSがPCIデバイスに自
動的に割り当てます。
総合ライブラリは、ベンダIDとデバイスIDでインタフェースモジュールを特定し、そのインタ フェースモジュールに割り当てられているPCIコンフィギュレーション情報を取得します。
■リソース情報取得ライブラリ関数一覧
No. 関数名 機 能
リソース情報取得関数個別説明 1. PciGetConfigReg
【機能】
ベンダID, デバイスIDから、インタフェースモジュールに割り当てられたI/Oポートアドレス, メモリアドレス, 割り込み番号を取得します。サブシステムID, サブベンダIDを区別する時や、
全てのPCIコンフィギュレーションレジスタの値を取得したい場合は、PciGetConfigRegEx関数 を使用します。
【書式】
#include "IFCM.h"
int IFCDECL PciGetConfigReg(
int index,
unsigned int ven_id, unsigned int dev_id, unsigned long bar[], char *irq
)
【パラメータ】
index ハードウェアリソース情報を取得したいPCIデバイスの、インタフェース
モジュールのインデックス番号を指定します。
(RSW1の値とは関係ありません)
同一型式のインタフェースモジュールが1枚しかない場合は1を指定しま す。複数枚ある場合には何枚目のPCIデバイスのリソースを取得するか指 定します。
ven_id ハードウェアリソース情報を取得したいインタフェースモジュールのベ
ンダIDを指定します。
dev_id ハードウェアリソース情報を取得したいインタフェースモジュールのデ
バイスIDを指定します。
bar[] BaseAddress[0]〜BaseAddress[5]を格納する変数へのポインタです。
irq 割り込み番号を格納する変数へのポインタです。
【戻り値】
0 :正常終了(インタフェースモジュールが見つかりました)。
-1 : PCI BIOSがありません。
-2 :インタフェースモジュールが1枚も見つかりませんでした。
-3 :これ以上インタフェースモジュールがありません。
-9 :本関数はIntel(R) Atom(TM) プロセッサ搭載 ( DOS System MODEL)以外で は使用できません。
注意
!
2. PciGetConfigRegEx
【機能】
ベンダID, デバイスID, サブベンダID, サブシステムIDから、インタフェースモジュールに割 り当てられたI/Oポートアドレス, メモリアドレス, 割り込み番号を取得します。
本関数では、全てのPCIコンフィギュレーションレジスタの値を取得できます。
【書式】
#include "IFCM.h"
int IFCDECL PciGetConfigRegEx(
int index,
unsigned int ven_id, unsigned int dev_id, unsigned int subven_id, unsigned int subsys_id, unsigned int *bus_info, PPCI_CONFIG pciData )
【パラメータ】
index インタフェースモジュールのインデックス番号を指定します。
(RSW1の値とは関係ありません)
同一型式のインタフェースモジュールが1枚しかない場合は1を指定しま す。複数枚ある場合には何枚目のインタフェースモジュールのリソース を取得するか指定します。
ven_id インタフェースモジュールのベンダIDを指定します。
dev_id インタフェースモジュールのデバイスIDを指定します。
subven_id インタフェースモジュールのサブベンダIDを指定します。
subsys_id インタフェースモジュールのサブシステムIDを指定します。
bus_info バス情報を格納する変数へのポインタです。
バス情報は、以下の形式で格納されます。
ビット15〜ビット8:バス番号 ビット7〜ビット3:デバイス番号
ビット2〜ビット0:ファンクション番号
pciData PCIコンフィギュレーションレジスタの値を格納する構造体へのポイン
タです。
【戻り値】
0 :正常終了(インタフェースモジュールが見つかりました)。 -1 : PCI BIOSがありません。
-2 :インタフェースモジュールが1枚も見つかりませんでした。
-3 :これ以上インタフェースモジュールがありません。
-9 :本関数はIntel(R) Atom(TM) プロセッサ搭載 ( DOS System MODEL)以外で
■構造体説明
PCI_CONFIG構造体
【機能】
PCIコンフィギュレーションレジスタの値を格納します。
【書式】
typedef struct _PCI_CONFIG {
unsigned short VendorID; /* 00: Vendor ID */
unsigned short DeviceID; /* 02: Device ID */
unsigned short Command; /* 04: Command */
unsigned short Status; /* 06: Status */
unsigned char RevisionID; /* 08: Revision */
unsigned char ProgIf; /* 09: ProgIf */
unsigned char SubClass; /* 0A: Sub Class */
unsigned char BaseClass; /* 0B: Base */
unsigned char CacheLineSize; /* 0C: Cache Line */
unsigned char LatencyTimer; /* 0D: Latency */
unsigned char HeaderType; /* 0E: Header */
unsigned char BIST; /* 0F: BIST */
unsigned long BaseAddresses[6]; /* 10: Base Address */
unsigned long CIS; /* 28: CIS Pointer */
unsigned short SubVendorID; /* 2C: Subsystem Vendor ID */
unsigned short SubSystemID; /* 2E: Subsystem ID */
unsigned long ROMBaseAddress; /* 30: ROM Base Address */
unsigned char CapabilitiesPtr; /* 34: Capabilities Pointer */
unsigned char Reserved1[3]; /* 35: Reserved */
unsigned long Reserved2[1]; /* 38: Reserved */
unsigned char InterruptLine; /* 3C: INT Line */
unsigned char InterruptPin; /* 3D: INT Pin */
unsigned char MinimumGrant; /* 3E: MIN_GNT */
unsigned char MaximumLatency; /* 3F: MAX_LAT */
unsigned char DeviceSpecific[192]; /* 40: */
} PCI_CONFIG, *PPCI_CONFIG;
【パラメータ】
ここでは、主なパラメータのみを説明します。
BaseAddresses[6] BaseAddress[0]〜BaseAddress[5]を格納する変数です。
InterruptLine 割り込み番号を格納する変数です。
RevisionID Revisionを格納する変数です。
他のパラメータについては、PCI仕様書をご覧ください。
■リソース情報取得関数使用例
リソース情報取得関数を使用したサンプルプログラムで使用例の説明をします。
下記の処理を実行することで、PCIデバイスのI/Oポート, メモリ, 割り込み等のリソースを取得で きます。
【プログラム例(PCI-3161)】
01 /* PCI-3161のリソース情報を取得し、表示するプログラム例です。 */
02 #include <stdio.h>
03 #include "IFCM.h" /* 総合ライブラリヘッダファイル */
04 unsigned long bar[6]; /* ベースアドレスを格納する配列 */
05 unsigned short ioadr; /* I/Oポートアドレスを格納する変数 */
06 unsigned long memadr; /* メモリアドレスを格納する変数 */
07 char irq; /* 割り込み番号を格納する変数 */
08 void main(void) 09 {
10 PciGetConfigReg ( 1, 0x1147, 3161, bar, &irq );/* リソース情報の取得 */
11 ioadr = (unsigned short)bar[0] & 0xfffc; /* I/Oポートアドレス抽出 */
12 memadr = (unsigned short)bar[1] & 0xfffffff0L; /* メモリアドレス抽出 */
13 printf ( "I/O PORT ADDRESS:%4x¥n" , ioadr ); /* I/Oポートアドレス表示 */
14 printf ( "MEMORY ADDRESS:%8x¥n" , memadr ); /* メモリアドレス表示 */
15 printf ( "INTERRUPT NUMBER:%d¥n" , irq ); /* 割り込み番号表示 */
16 }
【解説】
ハードウェアリソース情報を取得したいインタフェースモジュールを、インデックス番号, ベン ダID, デバイスIDの3つでPciGetConfigReg関数に特定させます。
PciGetConfigReg関数はbarにI/Oポートかメモリアドレスを格納し、irqには割り込み番号が格納し ます。抽出したioadrにI/Oアクセス、memadrにメモリアクセスすれば、ハードウェアを直接制御す ることができます。
注意
!
リンク時は総合ライブラリを一緒にリンクしてください。