struct pci_driver {
struct list_head node;
char *name;
const struct pci_device_id *id_table; /* must be non-NULL for probe to be called */
int (*probe) (struct pci_dev *dev, const struct pci_device_id *id); /* New device inserted */
void (*remove) (struct pci_dev *dev); /* Device removed (NULL if not a hot-plug capable driver) */
int (*suspend) (struct pci_dev *dev, pm_message_t state); /* Device suspended */
int (*suspend_late) (struct pci_dev *dev, pm_message_t state);
int (*resume_early) (struct pci_dev *dev);
int (*resume) (struct pci_dev *dev); /* Device woken up */
void (*shutdown) (struct pci_dev *dev);
struct pci_error_handlers *err_handler;
struct device_driver driver;
struct pci_dynids dynids;
};
1、 struct list_head node 这是链表的头
2、char* name 驱动的名字,它必须是唯一的,在内核中所有的PCI驱动里面,通常被设置为各驱动模块名字相同,它显示在在sysfs中的/sysbus/pci/drivers/下。
3、const struct pci_device_id *id_table 是一个指向pci设备的id编号的指针,用于描述当前PCI设备的编号,一般用做probe的输入参数。
4、int (*probe) (struct pci_dev *dev, const struct pci_device_id *id) 指向PCI驱动中的probe函数指针,这个函数被PCI核心调用,当它有一个它认为这个驱动想控制的 struct pci_dev时,一个指向pci_device_id的指针,PCI核心用来做这个决定,也被告传递给这个函数,如果这个PCI驱动需要这个传递给它的struct pci_dev, 它应当正初始化这个设备,并返回0, 如果这个驱动不想拥有这个设备,或者产生一个错误,它应当返回一个负的错误值。
5、void (*remove) (struct pci_dev *dev) 指向PCI核心在struct pci_dev被告从系统中去除时调用的函数指针,或者当PCI驱动被从内核中卸载时。
6、int (*suspend) (struct pci_dev *dev, pm_message_t state) 当struct pci_dev被挂起时PCI核心调用的函数指针,挂起状态在state 变量时传递,这个函数是可选的
7、int (*resume) (struct pci_def *dev) 当pci_dev被告恢复时PCI核心调用的函数指针,它的调用一定是在suspend函数执行之后,这个函数可选。
8、void (*shutdown) (struct pci_dev *dev) 当此设备需要关闭时,此函数指针所指向的函数将会被调用。
9、int (*suspend_late) (struct pci_dev *dev, pm_message_t state) 与suspend功能类似
10、int (*resume_early) (struct pci_dev *dev) 与resume功能类似
11、struct pci_error_handlers *err_handler;
12、struct device_driver driver;
13、struct pci_dynids dynids;
要创建一个正确的struct pci_driver结构,只需要4个字段被正确初始化:
static struct pci_driver test_pci_driver = {
.name = "test_pci",
.id_table = test_ids,
.probe = test_probe,
.remove = test_remove,
};
阅读(984) | 评论(0) | 转发(0) |