免费注册 查看新帖 |

Chinaunix

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

开发PCI驱动碰到的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-10 13:18 |只看该作者 |倒序浏览
最近,开发PCI的驱动,碰到问题

1。unsigned long pci_resource_start(struct pci_dev *dev, int bar),返回六个i/o区域中的一个,这个返回的应该是总线地址?也就是还需要ioremap映射为虚拟地址。

现在的问题是:既然驱动中有了上面的机制,为什么还有DMA机制?pci_map_single(tp->pdev, skb->data, len, PCI_DMA_TODEVICE); 其中的缓冲与上面得到的虚拟地址没有关系啊?

2。request_region(unsigned int from, unsigned int extent,const char *name);参数from和extent事怎么得到的?

谢谢!

[ 本帖最后由 wchtalk 于 2006-10-10 13:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-10-11 09:28 |只看该作者

回复 1楼 wchtalk 的帖子

1.首先,每个PCI设备都有一个配置空间,每个配置空间中有6对基址寄存器,每对对应PCI设备的一个寄存器或者内存空间(注意,不是cpu的内存空间),CPU据此对PCI设备进行控制。建议,看一下PCI2.2规范吧。
  其次, pci_map_single的那段内存是PCI设备和CPU之间的共享内存,换句话说,PCI网卡收到数据后会通过PCI总线使用PCI Wtite命令将其写到共享内存中(相当于DMA)。
2./proc/ioports中找个没用的

论坛徽章:
0
3 [报告]
发表于 2006-10-11 11:05 |只看该作者

回复 2楼 zu_xf 的帖子

谢谢zu_xf 回复和建议,我找规范看看

这么说来寄存器的空间和DMA的空间是两个不同的空间了,并且可以通过寄存器空间对DMA空间进行控制了,这么理解对吧?

论坛徽章:
0
4 [报告]
发表于 2006-10-11 13:11 |只看该作者

回复 3楼 wchtalk 的帖子

PCI设备的寄存器空间和内存空间当然位于PCI设备上;而共享内存(DMA空间)是驱动初始化时开辟出来并通过相应的PCI寄存器配置通知PCI设备的,位于系统内存中。

论坛徽章:
0
5 [报告]
发表于 2006-10-12 08:49 |只看该作者

回复 4楼 zu_xf 的帖子

你好,zu_xf ,还问些初级问题:)

1。内核在启动时候,初始化了各个PCI设备,可是,我怎么通过程序访问这些设备呢?也就是给用户的接口在哪里?

2。pci_register_driver(&pci_driver);时候,这个结构pci_driver
static struct pci_driver tg3_driver = {
.name = DRV_MODULE_NAME,
.id_table = tg3_pci_tbl, //此驱动所支持的网卡系列,vendor_id, device_id
.probe =
};
这个name字段是系统初始化pci就有的?还是随便定义的?

我现在就是搞不清楚,系统初始化PCI以后,到底程序怎么找到这个设备并且使用?

论坛徽章:
0
6 [报告]
发表于 2006-10-12 10:20 |只看该作者

回复 5楼 wchtalk 的帖子

1.  方法很多。比若说直接调用pci_for_each_dev搜索pci_devices链表,或者使用pci_find_device(VenId, DevId,...)/pci_find_class/pci_find_slot搜索指定设备(用法参见linux设备驱动程序一书).
    最简单的就是通过pci_module_init或者你提到的接口(具体用法参见e100驱动).
2.name字段是随便给的

   组成pci_devices链表的pci_dev结构中有pci_driver结构指针,pci_register_driver等注册接口回使用该指针调用probe函数完成设备初始化任务,从而启用设备。

   具体的还是看代码吧。

论坛徽章:
0
7 [报告]
发表于 2006-10-12 11:46 |只看该作者

回复 6楼 zu_xf 的帖子

谢谢zu_xf 大虾的回复,明白了不少,一直在看情景分析,结合代码,呵呵。

我使用pci_module_init(&pci_driver),提示:No such device,我想一定是系统遍历PCI设备链表的时候没有找到pci_driver指定的设备。系统一定是根据这个结构里的.id_table字段查找是否有对应的设备,对吧?

另外,对PCI的六个寄存器作地址映射不是很明白,咋就必须是六个呢?如果I/O和设备MEM多了,是不是有问题?

论坛徽章:
0
8 [报告]
发表于 2006-10-12 13:44 |只看该作者

回复 7楼 wchtalk 的帖子

1.系统是根据id_table查的.
2.6对基址寄存器的那几个被使用是由设备决定的.通常情况下,也就1个寄存器空间,或者还有1个内存空间,够用了.

论坛徽章:
0
9 [报告]
发表于 2006-10-12 15:08 |只看该作者

还得问zu_xf个问题?:)

(1)想在Xscale CPU使用Mota visa Linux做驱动,和在一般X86和普通核德系统上有啥区别?
(2)我想对桥进行控制,和一般设备差异在哪里?
谢谢

论坛徽章:
0
10 [报告]
发表于 2006-10-12 18:13 |只看该作者

回复 9楼 wchtalk 的帖子

1.没做过,应该没有太大区别,呵呵.
2.系统启动时回调用pci_init进行相关的初始化,在该过程中,PCI桥也会被初始化.不过,用户需要提供PCI控制器链表头的初始化函数; PCI桥和PCI设备扫描和分配IO资源等工作,系统会使用自己的PCI驱动帮你搞定的.
  实际上,你不用做太多工作的.我用的PPC处理器自带PCI桥,也就是仅仅仅仅提供一个初始化函数,分配和初始化链表头,包括设置IO空间为0x40000000和内存空间为0x50000000就行了.当然,你同样可以在该函数中添加其他初始化步骤的.

[ 本帖最后由 zu_xf 于 2006-10-12 18:15 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP