阅读:1602回复:7
有关于DMA(50分)
我在用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传到应用程序,作为应用程序操作地址,进行存盘操作, 高手们帮我看看,这样获得物理地址和虚拟地址,能正常工作吗? 一定给分!!! |
|
最新喜欢:flying |
沙发#
发布于:2003-08-25 10:53
物理地址可以用;线性地址(虚拟地址)应该不能用,因为驱动中的内核虚拟地址和应用程序中的用户虚拟地址不在一个上下文中。
|
|
|
板凳#
发布于:2003-08-25 12:14
我在用CY7C09449作DMA, 应该可以,但是你需要将VirtualAddress传递到上层应用程序 |
|
|
地板#
发布于:2003-08-25 12:15
也就是在特定的线程上下文中使用
|
|
|
地下室#
发布于:2003-08-25 14:47
我将虚拟地址传到应用程序了,并且在驱动程序的中断中启动dma传输,然后通知应用程序将虚拟地址指向的地址中的数据存盘,得到的却和我传输的数据不一样,我还是觉得我不能直接对虚拟地址直接操作,有作过的吗?给我一个程序我看看,好吗?
|
|
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; 其余的的自己做吧,记着给分 |
|
6楼#
发布于:2003-08-28 18:52
问题似乎解决了,可以将获得的物理地址在转换成虚拟地址传给应用程序,就可以了,多谢大家,
|
|
7楼#
发布于:2003-11-12 16:23
CY7C09449这个你为什么要用DS做呢,你买这个芯片的时候,他提供一个DDK的驱动,自己只要改一下就可以用的,他是用例子的。改好的驱动可以给我看一下吗,我在学习用DS写驱动。
|
|
|