1 PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间、PCI的配置空间,现在小编就来说说关于linux pci总线驱动 liunx中的PCI驱动?下面内容希望能帮助到你,我们来一起看看吧!

linux pci总线驱动 liunx中的PCI驱动

linux pci总线驱动 liunx中的PCI驱动

1 PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间、PCI的配置空间。

l PCI驱动程序中,有几个关键数据结构

Pci_driver:这个数据结构在include/linux/pci.h,其中最重要的是用于识别设备的id_table结构,以及用于检测设备的函数probe()和卸载设备的函数remove()

struct pci_driver {

struct list_head node;

char *name;

const struct pci_device_id *id_table;

int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);

void (*remove) (struct pci_dev *dev);

int (*save_state) (struct pci_dev *dev, u32 state);

int (*suspend)(struct pci_dev *dev, u32 state);

int (*resume) (struct pci_dev *dev);

int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);

};

l Pci_dev:这个数据结构在include/linux/pci.h,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、

l 基本框架;通常至少实现以下几部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块

l PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间、PCI的配置空间。

l PCI驱动程序中,有几个关键数据结构

Pci_driver:这个数据结构在include/linux/pci.h,其中最重要的是用于识别设备的id_table结构,以及用于检测设备的函数probe()和卸载设备的函数remove()

struct pci_driver {

struct list_head node;

char *name;

const struct pci_device_id *id_table;

int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);

void (*remove) (struct pci_dev *dev);

int (*save_state) (struct pci_dev *dev, u32 state);

int (*suspend)(struct pci_dev *dev, u32 state);

int (*resume) (struct pci_dev *dev);

int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);

};

l Pci_dev:这个数据结构在include/linux/pci.h,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、

l 基本框架;通常至少实现以下几部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块

PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间、PCI的配置空间。

PCI驱动程序中,有几个关键数据结构

Pci_driver:这个数据结构在include/linux/pci.h,其中最重要的是用于识别设备的id_table结构,以及用于检测设备的函数probe()和卸载设备的函数remove()

struct pci_driver {

struct list_head node;

char *name;

const struct pci_device_id *id_table;

int (*probe) (struct pci_dev *dev, const struct pci_device_id *id);

void (*remove) (struct pci_dev *dev);

int (*save_state) (struct pci_dev *dev, u32 state);

int (*suspend)(struct pci_dev *dev, u32 state);

int (*resume) (struct pci_dev *dev);

int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);

};

Pci_dev:这个数据结构在include/linux/pci.h,它详细描述了一个PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、

基本框架;通常至少实现以下几部分:初始化设备模块、设备打开模块、数据读写和控制模块、中断处理模块、设备释放模块、设备卸载模块

/* 指明该驱动程序适用于哪一些PCI设备 */ static struct pci_device_id my_pci_tbl [] __initdata = { {PCI_VENDOR_ID, PCI_DEVICE_ID,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} }; /* 对特定PCI设备进行描述的数据结构 */ struct device_private { ... } /* 中断处理模块 */ static irqreturn_t device_interrupt(int irq, void *dev_id) { /* ... */ } /* 设备文件操作接口 */ static struct file_operations device_fops = { owner: THIS_MODULE, /* demo_fops所属的设备模块 */ read: device_read, /* 读设备操作*/ write: device_write, /* 写设备操作*/ ioctl: device_ioctl, /* 控制设备操作*/ mmap: device_mmap, /* 内存重映射操作*/ open: device_open, /* 打开设备操作*/ release: device_release /* 释放设备操作*/ /* ... */ }; /* 设备模块信息 */ static struct pci_driver my_pci_driver = { name: DEVICE_MODULE_NAME, /* 设备模块名称 */ id_table: device_pci_tbl, /* 能够驱动的设备列表 */ probe: device_probe, /* 查找并初始化设备 */ remove: device_remove /* 卸载设备模块 */ /* ... */ }; static int __init init_module (void) { /* ... */ } static void __exit cleanup_module (void) { pci_unregister_driver(&my_pci_driver); } /* 加载驱动程序模块入口 */ module_init(init_module); /* 卸载驱动程序模块入口 */ module_exit(cleanup_module);

,