xiao_caoo
驱动牛犊
驱动牛犊
  • 注册日期2005-03-21
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望294点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
阅读:2459回复:3

物理地址与逻辑地址,虚拟地址的转换关系?????

楼主#
更多 发布于:2009-07-31 17:20
最近在做一个项目,用到ALTERA的FPGA,内部实现PCI接口与主控DMA处理器,和1K双端口RAM功能,且卡内部实现了DMA从内存中到双端口RAM中的硬件实现.

ALTERA中采用5个寄存器来控制数据搬运如下:
          A.状态 B读地址 C写地址 D搬运长度 E控制

问题?

1采用公用缓冲区模式,将在STARTDEVICE中加入IOGETDMAAP.....得到DMA控制器.再用IOALLOCATECOMMONBUFFER来得到虚拟地址和物理地址.
2通过IOALLOCATECOMMONBUFFER中的虚拟地址来写连续数据0,1,2,3,.....19.
3通过WRITE_REGISTER_BUFFER_ULONG中写到双端口RAM中为数据,F,F,F.....F(20个)
4在实际的DMA操作时进行以下操作:
              A写读地址寄存器,内容为IOALLOCATECOMMONBUFFER中返回的PHYSICAL_ADDRESS的LOWPART值.
             B写写地址,内部卡固定为0X00
             C写长度,20*4个长整形
      D写状态为0
            E写控制进行搬运

结果:数据搬运个数正确,写地址正确,长度正确,就只有数据错误,不知道什么原因.

个人看法:
是不是通过IOALLOCATECOMMONBUFFER中得到的物理地址不是卡中DMA所需要的物理地址,因为相关文档中说明是逻辑地址,而又没有相关函数来转换,

这个问题困扰了很久了,请各位大侠给个看法,给个意见,
xiao_caoo
驱动牛犊
驱动牛犊
  • 注册日期2005-03-21
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望294点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-07-31 17:25
或是驱动中是否存在问题.?
allocatecommonbuffer中返回的物理地址,,且DDK中说明此为锁定内存,且不需要通过MAPTRANFER来锁定.但试过好象仍不行.
xiao_caoo
驱动牛犊
驱动牛犊
  • 注册日期2005-03-21
  • 最后登录2011-03-27
  • 粉丝0
  • 关注0
  • 积分71分
  • 威望294点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-13 22:27
问题解决
harktrip
驱动小牛
驱动小牛
  • 注册日期2003-11-30
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望457点
  • 贡献值0点
  • 好评度170点
  • 原创分0分
  • 专家分2分
地板#
发布于:2009-09-14 11:36
怎麼解決的也不提,很垃圾
游客

返回顶部