wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:1585回复:7

有关于DMA(50分)

楼主#
更多 发布于:2003-08-24 21:46
我在用CY7C09449作DMA,
   m_Dma.Initialize(&dd, m_Lower.TopOfStack());
   m_Buffer.Initialize(&m_Dma,2048);
   //获得DMA的公用缓冲区的物理地址和线性地址

DmaBufferLinAddress=m_Buffer.VirtualAddress(); //线性地址
DmaBufferPhyAddress = m_Buffer.LogicalAddress().LowPart; //物理地址

我通过这个方法获得公用缓冲区的物理地址和线性地址,其中DmaBufferPhyAddress我用在DMA控制器中,作为目的地址,
我用deviceIoControl将DmaBufferLinAddress传到应用程序,作为应用程序操作地址,进行存盘操作,
高手们帮我看看,这样获得物理地址和虚拟地址,能正常工作吗?
一定给分!!!

最新喜欢:

flyingflying
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-08-25 10:53
物理地址可以用;线性地址(虚拟地址)应该不能用,因为驱动中的内核虚拟地址和应用程序中的用户虚拟地址不在一个上下文中。
有了驱动,人才有了力量。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-08-25 12:14
我在用CY7C09449作DMA,
   m_Dma.Initialize(&dd, m_Lower.TopOfStack());
   m_Buffer.Initialize(&m_Dma,2048);
   //获得DMA的公用缓冲区的物理地址和线性地址

DmaBufferLinAddress=m_Buffer.VirtualAddress(); //线性地址
DmaBufferPhyAddress = m_Buffer.LogicalAddress().LowPart; //物理地址

我通过这个方法获得公用缓冲区的物理地址和线性地址,其中DmaBufferPhyAddress我用在DMA控制器中,作为目的地址,
我用deviceIoControl将DmaBufferLinAddress传到应用程序,作为应用程序操作地址,进行存盘操作,
高手们帮我看看,这样获得物理地址和虚拟地址,能正常工作吗?
一定给分!!!

应该可以,但是你需要将VirtualAddress传递到上层应用程序
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-08-25 12:15
也就是在特定的线程上下文中使用
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-08-25 14:47
我将虚拟地址传到应用程序了,并且在驱动程序的中断中启动dma传输,然后通知应用程序将虚拟地址指向的地址中的数据存盘,得到的却和我传输的数据不一样,我还是觉得我不能直接对虚拟地址直接操作,有作过的吗?给我一个程序我看看,好吗?
xtli_21
驱动牛犊
驱动牛犊
  • 注册日期2003-07-24
  • 最后登录2005-12-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-08-28 16:30
可以这样用:
先根据获取的系统虚拟地址创建一个MDL
1.pMdl =IOAllocateMdl( DmaBufferLinAddress,..............);
2.MmBuildMdlForNonPagedPool( pMdl );
3.pToUser = MmMapLockedPages( pMdl,UserMode );
3.I.Information()=  (unsigned int )pToUser;
4.释放pMdl;
其余的的自己做吧,记着给分
wangjisheng
驱动小牛
驱动小牛
  • 注册日期2002-11-06
  • 最后登录2011-07-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望20点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-08-28 18:52
问题似乎解决了,可以将获得的物理地址在转换成虚拟地址传给应用程序,就可以了,多谢大家,
zytzjx
驱动牛犊
驱动牛犊
  • 注册日期2001-12-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望41点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-11-12 16:23
CY7C09449这个你为什么要用DS做呢,你买这个芯片的时候,他提供一个DDK的驱动,自己只要改一下就可以用的,他是用例子的。改好的驱动可以给我看一下吗,我在学习用DS写驱动。
Wecan
游客

返回顶部