PCI的Linux实现及其驱动

PCI的Linux实现及其驱动

在Linxu下面driver/pci目录是PCI的初始化和bus的驱动,实现了dev和bus的常用的services

在driver其他目录那,比如ide和net目录下面,有相应的具体pci设备的驱动。

一个完整的PCI驱动必要的数据结构都有:

pci_driver

这个数据结构在文件include/linux/pci.h里,这是Linux内核版本2.4之后为新型的PCI设备驱动程序所添加的,其中最主要的是用于识别设备的id_table结构,以及用于检测设备的函数probe( )和卸载设备的函数remove( )

pci_dev

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

在PCI驱动中常见的由Linux所提供的services例程有:

注册/注销PCI上的设备

pci_register_driver()

pci_unregister_driver()

找到指定PCI设备:

pci_get_device()

pci_get_class()

pci_get_subsys()

启用/禁用PCI设备

pci_enable_device()

pci_disable_device()

寻址和中断

request_io_region()

request_mem_region()

配置空间访问相关:

pci_(read|write)_config_(byte|word|dword)

Misc.

pci_enable_device()

pci_set_master()

pci_set_swi()

一个完整的PCI驱动编写框架为:

/* 指明该驱动程序适用于哪一些PCI设备 */
static struct pci_device_id demo_pci_tbl [] __initdata = {
    {PCI_VENDOR_ID_DEMO, PCI_DEVICE_ID_DEMO,
     PCI_ANY_ID, PCI_ANY_ID, 0, 0, DEMO},
    {0,}
};
/* 对特定PCI设备进行描述的数据结构 */
struct demo_card {
    unsigned int magic;
    /* 使用链表保存所有同类的PCI设备 */
    struct demo_card *next;
    /* ... */
}
/* 中断处理模块 */
static void demo_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    /* ... */
}
/* 设备文件操作接口 */
static struct file_operations demo_fops = {
    owner:      THIS_MODULE,   /* demo_fops所属的设备模块 */
    read:       demo_read,    /* 读设备操作*/
    write:      demo_write,    /* 写设备操作*/
    ioctl:      demo_ioctl,    /* 控制设备操作*/
    mmap:       demo_mmap,    /* 内存重映射操作*/
    open:       demo_open,    /* 打开设备操作*/
    release:    demo_release    /* 释放设备操作*/
    /* ... */
};
/* 设备模块信息 */
static struct pci_driver demo_pci_driver = {
    name:       demo_MODULE_NAME,    /* 设备模块名称 */
    id_table:   demo_pci_tbl,    /* 能够驱动的设备列表 */
    probe:      demo_probe,    /* 查找并初始化设备 */
    remove:     demo_remove    /* 卸载设备模块 */
    /* ... */
};
static int __init demo_init_module (void)
{
    /* ... */
}
static void __exit demo_cleanup_module (void)
{
    pci_unregister_driver(&demo_pci_driver);
}
/* 加载驱动程序模块入口 */
module_init(demo_init_module);
/* 卸载驱动程序模块入口 */
module_exit(demo_cleanup_module);

转载于:https://www.cnblogs.com/garybo/archive/2008/10/31/1323702.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值