免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4398 | 回复: 9
打印 上一主题 下一主题

[转]PCI的Linux实现及其驱动 [复制链接]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-31 22:00 |只看该作者 |倒序浏览
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);

论坛徽章:
0
2 [报告]
发表于 2008-11-04 10:02 |只看该作者
8错,PCI用得太广泛了

要弄明白

论坛徽章:
0
3 [报告]
发表于 2008-11-13 19:57 |只看该作者
现在更多的用PCI-E,谁有PCI-E的相关资料建议贴点。

论坛徽章:
0
4 [报告]
发表于 2010-01-14 10:54 |只看该作者

回复 #1 dreamice 的帖子

有没有PCIe的Linux实现及其驱动?PCI和PCIe在驱动上有什么区别吗?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2010-01-14 11:50 |只看该作者
好文。。

论坛徽章:
0
6 [报告]
发表于 2010-01-14 13:56 |只看该作者

回复 #4 mingyuexuan 的帖子

我觉得区别不大。一般应该是OS的总线驱动帮你做掉了。
不过我对PCIE也不是很熟悉,可能有不对的地方。

论坛徽章:
0
7 [报告]
发表于 2010-01-15 09:31 |只看该作者
顶3楼的提议,大家贴点PCI-E的资料

论坛徽章:
0
8 [报告]
发表于 2010-01-15 09:37 |只看该作者

回复 #6 accessory 的帖子

我现在就在做PCI-E接口的驱动,手头上的资料太少了,头疼

论坛徽章:
0
9 [报告]
发表于 2010-01-15 09:40 |只看该作者
以前写网卡驱动的时候感觉PCI和PCI-E是没有区别的,但是块设备就不知道了,只能去尝试

论坛徽章:
0
10 [报告]
发表于 2010-01-17 13:07 |只看该作者
原帖由 mingyuexuan 于 2010-1-14 10:54 发表
有没有PCIe的Linux实现及其驱动?PCI和PCIe在驱动上有什么区别吗?


在Linux中没有专门的PCIe管理,PCIe驱动和PCI驱动是一样的;只是针对PCIe增加了一个热拨插框架,具体咋样没用过,因为热拔插不是简单的软件和总线类型上的支持,估计在PC上用不起来吧。你可以在内核文档中找一下,我记得有讲到的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP