驱动牛犊
|
阅读:1700回复:4
对武安河书上DMA的例子,自己改了一下可以用了,大家看看!
(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,效果会更好些。 我也是菜手一个,请大虾们指教!! |
沙发#
发布于:2007-06-07 23:51
大哥,现在已经是高手了啊!!
|
|
板凳#
发布于:2007-06-07 23:56
不错,顶一下!!
谢谢分享啊 多只可以传几k。具体数目我再做一下实验 用啥测试的啊??? |
|
地板#
发布于:2007-06-12 09:07
请问楼主,对你的谈到的(2),我没有加入你说的那两个语句,为什么也可以实现传输?
其次,请问,我尝试了武安河树上写的那两种方式(用应用程序缓冲区,和系统缓冲区),在应用程序里用readfile函数,都实现了功能,所以我很不清楚,驱动是如何将读到的数据传递给应用程序缓冲区的,能给解释一下么?谢谢! |
|
地下室#
发布于:2007-07-09 16:02
问题同楼上一样,驱动程序是怎样把COMMON BUFFER里的数据传到应用程序里的。我感觉这批数据的搬移效率不是很高。如果能够避开驱动自己完成,手动通过内存拷贝函数来拷贝的话是不是效率会更高一点。希望楼主能够帮助一下。先谢谢
|
|