PCI映射内存读写求助
自己做的板子,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设置其余值时候,读出的数据全高。
请问我对于的读写理解是不是有问题,正确的是怎么样的呢?谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我不能确定是不是你ioremap的时候,虽然映射了4M,但实际上你得设备,这4M访问是有限制的。
应该没有限制。
DSPP register (bits 9−0) Current PCI address (bits 21−0)
sdram的物理地址是0x80000000,映射后是0xc9080000。
比如,我要读写0xc9080000这个地址,即设置DSPP为0x324,ioread32(0xc9080000)读出来全高。
请问上面的Current PCI address 是不是ioread里面的参数的低22位?
我有几个疑问:
DSPP在里面起什么作用?他应该和内核没有关系,怎么能影响io映射呢?
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来完成的。不知道对不对。
你得内核跑的那个内存是主内存,其它的要通过iomap这样的方式映射到主内存上去的,都属于io内存,访问被映射的内存,可以直接通过访问主内存的虚拟地址来实现。
至于PCI这个,我现在不是特别清楚。
谢谢版主,你这么解释内存的话,我现在的问题就集中在从哪里获取Current PCI address了。
PCI这块我不是很熟悉。io映射这块情景分析上讲得很详细,你可以看看,呵呵。
问题解决了。
Current PCI address是cpu自动从虚拟地址转换得到的。
恭喜,恭喜
建议你写个总结跟在这个帖子后面,分享一下你的经验,包括如何解决的,以及相关技术知识,这样有助于你巩固经验,又有利于他人学习借鉴,呵呵。