1 PCI设备上有三种地址空间:PCI的I/O空间、PCI的存储空间、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);