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() 呼び出しがきちんとした例で説明されているポインタを持っている人はいますか?