免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: illeggy
打印 上一主题 下一主题

PCI映射内存读写求助 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-11-13 14:38 |只看该作者
原帖由 dreamice 于 2008-11-7 21:26 发表



恭喜,恭喜
建议你写个总结跟在这个帖子后面,分享一下你的经验,包括如何解决的,以及相关技术知识,这样有助于你巩固经验,又有利于他人学习借鉴,呵呵。


我这段时间忙完之后就写。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
12 [报告]
发表于 2008-11-13 15:33 |只看该作者
原帖由 illeggy 于 2008-11-13 14:38 发表


我这段时间忙完之后就写。


期待illeggy兄大大作

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

回复 #1 illeggy 的帖子

物理映射地址的问题亚

论坛徽章:
0
14 [报告]
发表于 2008-12-11 15:30 |只看该作者
好不容易可以歇两天了,简单写了点自己的感受。

关于设备的驱动步骤等通用性的东西就不啰嗦了,我认为步骤最好的参考是内核的说明文档《Documentation/pci.txt》,实现的参考就是LDD3了。这里就说针对DM642这个PCI设备说一下其特殊性,资料来源于TI的SPRU581C。

第一,IO memory,IO port,简单的说,一个是memory,一个是port。前者先映射再通过readX、writeX(早期版本)或ioreadX、iowriteX(近期版本)访问,后者直接使用inX、outX访问,后者也可以ioport_map为memory被访问。针对不同架构的处理器,两者的处理略有不同,这里不细述了。

第二,host、agent,master、slave。这是采用DMA方式时候遇到的概念,host和agent是固定的,master和slave区分谁是数据传输的发起者。

PCI驱动最重要的就是PCI Registers的设置,对于DM642,有Configuration Registers(只能被host访问)、I/O Registers(只能被host访问)、Memory-Mapped Registers(能被host和dsp本身访问)。

1、Configuration Registers:它里面的Base Address需要特别注意,其余的一般的话都用不到。
DM642的Base Address有三种:4M-byte prefetchable、8M-byte nonprefetchable和4 words I/O。
(1)4M-byte prefetchable的作用:DM642有4GB的寻址空间,需要使用开窗的方式来完成内存映射,4M-byte prefetchable就提供窗内的映射地址信息。通过pci_resource_X系列函数得到该IO区域的信息,ioremap后就可以直接被主机访问了。
(2)8M-byte nonprefetchable,没用到。
(3)4 words I/O,它在pci_resource_X后需要ioport_map,才能被当作内存来访问。

2、I/O Registers:可以通过8M-byte nonprefetchable或4 words I/O访问,我选择了后者。它的DSPP就是完成开窗位置的寄存器。

3、Memory-Mapped Registers,master传输时候用到的寄存器。

到目前为止,主机通过PCI访问DM642内存的准备工作已经完成,接下来就是Memory Map到需要访问的地址上。
PCI Base Slave Address Generation = DSPP register (bits 9-0) + Current PCI address (bits 21-0),共32位地址。
这里需要处理的都是物理地址,问题就出在了Current PCI address这里,从哪里得到这个地址呢,没有相关的寄存器。因为CPU执行内存读写函数时候,会自动把虚拟地址转换为物理地址,那么Current PCI address就是由CPU自己来完成的。我只需要在ioreadX和iowriteX里给出Current PCI virtual address,CPU自己会转换为Current PCI address,就可以得到PCI Base Slave Address。

至此,主机读写DM642内存已经可以顺利进行。

评分

参与人数 1可用积分 +12 收起 理由
dreamice + 12 我很赞同,总结得很好!

查看全部评分

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
15 [报告]
发表于 2008-12-11 15:49 |只看该作者
总结得很好,学习了

论坛徽章:
0
16 [报告]
发表于 2008-12-11 15:50 |只看该作者
斑竹过奖了,我只是新手,第一次写驱动,还有太多东西要学习。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2008-12-11 15:53 |只看该作者

回复 #16 illeggy 的帖子

不断学习,不断总结,才能更快的进步,呵呵,一起努力
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP