免费注册 查看新帖 |

Chinaunix

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

一个法国人写的虚拟PCI设备驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-09 17:23 |只看该作者 |倒序浏览
模块可以加载,但是probe函数不知道怎么回事,还是不能自己调用,不知道要做些什么其他的步骤。

pci-driver.rar

3.05 KB, 下载次数: 125

论坛徽章:
0
2 [报告]
发表于 2009-04-09 19:01 |只看该作者
static int pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
    int ret, minor;
    struct cdev *cdev;
    dev_t devno;

    /* add this pci device in pci_cdev */
&nbsp;&nbsp;&nbsp;&nbsp;if ((minor = pci_cdev_add(pci_cdev, MAX_DEVICE, dev)) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto error;

&nbsp;&nbsp;&nbsp;&nbsp;/* compute major/minor number */
&nbsp;&nbsp;&nbsp;&nbsp;devno = MKDEV(major, minor);

&nbsp;&nbsp;&nbsp;&nbsp;/* allocate struct cdev */
&nbsp;&nbsp;&nbsp;&nbsp;cdev = cdev_alloc();

&nbsp;&nbsp;&nbsp;&nbsp;/* initialise struct cdev */
&nbsp;&nbsp;&nbsp;&nbsp;cdev_init(cdev, &pci_ops);
&nbsp;&nbsp;&nbsp;&nbsp;cdev->owner = THIS_MODULE;

&nbsp;&nbsp;&nbsp;&nbsp;/* register cdev */
&nbsp;&nbsp;&nbsp;&nbsp;ret = cdev_add(cdev, devno, 1);
&nbsp;&nbsp;&nbsp;&nbsp;if (ret < 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_err(&(dev->dev), "Can't register character device\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto error;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;pci_cdev[minor].cdev = cdev;

&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "%s The major device number is %d (%d).\n",
&nbsp;&nbsp;&nbsp;&nbsp;       "Registeration is a success", MAJOR(devno), MINOR(devno));
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "If you want to talk to the device driver,\n");
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "you'll have to create a device file. \n");
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "We suggest you use:\n");
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "mknod %s c %d %d\n", DEVICE_NAME, MAJOR(devno), MINOR(devno));
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "The device file name is important, because\n");
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "the ioctl program assumes that's the\n");
&nbsp;&nbsp;&nbsp;&nbsp;dev_info(&(dev->dev), "file you'll use.\n");

&nbsp;&nbsp;&nbsp;&nbsp;/* enable the device */
&nbsp;&nbsp;&nbsp;&nbsp;pci_enable_device(dev);

&nbsp;&nbsp;&nbsp;&nbsp;/* 'alloc' IO to talk with the card */
&nbsp;&nbsp;&nbsp;&nbsp;if (pci_request_region(dev, BAR_IO, "IO-pci") == 0) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_err(&(dev->dev), "Can't request BAR2\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdev_del(cdev);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto error;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;/* check that BAR_IO is *really* IO region */
&nbsp;&nbsp;&nbsp;&nbsp;if ((pci_resource_flags(dev, BAR_IO) & IORESOURCE_IO) != IORESOURCE_IO) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_err(&(dev->dev), "BAR2 isn't an IO region\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdev_del(cdev);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto error;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;return 1;

error:
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
3 [报告]
发表于 2009-04-09 19:20 |只看该作者
这个应该写的很初级了,probe函数怎么就是调用不起来呢?
盼解答

论坛徽章:
0
4 [报告]
发表于 2009-04-09 23:31 |只看该作者
网卡就是典型的pci设备。probe函数是系统调用的

论坛徽章:
0
5 [报告]
发表于 2009-04-10 17:59 |只看该作者
必须注册了device才会调用该driver的probe.

论坛徽章:
0
6 [报告]
发表于 2009-04-12 23:07 |只看该作者
原帖由 tonyen 于 2009-4-10 17:59 发表
必须注册了device才会调用该driver的probe.


是这样的。
不防设想device已经注册挂载到pci_bus上了,然后加载pci 驱动,会做如下的事:
在安装pci驱动的时候,会遍历这个驱动对应的总线上拥有的各个设备,对每个设备分别调用__driver_attach(drv,dev)函数来尝试
将其与驱动匹配绑定,如果能成功就说明那个设备与本驱动match上了。

__driver_attach()函数主要调用driver_probe_device(),其用总线的match()函数来判断drv与dev是否匹配,用really_probe()
引用注册的用户定义的xxx_probe()来完成绑定。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP