次に、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は10進数の2726であるから、PCIデバイスの検索処理は次の ようになる。
デバイスが見つかると、戻り値としてPCIデバイス情報の構造体
(pci_dev
)のポインタが返される。このポインターデータは、PCIコンフィ
ギュレーション空間へのアクセスを行うときに必要となる。なお、検索に失敗し
た場合にはNULLが返される。
デバイスの検索に失敗した後の処理は-ENODEV
というカーネル内で規定さ
れたエラーコード(linux/errno.h
)を使用して、上記のようにデバイスが
見つからなかったことを通知することにする。