zhangwei_351286
驱动牛犊
驱动牛犊
  • 注册日期2006-10-08
  • 最后登录2008-01-22
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:1700回复:4

对武安河书上DMA的例子,自己改了一下可以用了,大家看看!

楼主#
更多 发布于:2007-04-12 23:54
  (1)StartDMA()中根据自己的硬件要求如果是FIFO缓存,可以直接写DMAMODE0 0x20c00,是RAM的话改成0x20441,让local地址自加,我的local bus 是16位的。
(2)SerialRead()
status=m_CurrentTransfer->Initiate(this,&m_Dma,I.Mdl(),
        (I.IoctlCode()==IRP_MJ_READ)?  FromDeviceToMemory:FromMemoryToDevice,
        LinkTo(OnDmaReady),
        &m_Buffer
        );
如果用系统缓冲区的话,在ONDMAready中,如果判断传输完毕,应该加以下语句,才能将数据读到应用
程序缓冲区,    
     PUSHORT SystemAddress = (PUSHORT)KMemory(I.Mdl()).MapToSystemSpace();  
       RtlCopyMemory(SystemAddress,m_Buffer.VirtualAddress(),I.ReadSize(CURRENT));
否则的话,读取的数据全是0xcd,我弄了好久才发现这个问题。
    当然,如果是直接把用户缓冲区作为数据区通过MDL方式锁定物理页来和硬件直接进行数据传输的话,也是可行的,毕竟非分页内存资源宝贵(呵呵,16k不算什么,最多好像64M)但是按照武安河的例子,最多只可以传几k。具体数目我再做一下实验,及时告诉大家。
   以前用DDK开发板卡涉及到的细节特别多,出错也特别多,但是收获最大。DS比较直观,而且封装的函数
比较好用,但是掩盖了好多东西,调试的时候还得想者DDK是怎样实现的。我这几个月的经验学习驱动的经验就是 最好从DDK学起,开发虚拟设备,再使用DS,效果会更好些。  我也是菜手一个,请大虾们指教!!
qiuxin_88
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2013-02-18
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望52点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-06-07 23:51
大哥,现在已经是高手了啊!!
qiuxin_88
驱动牛犊
驱动牛犊
  • 注册日期2006-11-20
  • 最后登录2013-02-18
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望52点
  • 贡献值0点
  • 好评度18点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-06-07 23:56
不错,顶一下!!
谢谢分享啊

多只可以传几k。具体数目我再做一下实验

用啥测试的啊???
crazyjaboy
驱动牛犊
驱动牛犊
  • 注册日期2007-03-15
  • 最后登录2010-12-31
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-06-12 09:07
请问楼主,对你的谈到的(2),我没有加入你说的那两个语句,为什么也可以实现传输?

其次,请问,我尝试了武安河树上写的那两种方式(用应用程序缓冲区,和系统缓冲区),在应用程序里用readfile函数,都实现了功能,所以我很不清楚,驱动是如何将读到的数据传递给应用程序缓冲区的,能给解释一下么?谢谢!
bouy2006fly
驱动牛犊
驱动牛犊
  • 注册日期2007-04-06
  • 最后登录2009-07-02
  • 粉丝0
  • 关注0
  • 积分242分
  • 威望45点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-09 16:02
问题同楼上一样,驱动程序是怎样把COMMON BUFFER里的数据传到应用程序里的。我感觉这批数据的搬移效率不是很高。如果能够避开驱动自己完成,手动通过内存拷贝函数来拷贝的话是不是效率会更高一点。希望楼主能够帮助一下。先谢谢
游客

返回顶部