利用WinDriver实现链式DMA

时间:2013-07-13来源:网络

按照上面的策略,一次DMA传输至少可以处理含有(2032-16)/16=126个描述符的描述符表,至少可以传输124*4 KB=496 KB大小的数据。如果DAM传输的数据很多时,可以分成多次DMA传输,这样仍可使每次DMA传输时,描述表的数据占用一个物理页。
上面的策略,也可应用于DMA数据存储区的设置。例如在我们进行的加密卡设计中,使用DMA写模块完成加密结果的输出。对于公钥算法,其加密结果的长度往往是固定的,比如,对2 048位的RSA签名运算,其签名结果长度为256字节。此时采用上面的策略,我们就可以通过一次DMA传输读到签名结果,这样就简化了底层设备对输出接口的设计。
在设置完DMA控制寄存器后,设备开始进行MDA描述符检索,然后开始进行数据传输,主机需要知道什么时候数据传输结束,以便进行其他处理或读取传输结果。有两种处理方式:中断方式和查询方式。由于Windows XP操作系统不支持消息中断请求(MSI),故采用查询的方式处理。这就需要设置描述符的控制域和DMA控制寄存器的控制域部分,以使设备更新描述符表的EPLAST域。需要指出的是:在设备DMA处理模块的实现中,描述表的描述符头中,最后一个双字的低16位是EPLAST域的实际值,即最后完成的描述符的索引号,而高16位是其他的信息。因此可以用下面的DMAWaitForCompletion函数进行查询处理。
b.JPG
c.JPG
在上面的函数中hDev为设备句柄;DT_HEAD_EPLAST为描述表的描述符头中,最后一个双字的地址指针;eplast_num为DMA传输的最后一个描述符的索引号,等于描述符表中描述符个数减1。函数的返回值为真,表示DMA传输正确完成。
为了使DMA缓冲区保持与CPU缓存、I/O缓存的同步,主机端应在设置DMA控制寄存器之前,对DMA传输的数据存储区和描述符表存储区调用WDC_DMASyncCpu函数,在完成DMA的传输查询之后,调用WDC_DMASyncIo函数和WDC_DMABufUnlock函数。

4 结束语
对基于Altera公司PCI Express硬核的链式DMA应用,Altera公司虽然提供了上层Demo示例程序,但其只进行了MDA传输的性能测试。文中给出了处理DMA数据传输时,主机端需要面对和解决的几个问题。通过这些处理方法和策略,保证了主机和设备之间DMA数据传输的正确性,简化了底层FPGA应用的设计,为利用DMA模块进行用户的应用逻辑设计提供了基础。

1 2 3

关键词: 链式DMA WinDriver PCI Express 端点存储器

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版