免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5887 | 回复: 21

请问可以用PCI驱动程序来驱动一个字符设备吗? [复制链接]

论坛徽章:
0
发表于 2009-03-11 10:48 |显示全部楼层
10可用积分
如题所述。

想用驱动PCI设备的方式来驱动一块内存,不知道有没有这样的实现方式,

我想来练练手,不知道大家有这方面的资料或者代码吗?

论坛徽章:
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
发表于 2009-03-11 10:55 |显示全部楼层
原帖由 almeydifer 于 2009-3-11 10:48 发表
如题所述。

想用驱动PCI设备的方式来驱动一块内存,不知道有没有这样的实现方式,

我想来练练手,不知道大家有这方面的资料或者代码吗?


LZ看一下LDD3中PCI部分的介绍。我对PCI没来及深入学习呢。字符驱动是可以这样实现的。LZ看一下PCI的对应结构体中,能否存放一些私有数据(pointer),如果可以的话,就可以将这个pointer指向这块内存了。

论坛徽章:
0
发表于 2009-03-11 11:03 |显示全部楼层
谢谢Godbach,我现在找到了ldd3的一个源文件,对应于PCI驱动那一章。这个文件在pci文件夹里面,名称是:Pci_skel.c,但是我不知道它驱动的是什么设备,大家注意那个
static struct pci_device_id ids[] = {
    { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3), },
    { 0, }
};

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/init.h>


static struct pci_device_id ids[] = {
    { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3), },
    { 0, }
};
MODULE_DEVICE_TABLE(pci, ids);

static unsigned char skel_get_revision(struct pci_dev *dev)
{
    u8 revision;

    pci_read_config_byte(dev, PCI_REVISION_ID, &revision);
    return revision;
}

static int probe(struct pci_dev *dev, const struct pci_device_id *id)
{
    /* Do probing type stuff here.  
     * Like calling request_region();
     */

    pci_enable_device(dev);
   
    if (skel_get_revision(dev) == 0x42)
        return -ENODEV;


    return 0;
}

static void remove(struct pci_dev *dev)
{
    /* clean up any allocated resources and stuff here.
     * like call release_region();
     */

}

static struct pci_driver pci_driver = {
    .name = "pci_skel",
    .id_table = ids,
    .probe = probe,
    .remove = remove,
};

static int __init pci_skel_init(void)
{
    return pci_register_driver(&pci_driver);
}

static void __exit pci_skel_exit(void)
{
    pci_unregister_driver(&pci_driver);
}

MODULE_LICENSE("GPL");

module_init(pci_skel_init);
module_exit(pci_skel_exit);

论坛徽章:
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
发表于 2009-03-11 11:06 |显示全部楼层
static struct pci_device_id ids[] = {
    { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3), },
    { 0, }
};


从这里面可以看书应该是intel的设备。我记得LDD3上介绍PCI的时候,是不需要什么特殊设备的。LZ仔细看一下这一章的例程是如何使用的。

论坛徽章:
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
发表于 2009-03-11 11:07 |显示全部楼层
LZ直接编译一下这个程序,加载一下模块,自己调试一下看看。我这里可以直接编译通过,insmod到内核。

论坛徽章:
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
发表于 2009-03-11 11:11 |显示全部楼层
看了一下这个程序,这里应该是提供一个PCI驱动的框架程序吧。具体什么功能自己可以往里面添加。
就像USB那一章一样,有一个usb-skeleton.c

论坛徽章:
0
发表于 2009-03-11 11:13 |显示全部楼层
好的,我马上试试

论坛徽章:
0
发表于 2009-03-11 11:15 |显示全部楼层

回复 #3 almeydifer 的帖子

LDD3中的这个例子什么设备都不是。PCI设备驱动是针对硬件而言的,如何和硬件想结合完成某种功能,而字符设备是驱动通过操作系统提供给用户的一种接口,一般是和应用程序结合的,所以这两者并没有必然联系,PCI驱动当然可以实现为一个字符设备。
不过Linux内核代码中带的PCI驱动主要是网络设备的,好像没见过字符设备的。我本来有一个,开始是测试Xilinx V5板子的,后来想改为一个通用的,可以通过参数加载做为不同板卡的一个驱动,完全一些简单的信息访问,但没有完成。不过它没在我本子中,你先再找一找吧;不过结合LDD3的另一个例子scullc你应该能做出来的,只是针对真正的板卡的话问题在于LDD3的PCI驱动太“单薄”了,许多东西没讲清楚。

论坛徽章:
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
发表于 2009-03-11 11:29 |显示全部楼层

回复 #8 Cyberman.Wu 的帖子

恩。这个程序其实就是相当于一个骨架而已。

论坛徽章:
0
发表于 2009-03-11 15:01 |显示全部楼层
多谢大家的解答,
现在的问题是不知道通过什么方式将字符设备和PCI驱动联系起来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP