PCI映射内存读写求助

发布于 2022-09-22 13:35:02 字数 575 浏览 13 评论 0

自己做的板子,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

分开我的手 2022-09-29 13:35:02

原帖由 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访问是有限制的。

情归归情 2022-09-29 13:35:02

应该没有限制。

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

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

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

动听の歌 2022-09-29 13:35:02

我有几个疑问:
DSPP在里面起什么作用?他应该和内核没有关系,怎么能影响io映射呢?

兔小萌 2022-09-29 13:35:02

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来完成的。不知道对不对。

耳钉梦 2022-09-29 13:35:02

原帖由 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这个,我现在不是特别清楚。

放血 2022-09-29 13:35:02

谢谢版主,你这么解释内存的话,我现在的问题就集中在从哪里获取Current PCI address了。

時窥 2022-09-29 13:35:02

原帖由 illeggy 于 2008-11-7 16:13 发表
谢谢版主,你这么解释内存的话,我现在的问题就集中在从哪里获取Current PCI address了。

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

一城柳絮吹成雪 2022-09-29 13:35:02

问题解决了。

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

海螺姑娘 2022-09-29 13:35:02

原帖由 illeggy 于 2008-11-7 18:47 发表
问题解决了。

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文