next up previous
次へ: I/Oポートベースアドレスの取得 上へ: PCIリソースの取得 戻る: リソース情報格納用の構造体

PCIデバイスの検索

次に、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構造体型の変数 は、次のようにグローバル変数として宣言しておくことにする。


\begin{boxedminipage}{7cm}
\begin{verbatim}struct pci_dev *current_device;\end{verbatim}
\end{boxedminipage}

この実験で使うDIOボードのPCI-2726Cを製造した会社のベンダIDは16進数の1147 であり、デバイスIDは10進数の2726であるから、PCIデバイスの検索処理は次の ようになる。


\begin{boxedminipage}{11cm}
\begin{verbatim}current_device = pci_find_device(...
...
if (current_device == NULL)
return -ENODEV;\end{verbatim}
\end{boxedminipage}

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



MANOME Yoichi 平成19年1月6日