2

PCI ドライバーの書き方を学び始めたところですが、最初に行ったのは、特定のデバイスがバス上に存在するかどうかを調べることでした。いくつかの本とインターネットを検索した後、動作する以下のプログラムを書き留めることができましたが、いくつかの概念については明確ではありません。

1 /*
  2  Program to find a device on the PCI sub-system 
  3 */
  4 #define VENDOR_ID       0x8086
  5 #define DEVICE_ID       0x7113
  6 
  7 #include <linux/kernel.h>
  8 #include <linux/module.h>
  9 #include <linux/stddef.h>
 10 #include <linux/pci.h>
 11 #include <linux/init.h>
 12 #include <linux/cdev.h>
 13 #include <linux/device.h>
 14 
 15 #define LOG(string...) printk(KERN_NOTICE string)
 16 
 17 #define CDEV_MAJOR      227
 18 #define CDEV_MINOR      0
 19 
 20 
 21 MODULE_LICENSE("GPL");
 22 
 23 struct pci_dev *pci_dev;
 24 unsigned long mmio_addr;
 25 unsigned long reg_len;
 26 unsigned long *base_addr;
 27 
 28 int device_probe(struct pci_dev *dev, const struct pci_device_id *id);
 29 void device_remove(struct pci_dev *dev);
 30 
 31 struct pci_device_id  pci_device_id_DevicePCI[] =
 32 {

33         {VENDOR_ID, DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
 34         {}  // end of list
 35 };
 36 
 37 struct pci_driver  pci_driver_DevicePCI =
 38 {
 39   name: "MyPCIDevice",
 40   id_table: pci_device_id_DevicePCI,
 41   probe: device_probe,
 42   remove: device_remove
 43 };
 44 
 45 
 46 int init_module(void)
 47 {
 48         struct pci_dev *pdev = NULL;
 49         int ret = 0;
 50 
 51         pci_register_driver(&pci_driver_DevicePCI);
 52         pdev = pci_get_device(VENDOR_ID, DEVICE_ID, NULL);
 53         if (pdev)
 54         {
 55                 LOG("Device found ... ");
 56                 pci_dev = pdev;
 57         }
 58         else
 59         {
 60                 LOG("Device not found ... ");
 61         }
 62         return ret;

 63 
 64 
 65 }
 66 
 67 void cleanup_module(void)
 68 {
 69         pci_unregister_driver(&pci_driver_DevicePCI);
 70 
 71 }
 72 
 73 int device_probe(struct pci_dev *dev, const struct pci_device_id *id)
 74 {
 75         int ret;
 76         LOG("Devie probed");
 77         ret  = pci_enable_device(dev);
 78         if (ret < 0 ) LOG("Failed while enabling ... ");
 79 
 80         return ret;
 81 }
 82 
 83 void device_remove(struct pci_dev *dev)
 84 {
 85   pci_release_regions(dev);
 86   pci_disable_device(dev);
 87 }

init_module() 関数内で、指定されたユーザー VID および DID デバイスが検出され、成功した場合、struct pdev はそれぞれの pci デバイスを指しています。私が読んだように、デバイスが見つかるとすぐに probe() 関数が作動します。

これは、pci_enable_device() を呼び出す前に常に pci_get_device() を実行する必要があるということですか? IMO、はい、そうですが、渡していないのにdevice_probe()がdev構造への参照を取得するにはどうすればよいですか?

デバイスがシステム上に存在することを 100% 確信している場合、登録せずに pci_enable_device() を呼び出すにはどうすればよいですか?

私は現在、すべての呼び出しを説明しているLDD3の本を参照していますが、初心者にとっては、ドットを接続する方法を見逃していると感じています. 広く使用されている pci_xx() 呼び出しがきちんとした例で説明されているポインタを持っている人はいますか?

4

1 に答える 1

1

関数probeは によって呼び出されpci_register_driver、一致するデバイス ID を持つ要求されていないデバイスを検索します。

あなたのpci_get_device呼び出しはprobeが戻った後に発生し、必要ありません。

于 2013-11-14T20:20:19.940 に答える