免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-07 12:56 |只看该作者 |倒序浏览
自己做的板子,linux2.6.20,host mpc8313,pci device dm642,dm642外接64MB的SDRAM。

Base 0: 4M-byte prefetchable maps to all of DSP memory with the DSP page register (DSPP).

驱动里,我用pci_resource_start获得base0的物理地址,ioremap到虚拟地址mmio上。

在read和write函数里,我使用ioread(mmio + offset)和iowrite(mmio + offset)来读写内存。

按照我的理解,4MB的开窗范围,那么offset的范围是0—3fffff,超过这个范围的话,就要挪动窗的位置,即重新设置DSPP的值,64MB的外设内存,DSPP的范围就是0—F。

现在的情况是:
1、offset的范围是0— 47ffff 的时候,都可以正常读写。
2、DSPP为0时,可以正常读写。DSPP设置其余值时候,读出的数据全高。

请问我对于的读写理解是不是有问题,正确的是怎么样的呢?谢谢。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-11-07 14:27 |只看该作者
原帖由 illeggy 于 2008-11-7 12:56 发表
自己做的板子,linux2.6.20,host mpc8313,pci device dm642,dm642外接64MB的SDRAM。

Base 0: 4M-byte prefetchable maps to all of DSP memory with the DSP page register (DSPP).

驱动里,我用pci_r ...


我不能确定是不是你ioremap的时候,虽然映射了4M,但实际上你得设备,这4M访问是有限制的。

论坛徽章:
0
3 [报告]
发表于 2008-11-07 15:33 |只看该作者
应该没有限制。

DSPP register (bits 9−0) Current PCI address (bits 21−0)
sdram的物理地址是0x80000000,映射后是0xc9080000。

比如,我要读写0xc9080000这个地址,即设置DSPP为0x324,ioread32(0xc9080000)读出来全高。

请问上面的Current PCI address 是不是ioread里面的参数的低22位?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-11-07 15:51 |只看该作者
我有几个疑问:
DSPP在里面起什么作用?他应该和内核没有关系,怎么能影响io映射呢?

论坛徽章:
0
5 [报告]
发表于 2008-11-07 16:01 |只看该作者
DSPP设置sdram开窗的位置。我映射的内存大小只有4MB,实际的sdram有64MB,就需要DSPP。

PCI Base Slave Address = DSPP register (bits 9-0) Current PCI address (bits 21-0),这里的PCI Base Slave Address是物理地址?

DSPP bits 9-0 是根据要访问的物理地址得到的,那么我理解Current PCI address (bits 21-0)也应该是一个物理地址。

可是,ioread的参数应该是一个映射后的虚拟地址,即Current PCI address不是ioread的参数。

那么Current PCI address 是在哪里定义的呢,或者说以什么形式出现的呢?

我这样理解对么?谢谢。

ps,我对io端口、io内存这类定义理解的比较模糊,我的理解是,sdram属于io内存,所以对sdram的访问是通过ioread来完成的。不知道对不对。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2008-11-07 16:10 |只看该作者
原帖由 illeggy 于 2008-11-7 16:01 发表
DSPP设置sdram开窗的位置。我映射的内存大小只有4MB,实际的sdram有64MB,就需要DSPP。

PCI Base Slave Address = DSPP register (bits 9-0) Current PCI address (bits 21-0),这里的PCI Base Slave Addres ...



你得内核跑的那个内存是主内存,其它的要通过iomap这样的方式映射到主内存上去的,都属于io内存,访问被映射的内存,可以直接通过访问主内存的虚拟地址来实现。
至于PCI这个,我现在不是特别清楚。

论坛徽章:
0
7 [报告]
发表于 2008-11-07 16:13 |只看该作者
谢谢版主,你这么解释内存的话,我现在的问题就集中在从哪里获取Current PCI address了。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2008-11-07 16:31 |只看该作者
原帖由 illeggy 于 2008-11-7 16:13 发表
谢谢版主,你这么解释内存的话,我现在的问题就集中在从哪里获取Current PCI address了。


PCI这块我不是很熟悉。io映射这块情景分析上讲得很详细,你可以看看,呵呵。

论坛徽章:
0
9 [报告]
发表于 2008-11-07 18:47 |只看该作者
问题解决了。

Current PCI address是cpu自动从虚拟地址转换得到的。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2008-11-07 21:26 |只看该作者
原帖由 illeggy 于 2008-11-7 18:47 发表
问题解决了。

Current PCI address是cpu自动从虚拟地址转换得到的。



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP