linux下DMA操作方式和利弊详解

合集下载

Linux环境下DMA的研究与应用---饶兵兵

Linux环境下DMA的研究与应用---饶兵兵

摘要直接存储器访问控制器(Direct Memory Access,DMA)是计算机体系结构中的重要组成部分。

端口设备和存储器之间的数据传输往往通过DMA进行。

DMA控制数据在端口设备和存储器之间进行数据传输可以减轻中央处理器CPU的负担;在高速数据传输中,DMA可以保证数据得到及时处理,避免CPU来不及完成中断处理造成的数据丢失问题。

目前,DMA在高速数据传输、慢速设备管理、零散数据收集等方面得到了广泛应用。

本文从DMA技术的提出入手,较为详尽地讲述了DMA的结构以及DMA控制器的基本功能、基本结构及工作原理。

深入研究Intel® I/OAT(Intel® I/O Acceleration Technology) DMA 技术,结合Linux 2.6.18源代码中关于I/OAT DMA驱动详细分析其与内核的DMA 引擎的接口关系,并根据公司需求改写相应的驱动代码,给出测试用例,验证I/OAT DMA驱动的一致性和传输性能问题,生成测试报告。

关键词:DMA ;Intel® I/O Acceleration Technology;Linux DMA engineAbstractDirect Memory Access(DMA)controller is a component of the computer system.DMA usually is used to exchange data between I/O equipments and memory or between memory and memory, which alleviates the burden of CPU. During the high-speed data transmission,DMA can guarantee the data to be processed in time,thus data loss introduced by CPU’S late response of the interrupt processing can be avoided.At present,DMA is widely used in those fields of high- speed data transmission,slow-speed device management and scattered data collection.The paper begins with an introduction of DMA, and the describes in details its architecture,functions and operation. Depth study of the Intel ® I/OAT Acceleration Technology DMA technology, and combined with detailed analysis of its interface with the kernel's DMA engine on I/OAT DMA driver in the Linux 2.6.18 source code, then according to the company's needs, rewrite the driver code. At last, the test case is given to verify the consistency of the I/OAT DMA-driven and performance issues, and generate test reports.Key Words:DMA ; Intel® I/O Acceleration Technology; Linux DMA engine目录1.绪论 (1)1.1 I/O技术的讨论 (1)1.2 为何要采用DMA技术 (2)1.3 论文的大体安排 (4)2.DMA概述 (5)2.1 DMA结构分析 (5)2.1.1 单总线I/O分离的DMA结构 (5)2.1.2 单总线、I/O集成的DMA结构 (5)2.1.3 I/O总线的DMA结构 (6)2.2 DMA传输方式的分析 (6)2.3 DMA对数据操作的类型 (7)2.3.1 数据传送 (7)2.3.3数据传送与检索并举 (8)2.3.4数据校验 (8)2.4 DMA控制器 (8)2.5 DMA数据操作流程 (10)3.I/OAT DMA体系架构 (12)3.1 I/OAT技术的介绍 (12)3.2 I/OAT DMA软件接口 (13)3.2.1I/OAT DMA 介绍 (13)3.2.2I/OAT DMA链式描述符的介绍 (14)3.2.3I/OAT DMA通道的操作 (16)3.2.4I/OAT DMA 数据操作类型 (17)3.2.5I/OAT DMA 工作流程 (18)3.3 L INUX环境下I/OAT DMA驱动 (20)3.3.1 DMA engine架构 (20)3.3.2 DMA engine数据传输流程 (21)3.3.3 DMA engine与I/OAT DMA的接口 (24)4.I/OAT DMA测试 (27)4.1 测试环境的概述 (27)4.1.1测试平台 (27)4.1.2测试目的 (27)4.2 测试方法 (27)4.3 测试结果与缺陷 (30)4.4 测试结论 (31)5.结束语 (33)参考文献 (34)致谢 (35)1.绪论1.1I/O技术的讨论微处理器系统的I/O体系结构是系统对外部世界的接口。

linux dma 使用例程

linux dma 使用例程

linux dma 使用例程DMA(DirectMemoryAccess,直接内存访问)是一种计算机数据传输技术,允许数据在不经过 CPU 的情况下直接传输到设备或内存中。

这种技术可以提高系统性能和效率,减少 CPU 占用率。

2. DMA 操作流程Linux 系统中,DMA 操作可以通过以下步骤进行:(1)申请 DMA 缓冲区使用 dma_alloc_coherent 函数,可以在内核中申请 DMA 缓冲区。

(2)设置 DMA 控制器通过设置 DMA 控制器,让它知道需要传输的数据、目标地址等信息。

这个过程可以通过调用 DMA API 中的函数来完成。

(3)执行 DMA 传输通过调用 DMA API 中的函数,开始执行 DMA 传输。

(4)释放 DMA 缓冲区在 DMA 传输完成后,应该释放申请的 DMA 缓冲区。

3. DMA 使用例程以下是一个简单的 DMA 使用例程。

该例程包括申请 DMA 缓冲区、设置 DMA 控制器、执行 DMA 传输和释放 DMA 缓冲区四个步骤。

```#include <linux/dma-mapping.h>#include <linux/dmaengine.h>int dma_example(void){struct dma_chan *chan;dma_cookie_t cookie;struct dma_async_tx_descriptor *desc;dma_addr_t dma_addr;void *buf;size_t size = 1024;// 申请 DMA 缓冲区buf = dma_alloc_coherent(NULL, size, &dma_addr,GFP_KERNEL);if (!buf)return -ENOMEM;// 获取 DMA 通道chan = dma_request_chan(NULL, 'dma_example');if (!chan) {dma_free_coherent(NULL, size, buf, dma_addr);return -ENODEV;}// 准备 DMA 传输desc = dmaengine_prep_slave_single(chan, dma_addr, size, DMA_MEM_TO_DEV, 0);if (!desc) {dma_release_channel(chan);dma_free_coherent(NULL, size, buf, dma_addr);return -EIO;}// 执行 DMA 传输cookie = dmaengine_submit(desc);dma_async_issue_pending(chan);dma_sync_wait(chan, cookie);// 释放 DMA 缓冲区dmaengine_terminate_all(chan);dma_release_channel(chan);dma_free_coherent(NULL, size, buf, dma_addr);return 0;}```4. 总结以上是一个简单的 Linux DMA 使用例程。

linux 标准dma 测试指令 -回复

linux 标准dma 测试指令 -回复

linux 标准dma 测试指令-回复当今计算机系统中,DMA(直接内存访问)是一项重要的技术,它能够大幅提高数据传输的效率。

Linux作为一种主流的操作系统,自然也提供了一系列标准的DMA测试指令,用于检测和评估系统的DMA性能。

本文将一步一步地介绍这些标准的DMA测试指令,以帮助读者更好地了解和使用Linux中的DMA技术。

首先,我们需要明确一下DMA的概念和作用。

DMA是一种数据传输方式,它允许外设(如磁盘控制器、网络适配器等)直接访问主内存,而不需要通过中央处理器进行数据传输。

这样可以极大地减轻CPU的负载,提高数据传输的速度和效率。

在Linux中,DMA技术得到了广泛应用,主要体现在硬盘IO和网络通信中。

接下来,我们将介绍几个常用的Linux标准DMA测试指令。

1. hdparmhdparm是一个常用的硬盘工具,它提供了多种性能测试功能。

通过hdparm命令,我们可以测试硬盘的传输速度、缓存性能等。

在测试DMA性能时,可以用hdparm的-T选项测试硬盘缓存的读取速度,使用-h选项测试硬盘能够达到的最大传输速率。

2. dddd是一个用于数据块传输的命令行工具。

通过dd命令,我们可以测试系统的数据传输速度和TCP/IP网络的性能。

在DMA测试中,可以使用dd命令传输一个大文件或者生成一个大文件,然后通过计算传输速度来评估系统的DMA性能。

示例命令如下:dd if=/dev/zero of=testfile bs=1M count=1000 #生成一个大小为1GB的文件dd if=testfile of=/dev/null bs=1M count=1000 #从文件中读取数据并丢弃通过这两条命令,我们可以测试系统从硬盘读取数据的速度和向硬盘写入数据的速度。

3. iperfiperf是一个用于测量TCP/IP网络性能的工具。

通过iperf命令,我们可以测试网络的带宽、延迟等参数。

在DMA测试中,可以通过iperf在两台计算机之间进行数据传输来评估网络的DMA性能。

linux dma使用技巧

linux dma使用技巧

linux dma使用技巧Linux的DMA(直接内存访问)是一种高性能的数据传输技术,它允许设备直接访问系统内存,而无需CPU的干预。

这样可以提高数据传输的速度和效率,特别适用于高速设备和实时应用。

下面是一些Linux DMA使用的技巧:1. 使用DMA缓冲区:DMA传输需要有一个专门的缓冲区来存储数据。

在Linux中,可以使用kmalloc()函数来为DMA传输分配内存。

使用时需要注意大小和对齐问题,以确保DMA 传输的正确进行。

2. 设置DMA传输标志:DMA传输有不同的标志,可以用来控制传输的行为和属性。

在Linux中,可以使用DMA API中的函数和宏来设置和获取这些标志。

例如,可以使用dma_set_coherent_mask()来设置一致性掩码,以确保DMA传输的一致性。

3. 使用合适的DMA引擎:Linux内核支持多种DMA引擎,每种DMA引擎有不同的特性和性能。

选择合适的DMA引擎可以提高数据传输的效率。

可以使用DMA API中的函数和宏来选择和配置DMA引擎。

4. 处理中断和回调:DMA传输完成后,通常会触发一个中断来通知CPU。

在Linux中,可以使用中断处理程序来处理这些中断。

可以使用request_irq()函数来注册中断处理程序,并使用complete()函数来通知等待的线程。

此外,还可以使用回调函数来处理DMA传输完成后的操作。

5. 控制DMA传输的优先级:Linux内核为DMA传输提供了优先级控制的机制。

可以使用DMA API中的函数和宏来设置和获取DMA传输的优先级。

通过设置适当的优先级,可以确保关键数据的传输和处理优先完成。

6. 进行DMA内存映射:在一些情况下,可能需要将DMA缓冲区的物理地址映射到用户空间。

在Linux中,可以使用dma_map_single()函数将物理地址映射到虚拟地址。

使用完成后,可以使用dma_unmap_single()函数来取消映射。

linuxDMA接口知识点详解

linuxDMA接口知识点详解

linuxDMA接⼝知识点详解1.两种DMA映射类型1.1. ⼀致性DMA映射(Consistent DMA mappings )主要⽤于映射长时间使⽤的区域。

CPU和DMA controller不需要考虑cache的影响。

这⾥的consistent实际上是coherent的概念,不能保证consistent,也就是说需要memory barrier来保证memory order。

1.2 流式DMA映射(streaming DMA mapping)主要⽤于⼀次性DMA传输,传输完成后就会释放。

2.指定DMA设备的寻址范围include/linux/dma-mapping.h// ⽤于⼀致性内存映射的映射范围static inline int dma_set_coherent_mask(struct device *dev, u64 mask)// ⽤于流式内存映射的映射范围static inline int dma_set_mask(struct device *dev, u64 mask);3.DMA映射接⼝3.1⼀致性DMA接⼝分配较⼤DMA buffer// dev DMA控制器设备// size 要分配的DMA buffer⼤⼩// dma_handle 返回DMA buf的物理地址// flag 分配标志// 返回值 DMA buffer的虚拟地址void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)// dev DMA控制器设备// size 释放的DMA buffer⼤⼩// cpu_addr DMA buf的虚拟地址// dma_handle DMA buf的物理地址void dma_free_coherent(struct device *dev, size_t size,void *cpu_addr, dma_addr_t dma_handle)分配较⼩DMA buffer,从dma poll中申请。

linux dma 的使用流程

linux dma 的使用流程

linux dma 的使用流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。

文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor.I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Linux DMA 使用流程详解在嵌入式系统和高性能计算领域,Linux 内核中的 Direct Memory Access (DMA) 技术扮演着至关重要的角色,它允许设备直接访问内存,而无需CPU介入数据传输过程。

dma方式名词解释

dma方式名词解释

dma方式名词解释DMA(Direct Memory Access) 方式是一种计算机系统中用于实现高速数据传输的技术。

在 DMA 方式中,外部设备可以无需 CPU 干预,直接访问内存,从而实现高速数据传输。

DMA 方式通常用于处理 I/O 操作,特别是在需要大量数据传输的情况下,可以减少 CPU 的工作量,提高系统的响应速度和效率。

DMA 方式的主要特点是:1. 数据传送高速化:DMA 方式可以实现高速数据传输,通常外部设备与内存之间的数据传输速度比 CPU 内部数据传输速度快得多。

2. 减少 CPU 干预:在 DMA 方式中,CPU 通常不参与数据传输和处理,可以减少 CPU 的工作量,提高系统的效率。

3. 简化系统结构:DMA 方式可以减少系统的复杂度,简化系统的结构,提高系统的可维护性和可扩展性。

4. 支持多任务处理:DMA 方式可以支持多任务处理,使系统能够同时执行多个任务,提高系统的处理能力和效率。

在 DMA 方式中,通常采用以下三种方式来实现外部设备的高速数据传输: 1. 停止 CPU 访内存:当外部设备需要传输一批数据时,DMA 控制器会发一个停止信号给 CPU,要求 CPU 放弃对地址总线、数据总线和有关控制总线的使用权,DMA 控制器获得总线控制权后,开始进行数据传送。

这种方式可以实现高速数据传输,但 CPU 需要停止工作,效率较低。

2. 周期挪用:当外部设备需要传输一批数据时,DMA 控制器会发一个停止信号给 CPU,要求 CPU 放弃对地址总线、数据总线和有关控制总线的使用权,DMA 控制器获得总线控制权后,开始进行数据传送。

在一批数据传送完毕后,DMA控制器通知 CPU 可以使用内存,并把总线控制权交还给 CPU。

这种方式可以实现高速数据传输,但 CPU 需要停止工作,效率较低。

3. DMA 与 CPU 交替访问内存:当外部设备需要传输一批数据时,DMA 控制器会发一个停止信号给 CPU,要求 CPU 放弃对地址总线、数据总线和有关控制总线的使用权,DMA 控制器获得总线控制权后,开始进行数据传送。

dma的使用方法

dma的使用方法

dma的使用方法一、dma是什么?1.1 dma呢,就是直接存储器访问(Direct Memory Access)的简称。

这可是个相当厉害的技术,就像是给数据传输开了个“绿色通道”。

它可以让设备直接在存储器之间传输数据,不需要经过CPU这个“大管家”来中转。

这就好比是快递员直接把包裹从一个仓库送到另一个仓库,而不需要先送到快递公司总部再转发,节省了不少时间呢。

1.2 打个比方,如果把CPU比作一个超级忙碌的厨师,要处理各种食材(数据)的加工和分配。

dma就像是一个小助手,它可以直接把食材从仓库(存储器)搬到厨房(其他设备),厨师就可以专注于做菜(处理更重要的计算任务),效率大大提高。

二、dma的使用步骤。

2.1 首先得有支持dma的硬件设备。

这就像你要开车,得先有一辆车一样。

没有这个硬件基础,dma就无从谈起。

比如说你的电脑主板得支持dma功能,还有像硬盘、显卡这些设备也要能配合才行。

这是“万事俱备,只欠东风”中的“万事”,硬件是基础,少了它就不行。

2.2 然后就是软件方面的设置了。

在操作系统或者相关的驱动程序里,要开启dma功能。

这一步可不能马虎,就像你要启动汽车,得插入钥匙拧一下一样。

不同的操作系统或者设备可能设置的地方不太一样。

有的可能在设备管理器里,有的可能在BIOS设置里。

这就需要你“按图索骥”,根据设备的说明书或者网上的教程来操作。

如果设置错了,可能就无法发挥dma的优势,甚至会导致设备出现问题。

2.3 最后就是要确保数据传输的两端都能正确地与dma配合。

这就像是两个人要配合默契地传球一样。

比如说你要从硬盘传输数据到内存,硬盘要知道怎么把数据交给dma,内存也要知道怎么接收dma传来的数据。

这中间要是出了岔子,数据就可能“丢三落四”,传输就会失败。

三、dma使用中的注意事项。

3.1 兼容性是个大问题。

不是所有的设备都能很好地与dma兼容。

就像不是所有人都能合得来一样。

有时候新的设备和老的设备在dma的使用上可能会有冲突。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux DMA使用(网摘)关键词:0引言1如何在Linux下用DMA的方式进行数据传输(硬盘)我们都知道,使用DMA方式传输数据可以占用更少的CPU资源,因此与其它操作系统一样,Linux支持硬盘以DMA方式转输数据,但在安装Red Hat时关于DMA的默认选项是Disable的,当然你可以在安装时就enable它。

如果在安装时DMA是disable的,那该怎么才能激活DMA呢?通过重新编译内核可以激活DMA支持,但编译内核对新手显然太过复杂。

下面的方法无需编译内核,就可以激活DMA支持。

一、检查系统中的DMA选项是否已被激活在进行操作前,先确认硬盘是否已经在使用DMA方式传输数据了。

方法:查看/ proc/ide/hda/settings文件,其中有一行的内容为:using_dma,如果其后面的值被设置为1就说明系统已经支持DMA了,那么下面的操作就可以免了,当然如果你要关闭DMA 功能的话,还要往下看看哟:)。

Linux中的hdparm命令是用来进行与硬盘相关操作的,用hdparm-i/dev/hda可以列出IDE可能支持的DMA模式,如:DMA modes:mdma0mdma1mdma2udma0udma1udma2udma3*udma4二、激活DMA支持方法1:在lilo.conf中加入:idex=dma,其中x代表硬盘序号,其取值范围0-3,分别代表系统中的四个IDE硬盘设备。

方法2:使用hdparm命令,hdparm d1/dev/hda其中d1表示使能DMA,你可以将其加到rc.locl中以便每次启动时都硬盘都能使用DMA方式传输数据。

三、关闭DMA支持命令格式:hdparm d0/dev/hda关闭DMA传输方式,实在想不出有什么理由要这样做。

对支持UDMA传输方式的硬盘,也可以参照以上的方法进行设置,但要确保硬盘控制器及硬盘都支持UDMA,最后你还要有一根支持UDMA传输方式的硬盘连线,否则即使你激活了UDMA支持,它也会罢工的。

2S3C2410的linux下DMA驱动程序开发网上介绍LINUX下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期zhaoyang因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接手时无资料借鉴的茫然,故写点介绍,期待能给有DMA开发任务的网友们一点帮助。

本文将包括如下内容:DMA驱动主要函数功能驱动中关键技术分析具体的DMA实例分析申明:本DMA驱动开发介绍仅适合S3C2410处理器类型,分析源码为韩国MIZI研究中心维护的dma驱动代码:linux/arch/arm/mach-s3c2410/dma.h,linux /arch/arm/mach-s3c2410/dma.c,其它处理器平台DMA开发可比对此文,自行分析。

DMA驱动主要数据结构(linux/arch/arm/mach-s3c2410/dma.h)S3C2410有四通道DMA,每通道有9个控制寄存器:6个控制寄存器控制DMA传输,其它3个监视DMA控制器状态。

(1)DMA单个内核缓冲区数据结构:typedef struct dma_buf_s{int size;/*buffer size:缓冲大小*/dma_addr_t dma_start;/*starting DMA address:缓冲区起始物理地址*/int ref;/*number of DMA references缓冲区起始虚拟地址*/void*id;/*to identify buffer from outside标记*/int write;/*1:buf to write,0:buf to read DMA读还是写*/struct dma_buf_s*next;/*next buf to process指向下一个缓冲区结构*/ }dma_buf_t;(2)DMA寄存器数据结构/*DMA control register structure*/typedef struct{volatile u_long DISRC;/源地址寄存器volatile u_long DISRCC;//源控制寄存器volatile u_long DIDST;//目的寄存器volatile u_long DIDSTC;//目的控制寄存器volatile u_long DCON;//DMA控制寄存器volatile u_long DSTAT;//状态寄存器volatile u_long DCSRC;//当前源volatile u_long DCDST;//当前目的volatile u_long DMASKTRIG;//触发掩码寄存器}dma_regs_t;(3)DMA设备数据结构/*DMA device structre*/typedef struct{dma_callback_t callback;//DMA操作完成后的回调函数,在中断处理例程中调用u_long dst;//目的寄存器内容u_long src;//源寄存器内容u_long ctl;//此设备的控制寄存器内容u_long dst_ctl;//目的控制寄存器内容u_long src_ctl;//源控制寄存器内容}dma_device_t;(4)DMA通道数据结构/*DMA channel structure*/typedef struct{dmach_t channel;//通道号:可为0,1,2,3unsigned int in_use;/*Device is allocated设备是否已*/const char*device_id;/*Device name设备名*/dma_buf_t*head;/*where to insert buffers该DMA通道缓冲区链表头*/dma_buf_t*tail;/*where to remove buffers该DMA通道缓冲区链表尾*/dma_buf_t*curr;/*buffer currently DMA'ed该DMA通道缓冲区链表中的当前缓冲区*/unsigned long queue_count;/*number of buffers in the queue链表中缓冲区个数*/int active;/*1if DMA is actually processing data该通道是否已经在使用*/dma_regs_t*regs;/*points to appropriate DMA registers该通道使用的DMA 控制寄存器*/int irq;/*IRQ used by the channel//通道申请的中断号*/dma_device_t write;/*to write//执行读操作的DMA设备*/dma_device_t read;/*to read执行写操作的DMA设备*/}s3c2410_dma_t;以下分配了四个DMA通道:s3c2410_dma_t dma_chan[MAX_S3C2410_DMA_CHANNELS];每个DMA通道维护着一个多缓冲区组成的单链表等待队列,执行DMA操作时先更新DMA 通道控制寄存器内容,再依次摘取当前缓冲区投入使用,缓冲区头指针顺次前移;需要插入新的缓冲区时,可从head或tail插入;图A详细分析了数据结构关系:DMA驱动主要函数功能分析(linux/arch/arm/mach-s3c2410/dma.c)写一个DMA驱动的主要工作包括:DMA通道申请、DMA中断申请、控制寄存器设置、挂入DMA等待队列、清除DMA中断、释放DMA通道。

Dma.c中对这些工作作了很好的实现,以下具体分析关键函数:int s3c2410_request_dma(const char*device_id,dmach_t channel,dma_callback_t write_cb,dma_callback_t read_cb)(s3c2410_dma_queue_buffer);函数描述:申请某通道的DMA资源,填充s3c2410_dma_t数据结构的内容,申请DMA 中断。

输入参数:device_id DMA设备名;channel通道号;write_cb DMA写操作完成的回调函数;read_cb DMA读操作完成的回调函数输出参数:若channel通道已使用,出错返回;否则,返回0int s3c2410_dma_queue_buffer(dmach_t channel,void*buf_id,dma_addr_t data,int size,int write)(s3c2410_dma_stop);函数描述:这是DMA操作最关键的函数,它完成了一系列动作:分配并初始化一个DMA 内核缓冲区控制结构,并将它插入DMA等待队列,设置DMA控制寄存器内容,等待DMA 操作触发输入参数:channel通道号;buf_id,缓冲区标识dma_addr_t data DMA数据缓冲区起始物理地址;size DMA数据缓冲区大小;write是写还是读操作输出参数:操作成功,返回0;否则,返回错误号int s3c2410_dma_stop(dmach_t channel)函数描述:停止DMA操作。

int s3c2410_dma_flush_all(dmach_t channel)函数描述:释放DMA通道所申请的所有内存资源void s3c2410_free_dma(dmach_t channel)函数描述:释放DMA通道因为各函数功能强大,一个完整的DMA驱动程序中一般只需调用以上3个函数即可。

可在驱动初始化中调用s3c2410_request_dma,开始DMA传输前调用s3c2410_ dma_queue_buffer,释放驱动模块时调用s3c2410_free_dma。

具体的DMA实例分析Linux下的IIS音频驱动主要都在/kernel/drivers/sound/s3c2410-uda1341.c文件中。

它定义了2个重要的数据结构audio_bufer_t,管理audio缓冲区的数据结构;audio_stream_t管理多缓冲区的数据结构,它为音频流数据组成了一个环形缓冲区。

我们先看一下加载驱动模块时的初始化函数:int__init s3c2410_uda1341_init(void),该函数先初始化IO和UDA341芯片,然后语句s3c2410_request_dma("I2SSDO",s ->dma_ch,audio_dmaout_done_callback,NULL);申请了一个DMA通道用于输出音频数据;smdk2410_audio_write是音频驱动最关键的函数,它从用户进程中拷贝音频数据流至DMA内核缓冲区,然后适用DMA通道2把音频数据发送出去,从而输出声音。

相关文档
最新文档