文档章节

linux2.4下DMA的使用

慎思
 慎思
发布于 2012/09/18 09:18
字数 1013
阅读 264
收藏 1

这两天看了以下linux下DMA的使用方法,这里与大家分享。

      本文以linux2.4,硬件s2410为平台。关于DMA具体操作编程在内核源码目录下 /kernel/arch/arm/mach-s2410/dma.c.

这里并不打算讲解dma具体的实现方法,主要想告诉大家如何学会在自己的程序中使用DMA这个功能。

     使用DMA功能主要涉及以下几个步骤:

     1,申请DMA资源

        int s2410_request_dma(const char *device_id, dmach_t channel,dma_callback_t write_cb, dma_callback_t read_cb)

       功能:这个函数的主要就是申请一个空闲的DMA通道,

参数:device_id 哪个硬件需要使用DMA功能,这是一个字符串,具体定义在/kernel/arch/arm/mach-s3c2410/dma.h中,里面有个数组包含了所有的可以使用DMA的硬件模块,此处参数,只需要填充下面数组的红色字符串即可,这么没有全部列出,如果用到自己去查。

static dma_type_t dma_types[4][5] = {

{

       { "XDREQ0", XDREQ0_WR_SRC, XDREQ0_WR_DST, XDREQ0_WR_CTL, \

                  XDREQ0_WR_SRC_CTL, XDREQ0_WR_DST_CTL, \

                  XDREQ0_RD_SRC, XDREQ0_RD_DST, XDREQ0_RD_CTL, \

                  XDREQ0_RD_SRC_CTL, XDREQ0_RD_DST_CTL },

       { "UART0", UART0_WR_SRC, UART0_WR_DST, UART0_WR_CTL, \

                  UART0_WR_SRC_CTL, UART0_WR_DST_CTL, \

                  UART0_RD_SRC, UART0_RD_DST, UART0_RD_CTL, \

                  UART0_RD_SRC_CTL, UART0_RD_DST_CTL },

     。。。。。。。。。。。

}

channel:要申请的DMA的通道

write_cb:一般在DMA一次操作完成后需要调用一个函数完成一些善后工作,这个参数是个回调参数指针,当DMA完成一次写操作后后调用这个函数。这个函数的定义形式为

static void dmaout_done_callback(void *buf_id, int size)   

read_cb:与上一个参数类似,只是这个函数在DMA完成一次读操作后调用。函数定义形式为static void dmain_done_callback(void *buf_id, int size)

2,DMA队列填充,linux对DMA使用一个队列进行管理,我们在申请了DMA通道以后接下来的工作就是向DMA缓冲区中填充数据,DMA传输数据问题交由linux来处理,使用函数:

int s2410_dma_queue_buffer(dmach_t channel, void *buf_id, dma_addr_t data, int size, int write)

功能:将需要由DMA传输的缓冲区添加到DMA队列中

参数:channel : 刚刚申请到的DMA通道

      buf_id: 私有数据结构,可以存放任何数据,dmain_done_callback(void *buf_id, int size)中的参数buf_id,两者是同一个东西。(这是真滴J)

     data:缓冲区首地址

       size:   缓冲区的大小

write:0 控制DMA是读取操作

      1 控制DMA是写入操作

3, DMA缓冲区的申请。如果大家使用上面的函数一定不会操作成功的o(∩_∩)o。那是因为最重要的俺还没告诉你呢! 原来DMA的传输需要物理地址才行,而我们用通常方法得到的缓冲区都是虚拟地址,为了得到物理地址的缓冲区,我们需要使用下面这个函数;

void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle)

功能:申请一块内存空间

参数:gpf:内存分配参数,

      size:需要分配的大小

      dma_handle:如果分配成功存放,分配空间的物理地址的首地址,没错这个地址才能放到DMA队列中

返回值:返回申请到空间的逻辑地址的首地址

4,使用上面的几个函数就可以完成DMA的传输了(*^__^*) 。天下没有不散的宴席,有合必有分,所以总是要有离别的时候的,当你使用完了DMA简单的说声byebye就可以了,比起什么什么来够简单吧

void s2410_free_dma(dmach_t channel)

功能:释放DMA通道

参数:要释放的DMA通道

void consistent_free(void *vaddr, size_t size, dma_addr_t handle)

功能:释放申请的DMA缓冲区

参数:vaddr 虚拟地址

      size 缓冲区大小

      handle 物理地址

这样就就可以完美操作DMA了,下面使用一个从IIS驱动中拿出来的例子,实际演示一下

1, s2410_request_dma("I2SSDO", 2, audio_dmaout_done_callback, NULL);

2, dmabuf = consistent_alloc(GFP_KERNEL|GFP_DMA, dmasize, &dmaphys);                                                                                       // 申请DMA缓冲区

3, s2410_dma_queue_buffer(s->dma_ch, (void *) b, dmaphys , b->size, DMA_BUF_WR);

4, s2410_free_dma(2);

5, consistent_free(dmabuf, dmasize, dmaphys);}

基本上使用DMA就是这个过程了,byebye喽

本文转载自:

慎思
粉丝 28
博文 112
码字总数 5948
作品 0
深圳
程序员
私信 提问
磁盘及网络IO工作方式解析

PIO与DMA 有必要简单地说说慢速I/O设备和内存之间的数据传输方式。 PIO 我们拿磁盘来说,很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如果我们读取磁盘文件到内存中,数据要...

go4it
2016/12/04
10
0
Linux之DMA API -- 通用设备的动态DMA映射

通用设备的动态DMA映射 by JHJ(jianghuijun211@gmail.com) 本文描述DMA API。更详细的介绍请参看Documentation/DMA-API-HOWTO.txt。 API分为两部分,第一部分描述API,第二部分描述可以支持非...

DB_Terrill
2012/11/14
0
0
全志H3_dma接口使用说明书

2. Dmaengine 框架 2.1.基本概述 Dmaengine 是 linux 内核 dma 驱动框架,针对 DMA 驱动的混乱局面内核社区提出了一个全新的框架驱动,目标在统一 dma API 让各个模块使用 DMA 时不用关心硬件...

牛牛00
05/28
0
0
SylixOS DMA子系统之一

1. DMA子系统简介 1.1 DMA简介。 DMA的英文拼写是“DirectMemory Access”,是一种数据不经过CPU处理,直接由DMA控制器从一块物理内存搬运到另一块物理内存的数据交换模式。在DMA模式下,CPU...

Best_CC
2017/06/21
0
0
如何在Linux下用DMA方式传输数据

如何在Linux下用DMA方式传输数据 作者:兄弟连 我们都知道,使用DMA方式传输数据可以占用更少的CPU资源,因此与其它操作系统一样,Linux支持硬盘以DMA方式转输数据,但在安装Red Hat7.0时关于...

疯狂的小黑
2016/11/10
5
0

没有更多内容

加载失败,请刷新页面

加载更多

idea下springboot 项目在static目录下添加文件不生效

idea下springboot 项目在static目录下添加文件不生效 问题描述 是这样子的,我的项目目录结构如下: 我在static目录下,创建了index.html和aaaa.jpg这两个文件。然后,启动服务访问 http://l...

wotrd
昨天
4
0
k8s1.14 一、环境

1. 4台虚拟机 (CentOS Linux release 7.2.1511 (Core) ) 192.168.130.211 master 192.168.130.212 node1 192.168.130.213 node2 192.168.130.214 node3 2. 设置服务器hostname 2.1 设置本机......

ThomasCheng
昨天
3
0
盖茨:如果我现在开创一家公司 将会专注于AI

新浪科技讯,北京时间 6 月 26 日凌晨消息,微软联合创始人比尔·盖茨(Bill Gates)在周一接受采访时表示,如果他今天从哈佛大学辍学并开创一家新公司,那么这家公司将会专注于人工智能(A...

linuxCool
昨天
1
0
聊聊feign的Retryer

序 本文主要研究一下feign的Retryer Retryer feign-core-10.2.3-sources.jar!/feign/Retryer.java public interface Retryer extends Cloneable { /** * if retry is permitted, retur......

go4it
昨天
9
0
HyperLogLog简介

  (1)HyperLogLog简介      在Redis 在 2.8.9 版本才添加了 HyperLogLog,HyperLogLog算法是用于基数统计的算法,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个...

SEOwhywhy
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部