[ARM开发] 有关片上内存和DMA

vlah   2017-8-4 17:42 楼主
如果不考虑热启动的话,0xffff0000处的64KB内存能否用来DMA存数据。如果用的话,有什么需要注意的么?linux系统下用mmap操作好么?
谢谢。

回复评论 (6)

linux系统下你直接操作绝对地址吗?
training
点赞  2017-8-4 18:58
引用: 白丁 发表于 2017-8-4 18:58
linux系统下你直接操作绝对地址吗?

ioremap或mmap我知道

请问2个固定的物理地址之间DMA数据传输用什么方法比较好?
我想把将768M后的DDR物理内存留下不让linux系统用,作为fpga写数据的缓冲区,因为fpga写间隔比较小,只有二十几微秒,希望能把数据通过网络再传走。可是现在每秒fpga写入总时间大约0.688s,留给linux单独占用768M后DDR内存时间比较少。我想通过DMA把数据搬移到0xffff0000的片上内存,用网络发走,避免读写冲突。

不知道是否可行。还是我直接研究pl330的驱动去,自己实现这个功能?
谢谢
点赞  2017-8-6 17:27
引用: 白丁 发表于 2017-8-4 18:58
linux系统下你直接操作绝对地址吗?

没有SMMU,DMA能用虚拟地址操作吗?必须只能物理地址啊,你就算申请到内存拿到虚拟地址了,也得转成物理地址给DMA控制
点赞  2017-8-12 21:31
引用: lelee007 发表于 2017-8-12 21:31
没有SMMU,DMA能用虚拟地址操作吗?必须只能物理地址啊,你就算申请到内存拿到虚拟地址了,也得转成物理 ...

其实我的情况是这样的
fpga每秒写数据到arm内存0x30000000物理地址,长度16M。再写另一部份数据到0x3C000000物理地址,长度大约也是16M。linux把物理地址通过mmap转换为虚拟地址,通过乒乓方式发送tcp包。
但现在发现每秒的fpga不是连续全速写入数据,而是间隔20多微秒写1000多字节。造成linux独占时间不够。
所以我想用片上内存转送,每次fpga写满64KB就用DMA,避免网络读和fpga写有内存冲突。
但是发现0x30000000转为虚拟地址,再从虚拟地址转总线地址后,总线地址只是虚拟地址的一个偏移。
总线地址不是应该和物理地址有关么?好奇怪。
而且不知道0xffff0000的片上内存的总线地址是多少?它的IOMEM对DMA有什么影响么?

我问mmap和ioremap,因为我收到的数据和发送都是在固定的物理地址,我想知道能否跳过将0x30000000转换虚拟地址这一步,提高速度。

谢谢
点赞  2017-8-14 15:26
引用: 白丁 发表于 2017-8-4 18:58
linux系统下你直接操作绝对地址吗?

嗯,已经避免使用片上内存了
DMA的问题也差不多了
感谢回复的2位网友
点赞  2017-11-10 11:29
引用: lelee007 发表于 2017-8-12 21:31
没有SMMU,DMA能用虚拟地址操作吗?必须只能物理地址啊,你就算申请到内存拿到虚拟地址了,也得转成物理 ...

嗯,已经避免使用片上内存了
DMA的问题也差不多了
感谢回复的2位网友
点赞  2017-11-10 11:29
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复