您的位置:首页 > 运维架构 > Linux

Linux驱动开发(二)—DMA的使用(一)

2016-05-07 16:39 393 查看

1 DMA概念

DMA顾名思义就是指设备和内存之间、内存和外部存储设备之间进行直接的数据读写操作,而不需要CPU的参与。

2 DMA原理

       DMA传输需要由DMA控制器DMAC进行,当需要进行DMA传输的时候,DMA控制器会发出占用总线的请求,当CPU响应DMA的请求时,暂时放弃对总线的控制权,当DMA传输结束的时候,DMAC会向I/O接口发出结束命令,并将总线控制权交还给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。



3 DMA传输过程



4 DMA硬件控制管脚

在Linux驱动开发中,使用DMA可能要操作DMAC(DMA控制器)的几个管脚介绍如下:

1.数据总线:用于传输数据;

2.地址总线:用于选择存储器地址;

3.数据传送信号:MEMR为存储器读操作信号,MEMW为存储器写操作信号,IOR为外设读操作信号,IOW为外设写操作信号;

4.DRQ:DMA请求信号,外设向DMA控制器提出要求操作DMA操作的申请信号;

5.DACK:DMA应答信号,DMAC响应外设提出的DMA请求操作;

6.HOLD:总线请求信号,DMAC向CPU发出的临时占用总线的信号;

7.HLDA:总线响应信号,CPU向DMAC发出的允许临时让出总线控制权的信号;

5 驱动开发中DMA使用—代码编写框架

1.DMA初始化:DMA通道申请、DMA传输方向设置(MEM->MEM、MEM->DEV、DEV->MEM)、DMA数据传输设置(每次传输一个字节或者多个字节);

2.DMA源地址和目的地址设置:DMA源地址为内存的物理地址,DMA目的地址为外设的数据寄存器的物理地址;

3.DMA传输开始函数调用;

4.DMA传输结束函数调用;

 OK,这个章节就简单介绍DMA的概念,接下来的章节,将通过实际项目代码阐述驱动开发中DMA的使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息