次に、PCIデバイス情報をカーネルから取得するために、PCIデバイスの検索を行
う。PCIデバイスを特定するために、ベンダIDとデバイスIDを指定して
pci_find_device関数を実行する。このpci_find_device関数は
ヘッダーファイル/usr/include/linux/pci.hのなかで、pci_dev構
造体型の関数として、次のように定義されている。
struct pci_dev *pci_find_device(
unsigned int vender, // ベンダID
unsigned int device, // デバイスID
const struct pci_dev *from // 検索開始位置
);
パラメータ(引数)はつぎのような意味を持つ。
vende: ベンダIDを指定する。
device: デバイスIDを指定する。
from: 検索を開始するデバイスを指定する。
最初のデバイスを検索するばあいは、NULLを指定する。
|
今回のプログラムでは、pci_dev構造体型の変数は、次のようにグローバ
ル変数として宣言しておくことにする。
この実験で使うDIOボードのPCI-2726Cを製造した会社のベンダIDは16進数の1147 であり、デバイスIDは2726であるから、PCIデバイスの検索処理は次のようにな る。
デバイスが見つかると、戻り値としてPCIデバイス情報の構造体
(pci_dev)のポインタが返される。このポインターデータは、PCIコンフィ
ギュレーション空間へのアクセスを行うときに必要となる。なお、検索に失敗し
た場合にはNULLが返される。
デバイスの検索に失敗した後の処理は-ENODEVというカーネル内で規定さ
れたエラーコード(linux/errno.h)を使用して、上記のようにデバイスが
見つからなかったことを通知している。