linux的dma驱动

来源:互联网 发布:广联达造价软件价格 编辑:程序博客网 时间:2024/06/05 07:48

硬件平台:TI的3530

内核:linux-2.6.36

功能:将fpga的数据从内存的一个地方复制到内存另一个地方

初学dma感到很是吃力,编写的内核驱动代码仔细看了一个星期,才将dma的工作原理和程序流程给看明白

工作原理:通过软件配置dma控制器的寄存器,让dma自己讲数据从外部读入到内存中,使得linux系统可以直接访问,而在这数据传送的期间,cpu不参与数据的传输,这也大大提高了cpu的利用率,使得系统的运行性能大大提高(这种方式通常适用于大数据量的传输,dma也正是为他而存在)。在每次dma将数据传送完成之后,就会向cpu发送一个中断信号,cpu响应中断,并执行我们传入的回调函数(中断函数),实际上dma每次进行传输时都要经过2次的传输:source -> dma->dest,每次传完,都会发送一个中断给cpu,同样的cpu也会进入中断处理中断函数(也就是我们传入的回调函数)。

                                                                                                                                               -----------------> 配置dma到dest(目的)dma控制器  -> dma到dest的中断处理函数

                                                                                                                                               |

程序流程:开始 -> 初始化dma控制器 -> 配置读取fpga到dma的控制器 -> fpga到dma开始传输数据 -> fpga到dma的中断处理函数 ---

                                                                                                    ^                                                                                                                                  |

                                                                                                    |                                                                                                                                   |

                                                                                                    ----------------------------------------------------------------------------------------------------

如此便可循环的读取fpga的数据到内存中,供系统去处理这些数据。


注意:配置的寄存器,主要是源地址寄存器,目的地址寄存器 ,这两个寄存器由于是物理地址,所以不能直接被内核空间和用户空间去访问,我们一般都是通过ioremap和mmap映射物理地址分别到内核虚拟地址和用户空间的虚拟地址。而内核空间提供给用户空间的接口也是通过这个函数实现的。

另外还有需要配置控制器的控制寄存器,会涉及到dma的传输模式和传输通道

0 0
原创粉丝点击