S3C DMA使用方法,2410-2440 dma介绍

DMA学习笔记 DMA(direct memory access,直接内存访问),是一种避开CPU,可以直接对外设和内存进行访问的技术,可以实现外设与内存、内存之间、外设之间的数据的访问和搬移。 阅读详情

这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。

Atomic transfer:指的是DMA的单次原子操作,它可以是Unit模式(传输1个data size),也可以是burst模式(传输4个data size),具体对应DCON[28]。

Data Size:指的是单次原子操作的数据位宽,8、16、32,具体对应DCON[21:20]。

Request Source:DMA请求的来源有两种,软件&硬件模块,由DCON[23]控制;当为前者时,由软件对DMASKTRIG寄存器 的位0置位触发一次DMA 操作。当为后者时,具体来源由DCON[26:24]控制,不同硬件模块的某时间触发一次DMA操作,具体要见不同的硬件模 块。
   
DMA service mode:DMA的工作模式有两种,单一服务模式&整体服务模式。前一模式下,一次DMA请求完成一 项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成 一次整体服务。具体对应DCON[27]。

RELOAD:在reload模式下,当transfer count的值变为零时,将自动加src、dst、TC的值加载到CURR_DST、 CURR_SRC、CURR_TC,并开始一次新的DMA传输。该模式一般和整体服务模式一起使用,也就是说当一次整体服务开始后,src、dst、TC 的值都已经被加载,因此可以更改为下一次

   服务的地址,2410说明文档中建议加入以下语句来判断当前的服务开始,src、dst、TC的值可以被更改了:while((rDSTATn & 0xfffff) == 0) ;

Req&Ack:DMA请求和应答的协议有两种,Demard mode 和 Handshake mode。两者对Request和Ack的时序定义有所不同:在Demard模式下,如果

   DMA完成一次请求如果Request仍然有效,那么DMA就认为这是下一次DMA请求;在Handshake模式下,DMA完成一次请求后等待Request信号无效,然后把ACK也置无效,再等待下一次Request。这个设计外部DMA请求时可能要用到。

传输总长度:DMA一次整体服务传输的总长度为:
    Data Size × Atomic transfer size × TC(字节)。

 

2410的DMA支持四类DMA传输:系统总线到系统总线(ASB/AHB to ASB/AHB),系统总线到外设总线(ASB/AHB to APB),外设总线到系统总线(APB to ASB/AHB),外设总线到外设总线(APB to APB)。

 

2410 DMA 的服务模式:
共有两种服务模式,一种是单一服务模式(single service),另外一种是整体服务模式(whole service)。
在单一服务模式下,不使用传统的DMA计数器,三个DMA状态被顺序执行一次后停止,等待DMA 请求再一次来临后再重新开始另一次循环。
在整体服务模式下,使用传统的DMA 计数器,状态机会停留在状态三,直到DMA计数器的值减为零,再回到状态一,等待下一次DMA请求。

2410 DMA 数据传输模式:
共有两种数据传输模式:
单位数据传输模式:执行一次读操作和一次写操作。
并发数据传输模式:执行四次读操作和四次写操作。

2410 DMA 的基本时序:
nXDREQ请求生效并经过2CLK周期同步后,nXDACK响应并开始生效,但至少还要经过3CLK的周期延迟,DMA控制器才可获得总线的控制权,并开始数据传输。

2410 DMA 的两种协议模式:
请求模式:If XnXDREQ remains asserted, the next transfer starts immediately. Otherwise it waits for XnXDREQ to be asserted.
握手模式:If XnXDREQ is deasserted, DMA deasserts XnXDACK in 2cycles. Otherwise it waits until XnXDREQ is deasserted.

2410 DMA REQ与ACK 协议类型:
共有三种协议类型:
单一服务请求:

单一服务握手:
整体服务握手:

根据上面所说的服务模式和协议模式,很容易推知这三种协议的时序分别是什么。

 

//=================================================

以下分配了四个DMA通道:

s3c2410_dma_t dma_chan[MAX_S3C2410_DMA_CHANNELS];

每个DMA通道维护着一个多缓冲区组成的单链表等待队列,执行DMA操作时先更新DMA通道控制寄存器内容,再依次摘取当前缓冲区投入使用,缓冲区头指针顺次前移;需要插入新的缓冲区时,可从head或tail插入;

图A详细分析了数据结构关系:


  1. 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通道已使用,出错返回;否则,返回0

  • int 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。

  1. 具体的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把音频数据发送出去,从而输出声音。我们可以在smdk2410_audio_write 中发现语句s3c2410_dma_queue_buffer(s->dma_ch, (void *) b,b->dma_addr, b->size, DMA_BUF_WR);就是它为DMA写操作作好了一切准备,当I2SSDO中断到来,DMA2通道执行一次写操作(从DMA缓冲写往IO地址0x55000010)。

smdk2410_audio_release函数中先后调用了s3c2410_dma_flush_all、s3c2410_free_dma释放DMA2占用的内存资源、和释放DMA2通道.

//=========================================

 

前天完成了UDA1341的驱动,程序是网上下载的,仅仅小改一下而已,昨晚上
分析了其中的DMA部分,有些小小的感想,如果不正确希望读者能够告诉我。谢谢。
写的很乱,没有整理。
    DMA的基础就不介绍了,可以参考http://blog.chinaunix.net/u1/58640/showart_483567.html
和规格书。我主要根据audio的使用,介绍一下DMA的使用。
    1.首先对DMA进行初始化。
    如对outstream的初始化
    channel = 2;
    source = S3C2410_DMASRC_MEM;//源地址为Memory
    hwcfg = 3;                   
    devaddr = 0x55000010;
    dcon = 0xa0800000;
    flags = S3C2410_DMAF_AUTOSTART;
    
/* s3c2410_dma_devconfig
 *
 * configure the dma source/destination hardware type and address
 * 配置DMA的源和目的的硬件类型和地址
 * source:    S3C2410_DMASRC_HW: source is hardware 源是硬件
 *            S3C2410_DMASRC_MEM: source is memory  源是内存
 *
 * hwcfg:     the value for xxxSTCn register,
 *            bit 0: 0=increment pointer, 1=leave pointer
 *            bit 1: 0=soucre is AHB, 1=soucre is APB
 *
 * devaddr:   physical address of the source
*/
因为我们的DMA 源是内存,目的是硬件IIS的固定地址,所以hwcfg应该
设定为APB  FIX_ADDR 即:3
int s3c2410_dma_devconfig(int channel,
              s3c2410_dmasrc_t source,
              int hwcfg,
              unsigned long devaddr)
{
    s3c2410_dma_chan_t *chan = &s3c2410_chans[channel];

    check_channel(channel);

    pr_debug("%s: source=%d, hwcfg=%08x, devaddr=%08lx/n",
         __FUNCTION__, (int)source, hwcfg, devaddr);

    chan->source = source;
    chan->dev_addr = devaddr;

    switch (source) {
    case S3C2410_DMASRC_HW:
        /* source is hardware */
        pr_debug("%s: hw source, devaddr=%08lx, hwcfg=%d/n",
             __FUNCTION__, devaddr, hwcfg);
        dma_wrreg(chan, S3C2410_DMA_DISRCC, hwcfg & 3);
        dma_wrreg(chan, S3C2410_DMA_DISRC,  devaddr);
        dma_wrreg(chan, S3C2410_DMA_DIDSTC, (0<<1) | (0<<0));

        chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DIDST);
        return 0;

    case S3C2410_DMASRC_MEM:
        /* source is memory */
        pr_debug( "%s: mem source, devaddr=%08lx, hwcfg=%d/n",
              __FUNCTION__, devaddr, hwcfg);
        dma_wrreg(chan, S3C2410_DMA_DISRCC, (0<<1) | (0<<0));
        dma_wrreg(chan, S3C2410_DMA_DIDST,  devaddr);
        dma_wrreg(chan, S3C2410_DMA_DIDSTC, hwcfg & 3);

        chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DISRC);
        return 0;
    }

    printk(KERN_ERR "dma%d: invalid source type (%d)/n", channel, source);
    return -EINVAL;
}

/* s3c2410_dma_config
 *
 * xfersize:     size of unit in bytes (1,2,4)
 * dcon:         base value of the DCONx register
*/
    dcon = 0xa0800000;
    因为IIS是16bit的,所以unit为2.
    s3c2410_dma_config(channel, 2, dcon);
//设定DMA传输结束后的回调函数
    s3c2410_dma_set_buffdone_fn(channel, audio_dmaout_done_callback);
    //设定S3C2410_DMAF_AUTOSTART
    s3c2410_dma_setflags(channel, flags);
    //申请DMA通道
    ret = s3c2410_dma_request(s->dma_ch, &s3c2410iis_dma_out, NULL);
   
    以上是初始化部分,之后通过dmabuf = dma_alloc_coherent(NULL, dmasize, &dmaphys, GFP_KERNEL);
来申请缓冲,dmabuf为虚拟地址,dmaphys是物理地址,虚拟地址用来让驱动写buf用,dmaphys用来传给dma。
dma关心的是实际的物理地址。
    然后通过s3c2410_dma_enqueue(s->dma_ch, (void *) b, b->dma_addr, b->size);来启动dma传输,
这里面的参数就是dmaphys,它为实际地址。
   如果dma传输结束,就会调用:
static void audio_dmaout_done_callback(s3c2410_dma_chan_t *ch, void *buf, int size,
s3c2410_dma_buffresult_t result)
{
    audio_buf_t *b = (audio_buf_t *) buf;
    DPRINTK("audio_dmaout_done_callback/n");
    up(&b->sem);
    wake_up(&b->sem.wait);
}
    来启动下一个buf的传输。

ARM11(s3c6410)和ARM9(2410/2240)的区别 ARM11(s3c6410)和ARM9(2410/2240)的区别推荐作为GPS、PDA、数字电视等手持设备的主要方案处理器提供方韩国Sumsung公司,最近又新推出ARM处理器S3C2450、S3C6410芯片。1.这些平台又与S3C2440处理器有哪些区别优势,主频400MHz SDRam内存控制器;支持Nor Flash和Nand Flash支持2种Flash启动,内部LCD、I 阅读详情

相关推荐

Unix/Linux环境下的S3C2410/S3C2440触摸屏驱动编程

本文还有配套的精品资源,点击获取 简介:本资源包提供了针对三星S3C2410处理器(可能包括S3C2440升级版)的触摸屏驱动程序,适用于Unix或Linux操作系统。S3C2410/S3C2440是基于ARM920T内核的微处理器,广泛应用于嵌入式系统,如智能手机和平板电脑。驱动程序负责处理触摸屏信号,将其转换为屏幕坐标,并与用户空间应用程序交互。学习这个驱动程序的实现可...

weixin_32869687的博客 945

linux驱动---DMA操作---寄存器分析

驱动编程是和yingjianxixi

PAPOSKY的专栏 1300

嵌入式开发:用状态机实现STM32按键消抖,告别阻塞延时

在嵌入式系统开发中,处理异步事件和实时响应是核心挑战。状态机作为一种强大的编程模型,通过定义有限的状态、事件和状态转换规则,将复杂的、非线性的控制逻辑转化为清晰、确定且易于维护的代码结构。其技术价值在于实现逻辑的模块化、异步化和非阻塞化,能显著提升代码的可读性、可扩展性和系统实时性。这一思想广泛应用于协议解析、用户界面交互、传感器数据处理等场景。本文以嵌入式开发中基础的按键处理为例,针对传统“延时消抖”方法会阻塞主循环、影响实时性的痛点,深入讲解如何运用状态机思维重构按键消抖逻辑。通过分析状态机的核心三要素

weixin_33377602的博客 339

DMA项目总结

配置通道的请求源配置传输的方式(例如:存储器到存储器,存储器到外设,外设到外设)配置源和目的地址以及传输数量配置工作模式每组通道之间独立运行从外设数据寄存器或者内存中取出数据将取出的数据进行存储传输数量寄存器的自减,直到为0然后完成传输方式1 mem to mem传输方式2 mem to 外设传输方式3 外设 to mem传输方式4 外设 to 外设DMA的传输模式DMA流控制本项目中DMA的设计规格DMA内部的可配置的寄存器一共12组,对应4个通道,每个通道3个寄存器。

qq_43823838的博客 1696

ILI9488 TFT屏驱动与触摸协同开发指南

TFT-LCD显示模块是嵌入式人机交互系统的核心外设,其工作原理依赖于专用显示控制器(如ILI9488)对GRAM显存的精确读写,并通过SPI等串行总线接收指令与图像数据。理解RGB接口时序、寄存器初始化流程及DC/CS信号控制逻辑,是实现稳定显示的基础技术前提;而四线电阻式触摸功能则需配合XPT2046类ADC控制器,通过独立SPI或模拟时序完成坐标采集。该方案兼顾低功耗、高集成与工程可移植性,广泛应用于工业HMI、仪器仪表及STM32F407等MCU平台的教学与产品开发。本文围绕3.5英寸320×480

weixin_33814090的博客 149

Abaqus SIGTERM/SIGINT中断问题深度解析与实战解决方案

本文深度解析Abaqus仿真计算中因SIGTERM或SIGINT信号导致作业意外终止的常见问题。核心原因常为许可证管理器因网络通信延迟误判进程空闲而强制断开,或系统资源监控工具的误杀。文章提供了从命令行参数调优(如使用int、ask_delete=OFF)、计算环境隔离到编写自动化容错脚本的完整实战解决方案,帮助用户彻底规避此类中断,确保长时间仿真任务的稳定运行。

weixin_29279101的博客 411

S3C2440的DMA资源

DMA,Direct Memory Access,直接存储器访问。在大学学习计算机概论课程时就听说过其大名了。其主要功能是在不需要处理器参与的情况下进行数据传输。《基于ARM的嵌入式系统开发与实例》第12章讲了S3C44B0X的DMA控制器,比较复杂。因为S3C44B0X有通用DMA和桥DMA之分,还有SSB(三星系统总线)和SPB(三星外设总线)之分。此外讲DMA的REQ/ACK协议和DMA传输

逐波与逆流 1206

Camera(5)metadata

Metadata 是整个 Android camera 中类似于高楼大厦中的管道系统一样,贯穿了整个 Camera 的 Framework 和 vendor HAL。Metadata 里面包含了所有的控制、参数、返回值等等。Metadata分为Android原生的Metadata和芯片商或者用户自定义的Metadata,即Android Tag和Vendor Tag。Vendor Tag在Hal中定义,并在camx和chi目录中使用。

qq_55893245的博客 3052

Linux驱动开发基础之DMA

本文对于DMA在Linux驱动中的相关运用进行了简单的介绍,并且也提到了一些DMA的相关概念以函数。对于DMA的传输过程进行了详细的介绍,并通过相关的代码进行了实现。下文所使用的硬件设备是基于ARM Cortex-A9处理器的Exynos-tiny4412开发板所实现的,所使用的内核版本为Linux-3.5提示:以下是本篇文章正文内容,下面案例可供参考。

ZZZZZ1113的博客 4866

使用python获取同花顺免费版和同花顺远航版自选股数据用于量化交易

在做量化交易时,有时需要在盘中实时监控同花顺自选股的数量,以便灵活地自定义提醒、捕捉买卖时点等。那么,如何使用python获取同花顺自选股数据呢?

tzzqn2008的专栏 3677

把 ABAP writable CDS view entity 讲透:从只读建模到可写模型的 ABAP CDS 新能力

摘要:SAP引入的writable CDS view entity突破了传统CDS视图只读的限制,允许通过ABAP SQL直接进行数据修改。该特性通过WRITABLE关键字定义,使CDS视图成为与数据库表同等级别的可写对象。其核心价值在于为数据集成、中间层同步等场景提供结构化写入入口,但需注意不应绕过业务规则。最佳实践建议保持底层表结构简单映射,避免复杂变形。这一特性标志着CDS从单纯消费模型向双向数据交互能力的演进,为ABAP开发提供了新的数据边界设计思路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1313

嵌入式:S3C2410与S3C2440的区别

SAMSUNG公司的S3C2410A芯片是一款16/32位的RISC微处理器芯片,芯片内使用了ARM公司的ARM920T内核,采用了称为AMBA(Advanced Microcontroller Bus Architecture,先进微处理器总线结构)的总线结构。ARM920T,内部包含两个协处理器、单独16KB指令Cache和MMU、单独16KB数据Cache和MMU等存储器控制器,产生对SDRAM/Nor Flash/SRAM存储器芯片的控制和片选逻辑Nand Flash控制器中断控制器。

timerring的博客 3927

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

CUDA:实现使用cuSolverSP底层API实现Cholesky因式分解(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 342

S3C2440和S3C6410性能比较

 比较项目 S3C2440 S3C6410 内核 ARM920T ARM1176JZF-S 主频 400MHZ 533MHZ/667MHZ 处理器类型 16/32-bit RISC 16/32-bit RISC 设计目标 高性能、低功耗 高性能、低功耗、高性价比 主要应用 手持设备 2.5G和3G通信服务 内部总线结构 32/16-bit 64/32-bit 多媒体硬件编码器/解码器 无 有(支持...

无语僧 7507

LangGraph教程8:LangGraph流式处理

流式处理可显著提升基于LLM应用的响应性。LangGraph支持两种流式模式:values模式返回每一步的完整结果,适合需要完整上下文处理的场景;updates模式仅返回增量变化,适用于实时更新需求。示例代码展示了如何用create_react_agent实现这两种模式,其中values模式完整记录处理流程,updates模式逐步输出结果。通过异步迭代输出流,开发者可以灵活选择适合应用场景的流式处理方式。

Cachel Wood的博客 620

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

s3c2440 DMA

DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同。那么怎么使用DMA呢,S3C2410内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。步骤与要点:1....

qinjie的博客 423

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

s3c6410与s3c2410及s3c2440的区别相似之处

本文主要是自己总结以及网络查看的结果,给大家共享下!                  小议2440与6410的区别 6410开发板和2440开发板的主要区别在于以下几点 1.这些平台s3c2440处理器器的区别与优势,主频400MHZ SDRam内存控制器,支持Nor Flash和Nand Flash支持2种, 内核含有LCD,I2C,Camera等控制器 2.s2c2440主频533

小胖的专栏 2297

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

s3c2440学习系列6(dma 续)

DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同。那么怎么使用DMA呢,S3C2410内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。

cybertan的专栏 2703

s3c2440 spi驱动DMA模式

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include

shangyaowei的专栏 838

s3c2440的dma操作的一般步骤

 s3c2440的dma操作的一般步骤 一般的,在s3c2440中,要想进行dma传输,需要一下七个步骤:一:int s3c2410_dma_request(unsigned int channel,            struct s3c2410_dma_client *client,            void *dev)s3c2410_dma_client的定义为:struct s3c2410_dma_client {        char                *name;};以u

chygx的专栏 636

S3C2440—UART原理简介

通用异步收发器简称UART,即“Universal Asynchronous Receiver Transmitter”       S3C2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个64个字节的发送FIFO。UART由波特率发生器、发送器、接收器和控制逻辑组成,使用系统时钟可以达115.2Kbit/s。

lwj103862095的专栏 3407
上一篇: busybox 文件系统 etc目录,登陆 login,密码 password,shadow
下一篇: 高速dma缓冲使用。kmem_cache_alloc,kmem_cache_create,struct kmem_cache。内核dma
#Page#
博客等级 码龄23年 1691粉丝 360原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值