linux的dma驱动

原创 2016年08月29日 21:19:24

硬件平台: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的传输模式和传输通道

版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux 驱动之DMA 子系统

DMA子是CPU中实现数据传输的一种方式,CPU配置好DMA控制器之后发起数据传输,CPU本身不参与数据传输的动作中去。DMA种类: 分为外设DMA和DMA控制器。其中外设DMA实现的为特定的外设与...
  • u013625961
  • u013625961
  • 2017年04月01日 15:55
  • 1256

linux下DMA驱动

/** * dma_request_channel - try to allocate an exclusive channel * @mask: capabilities that th...
  • Destihang
  • Destihang
  • 2016年07月20日 23:05
  • 1414

Linux DMA 驱动学习总结

Linux DMA驱动构架分析       以linux2.6.32中的S3C2440驱动为例进行分析,DMA驱动所对应的源码为linux-2.6.32.2\arch \arm\mach-...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年04月15日 09:05
  • 1442

ARM-Linux驱动--DMA驱动分析(一)

硬件平台:FL2440 (s3c2440) 内核版本:2.6.35 主机平台:Ubuntu 11.04 内核版本:2.6.39 原创作品,转载请标明出处 1、DMA的功能和工作原理这里就不多说了,可以...
  • yming0221
  • yming0221
  • 2011年07月30日 00:31
  • 11986

DMA驱动程序解析

1、DMA的具体工作过程: (1)外设向DMA发出请求 (2)DMA通过HOLD向CPU发出总线请求 (3)CPU响应释放三总线,并且发应答HLDA (4)DMA向外设发DMA应答 (5)DMA发出地...
  • you_shou
  • you_shou
  • 2016年09月17日 09:11
  • 1065

Linux驱动修炼之道-DMA框架源码分析

首先介绍一下DMA,S3C2440A支持位于系统总线和外围总线之间的4通道DMA控制器,每个通道都可以在系统总线或外围总线上的设备之间传输数据。每个通道可以对下面4种情况进行传输: 1.源和目的都在...
  • dahailinan
  • dahailinan
  • 2012年02月21日 18:12
  • 5678

PCIe-块设备驱动-Single DMA

/* * kernel: 4.5.2 */ #include #include #include #include #include // needed in 4.3.3 #defi...
  • qq_21411985
  • qq_21411985
  • 2016年06月03日 13:56
  • 1217

Linux驱动开发--linux下的DMA编程

DMA编程 DMA是一种无需要CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率 DMA方式的数...
  • yusiguyuan
  • yusiguyuan
  • 2015年02月01日 20:14
  • 3309

嵌入式linux之DMA驱动

http://blog.csdn.net/jingzhesiye/article/details/8610865malloc分配的内存在虚拟地址上是连续的.1、linux内核管理内存空间的分配,所有程...
  • u013426958
  • u013426958
  • 2015年09月04日 20:48
  • 465

Linux下DMA驱动框架分析

linux下的DMA驱动框架drivers\dma\dmaengine.c文件内,在linux下编写DMA的设备驱动一般步骤如下。 申请DMA通道 struct dma_chan *dma_req...
  • automan12138
  • automan12138
  • 2017年07月16日 13:55
  • 419
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux的dma驱动
举报原因:
原因补充:

(最多只允许输入30个字)