S3C2440的DMA

S3C2440 - DMA传输(以字符传输为例) 一、使用DMA的优点及DMA支持的请求源 1、DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。 2、DMA在大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等。 3、S3C2440有四个DMA,每个DMA支持的工作方式基本相同,但支持的DMA请求源可能略有不同。如下为四个DMA通道分别支持的DMA请求源: Ch0: 阅读详情
DMA,Direct Memory Access,直接存储器访问。其主要功能是在不需要处理器参与的情况下进行数据传输。值得一提的是,那些复杂的协议和时序图,是做DMA控制器的工程师要关心的事情;对于写使用DMA进行数据传输的工程师来说,只要稍微了解就可以了。

1. 简介

   S3C2440A有一个位于系统总线和外设总线间的4通道DMA控制器。每个通道都支持在位于系统总线上和(或)位于外设总线上的设备间进行无限制的数据传输。所谓“无限制的”,意思是每个通道可以处理四种情况:

(1)源和目标都在系统总线上

(2)源在系统总线上,目标在外设总线上

(3)源在外设总线上,目标在系统总线上

(4)源和目标都在外设总线上

   DMA的主要优点是可以在无需CPU干预的情况下进行数据传输。DMA传输可以由软件、内部外设请求或者外部请求引脚发起。

2. 请求源

   如果通过DCON寄存器设置了外部DMA请求模式,则DMA控制器的每个通道可以在6个请求源之间选择一个,见下表:

S3C2440的DMA - chengang-cn - AE-陈的技术中心

注意:只有在DCON[23]设置为1,表示使用硬件中断模式时,请求源才有效。

3. DMA有限状态机

DMA使用3状态的有限状态机来进行操作:

状态一:初始状态。DMA控制器等待DMA请求,DMA ACK和INT REQ都是0。一旦请求到达,则进入状态二。

状态二:ACK变为1,从DCON[19:0]装载传输计数值到CURR_TC。注意:ACK保持为1直到随后清除它。

状态三:在此状态下,初始化进行原子操作的子有限状态机。子有限状态机(sub-FSM)从源地址读取数据,写入到目的地址(原子操作)。这个操作会考虑数据尺寸和传输尺寸(单步还是突发)。在完全服务模式(whole service mode)下,此操作会重复直到传输计数值CURR_TC变为0;在单步服务模式下,此操作只进行一次。子有限状态机每完成一次原子操作,主有限状态机会让CURR_TC减1。如果CURR_TC变为0,又在DCON[29]设置了启用中断,则DMA控制器会发起DMA中断请求。此时,如果满足下列条件之一,还会清除DMA ACK:

(1)在完全服务模式下CURR_TC变为0

(2)在单步服务模式下原子操作完成

   在单步服务模式下,主有限状态机分别经历这三个状态一次,然后传输停止,等待下一个DMA请求。下一个请求到达时,会重复这三个状态一次。因此,对于每次原子操作,ACK都会被设置然后被清除。相反,在完全服务模式下,主有限状态机会保持在状态三直到CURR_TC变为0。在整个传输过程中,ACK保持为1,直到传输完成,ACK才变为0。然而,无论是单步服务模式还是完全服务模式,都只在CURR_TC变为0时才发起DMA中断请求。

4. 寄存器

    S3C2440A对于每个DMA通道有9个寄存器,4个通道共使用了36个寄存器。9个寄存器中有6个是控制寄存器,用于控制DMA传输;3个是状态寄存器,用于监测DMA传输状态。

    实际传输的字节数 = DCON[19:0] * DSZ * TSZ

    DCON[19:0]初始传输计数;DSZ = DCON[21:20],传输的数据单元尺寸,类似C标准库中fread()函数第二个参数;TSZ = DCON[28],0表示每次进行一个单元传输,1表示每次进行(突发的)4个单元传输。

    软硬件方式选择:

    DCON[23] = 0:软件方式,应该在源和目标地址寄存器中写入有效地址。

    DCON[23] = 1:硬件方式,由DCON[26:24]指明DMA请求源

    其他:

    DCON[29]表示是否在传输完成时发起DMA中断请求

    DCON[27]选择单步服务模式还是完全服务模式,一般单步服务模式仅用于调试,常用的是完全服务模式

    DCON[30]选择DREQ/ACK同步方式

    DCON[31]选择请求模式还是握手模式,建议使用握手模式

5. 程序

程序功能:用memcmp()函数来验证DMA传输是正确的。

#define DMA_SIZE 0xFFFFF
#define DMA_SRC (0x30A00000)
#define DMA_DST (0x31000000)

static volatile int dma_done;

static void __irq DMA_ISR()
{
rSRCPND = BIT_DMA0;
rINTPND = BIT_DMA0;
UART0_printf("\n##### End DMA Transfer #####\n");
dma_done = 1;
}

static void DMA_memcpy(void* p_dst,const void* p_src,int len)
{
rDISRC0 = ((int)p_src & 0x7FFFFFFF);
rDISRCC0 = 0;
rDIDST0 = ((int)p_dst & 0x7FFFFFFF);
rDIDSTC0 = 0;

rDCON0 = (len & 0xFFFFF) + (2 << 20) +
(1 << 22) + (1 << 27) + (1 << 29) + (1 << 30) + (1U << 31);
rDMASKTRIG0 = 0x03;
}

void DMA_Test()
{
pISR_DMA0 = (unsigned int)DMA_ISR;
rINTMSK &= (~BIT_DMA0);

memset((void*)DMA_DST,0,DMA_SIZE*4);
UART0_printf("BEFORE transfer memcmp = %d\n\n",memcmp((void*)DMA_SRC,(void*)DMA_DST,4*DMA_SIZE));

dma_done = 0;
UART0_printf("START DMA Transfer\n");
DMA_memcpy((void*)DMA_DST,(const void*)DMA_SRC,DMA_SIZE);
while(0==dma_done);

UART0_printf("\n\nAFTER transfer memcmp = %d\n\n",memcmp((void*)DMA_SRC,(void*)DMA_DST,4*DMA_SIZE));
}

from : http://blog.sina.com.cn/s/blog_56dee71a0100dwik.html~type=v5_one&label=rela_nextarticle



s3c2440学习系列6(dma 续)

DMA优点是其进行数据传输时不需要CPU的干涉,可以大大提高CPU的工作效率。

DMA大容量数据传输中非常重要,比如图像数据传输,SD卡数据传输,USB数据传输等等。

S3C2410有四个DMA,每个DMA支持工作方式基本相同,但支持的source Dest可能略有不同。

那么怎么使用DMA呢,S3C2410内部集成了DMA控制器,我们只需要简单的配置一下寄存器就可以实现DMA的传输了。

步骤与要点:

1.       数据从哪里来,到哪里去?

使用DMA当然首先我们要知道数据的流向,DISRCx寄存器是DMA初始源寄存器存放了数据的源地址。DIDSTx是DMA的初始目的寄存器,应该存放数据的目的地址。

 

2.       数据走得什么总线?地址是否是固定的?

我们还要知道源与目的数据存储设备是在什么总线上(AHB系统总线,一般是高速的比如内存,APB外围总线低速的,比如SD,UART);

以及数据传输结束以后起始地址还原到发送前的起始地址呢,还是在现在的末尾+1做为新的起始地址。

这些设置在DISRCCx与DIDSTCx两个寄存器里面配置。

 

3.       数据以什么方式传输?源与目的是什么设备?要不要自动重载?

需要确定数据的传输方式有请求还是握手(推荐使用HANDSHAKE),根据上面的总线确定与什么时钟同步(HCLK,PCLK),是单元传输还是突发传输,是以字节传输还是字传输,是否重载。是单服务(只发送一次)还是多服务(不停循环发送),以及数据的传送大小。

选择源与目的设备,这里DMA控制器支持:

   Ch0:nXDREQ0,UART0,SDI,Timer,USB EP1

   Ch1: nXDREQ1,UART1,I2SSDI,SPI0,USB EP2

   Ch2:I2SSDO,I2SSDI,SDI,Timer, USB EP3

   Ch3:UART1,SDI,SPI1,Timer, USB EP4

最后还要确定中断是不是传输结束发生(CURR_TC记数是不是0)。

这些都在DCONx中设置。

4.       怎么开始传输DMA和停止DMA,这些在DMASKTRIG中设置。

 

下面是DMA在SD卡中使用的一段示例:

 

SD卡读的DMA设置:

pISR_DMA0=(unsigned)DMA_end; //DMA中断服务函数入口地址,一次DMA传送结束发生rINTMSK = ~(BIT_DMA0); //开DMA中断

rDISRC0=(int)(Tx_buffer); //源地址在内存 就是从内存读数据到SD卡

rDISRCC0=(0<<1)+(0<<0); //内存的总线是 AHB, 地址是自动增加inc

rDIDST0=(U32)(SDIDAT); // 目的地址SD卡

rDIDSTC0=(1<<1)+(1<<0); // 在总线APB, 地址是固定的因为SD的FIFO是固定大的 

rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;

//handshake握手模式, 与 PCLK同步,发送完产生中断, 单元传输, 单服务, SDI

//不自动重载,每次发送一个字,发送大小

rDMASKTRIG0=(0<<2)+(1<<1)+0; //不停止, DMA0 channel 启动,不用SW触发

 

SD卡写的相应代码

pISR_DMA0=(unsigned)DMA_end;

rINTMSK = ~(BIT_DMA0);

rDISRC0=(int)(Tx_buffer);                            

rDISRCC0=(0<<1)+(0<<0);                          

rDIDST0=(U32)(SDIDAT);                            

rDIDSTC0=(1<<1)+(1<<0);                           

rDCON0=(1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(2<<24)+(1<<23)+(1<<22)+(2<<20)+128*block;                                                       

rDMASKTRIG0=(0<<2)+(1<<1)+0;

转自:http://hi.baidu.com/125580956/item/cd25ec0b1d3029e23499021c



S3C2440之简易播放器设计(利用DMA与IIS通信) 利用前一篇文章讲解的IIS知识,只是不是利用轮询,而是利用DMA控制器,让数据在内存和IIS的发送FIFO之间传送。这样在音乐播放过程中,进行暂停,静音,播放,音量增减都不会使音乐产生卡顿的感觉。 注意DMA的请求是由发送FIFO自动发起的。 可以设置DMAMSKTRIG的STOP位停止DMA,但是真正的停止需要参考ON_OFF位。ON_OFF位当为非自动重载,且CURR_TC为0,该位自动为 阅读详情

相关推荐

S3C2440 DMA技术项目实战:LED数据传输与管理

本文还有配套的精品资源,点击获取 简介:本项目针对基于ARM920T内核的S3C2440微处理器,专注于DMA(Direct Memory Access)技术。通过在ADS1.2开发环境下编写的程序,测试了S3C2440的DMA功能,展示了DMA在高效数据流处理,如LED显示更新中的应用。压缩包中包含C语言源代码文件、ADS项目配置文件、DMA传输数据和系统初始化代码。实践...

weixin_28949937的博客 1640

S3C2440 Linux驱动移植——SD卡驱动

开发板:TQ2440 内核:Linux 2.6.32 PC OS:Ubuntu 11.04 本文将对SD卡驱动的移植做简要介绍。 1.  添加板级信息 打开arch/arm/mach-s3c2440/mach-smdk2440.c。 添加如下结构体: /* Added by Yan Jun for SD/MMC driver */ /***************

嵌入式Linux 4846

linux S3C2440 DMA驱动开发

linux S3C2440 DMA驱动开发

S3C2440A 第八章:DMA

第八章:DMA 简介:     S3C2440A支持位于系统总线和外设总线的四通道DMA控制器。每一个DMA控制器的通道都可以在系统设备之间或者系统与外设之间,以及外设与外设之间进行数据传输操作而没有任何限制。换句话说,每个通道可以处理一下四种情况: 1.  源和目的都在系统总线 2.  源在系统总线,而目的在外部总线 3.  源在外部总线,而目的在系统总线 4.  源和目的都在外部总...

静祥阁 1591

s3c2440的DMA应用

s3c2440的DMA应用这是赵春江老师博客摘录下来TQ2440开发板裸机程序,我基本上验证过,转发给大家,希望对大家有些帮助,多多交流,一起进步。

S3C2440裸奔---DMA源代码

首先需要搭建一个可以编译代码的环境。从一开始我就不想用ADS(安装完ADS后会产生一个CodeWarrior for ARM Developer Suite的工具,可以编译和调试代码),虽然它是个很好的工具,但是它却隐藏了很多的细节,不利于新手去深度学习。所以我还是希望从Makefile入手,一步一步弄懂所有的细节。 第一步:需要先搭建一个Linux环境,我是安装在虚拟机上面的。安装好Linux后,再从网上下载arm-linux-gcc,一般解压后之后就可以直接使用了,但需要先设置好环境参数。 第二步:编写代码,然后在Linux系统上进行编译。代码在后面会给出。 第三步:需要把编译好的bin文件烧写到板子上。这个需要使用J-Link烧录器,还需要安装“Setup_JLinkARM_V408k.exe”软件,特别是一些参数的设置非常重要。

S3C2440 DMA驱动程序编写及测试(三十二)

https://www.cnblogs.com/lifexy/p/7880737.html DMA(Direct Memory Access) 即直接存储访问,DMA传输方式无需CPU直接控制传输,通过硬件为RAM、I/O设备开辟一条直接传输数据的通路,能使CPU的效率大为提高。 学了这么多驱动,不难退出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作...

Tim的嵌入式之旅 1940

AUTOSAR CAN通信全过程

首先,从AUTOSAR架构上来说,一个完整的CAN通信的过程涉及到了包括硬件、AUTOSAR中间件和上层应用层软件;在硬件部分来说,涉及到的是CAN 总线和CAN的收发器;软件部分的话,涉及到的概念是MCAL(微控制器抽象层)、BSW(基础软件层)、RTE(实时运行环境)、APPL(应用层)等;其中MCAL部分用到了通信驱动模块,而BSW部分使用到了通信服务模块和通信硬件抽象模块;由于笔者是做MCAL和BSW的,至于应用层部分的知识就暂且不具体介绍了;

xxdw1992的博客 6253

学习笔记 --- S3C2440 DMA操作原理

DMA(Direct Memory Access,直接内存访问)是一种不经过CPU而直接从内存存取数据的数据交换模式。在需要进行大量数据交换的场合,用好DMA,可以大大提高系统的性能,因为DMA操作几乎不占用CPU资源。s3c2440提供了4个通道的DMA 每个DMA通道能处理下面四种情况的数据传输: (1)源器件和目的器件都在系统总线 APB (2)源器件在系统总线,目的器件在外设总线

忧郁天蝎 1504

华为设备OSPF配置全流程:从邻居关系到区域划分实战指南

本文详细介绍了华为设备上OSPF协议的完整配置流程,从基础概念到实战操作,包括邻居关系建立、多区域划分及高级特性配置。特别针对华为设备的特有语法和验证命令进行了重点讲解,帮助网络工程师快速掌握OSPF在华为环境中的部署与优化技巧,提升网络配置效率。

weixin_29299807的博客 251

鸿蒙OS+UniApp文件上传实战:如何解决大文件分片上传的3大坑?

本文深入探讨鸿蒙OS与UniApp结合实现大文件分片上传的实战方案,重点解决分片策略设计、网络中断处理和进度管理三大技术难题。通过鸿蒙分布式特性与UniApp跨平台能力的结合,提供动态分片调整、断点续传和跨设备进度同步等优化方案,显著提升大文件上传成功率和用户体验。

weixin_29250403的博客 474

S3C2440的DMA资源

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

逐波与逆流 1206

【2025年五一数学建模竞赛】A题 完整论文 模型建立与求解

2025年五一数学建模竞赛 A题:基于历史数据与模式识别的道路车流量推测模型研究

Magnolia_He的博客 3783

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

全能媒体工具深度测评(下篇一):AI图文生成+全能解压+图片去文字,一键搞定素材精修

解压50多种格式,文生图,图生图

cs821984831的博客 40

YOLOv11损失函数进阶:融合SmoothL1与FocalLoss,让检测精度再涨10%的实战教程

在YOLOv11的这里的beta参数控制“L1与L2的过渡阈值”,默认设为1.0即可兼容多数场景。同样在# 计算动态alpha(基于类别样本数,需提前统计self.class_counts)# 交叉熵基础# FocalLoss权重else:使用前需统计数据集的(每个类别的样本数),并传入的alpha参数。损失函数是YOLOv11精度的“灵魂”——SmoothL1让边界框回归“稳、准、狠”,改进FocalLoss让类别分类“雨露均沾”。从代码改造到实战落地,本教程已为你搭建了一条精度跃升的路径。

m0_64661770的博客 213

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

【原理图与PCB专题】使用Cadence如何在Layout时直接互换相同功能的PIN

Cadence允许我们在PCB中互换管脚,最后再反标给原理图。集成TVS管、排阻、DDR、FPGA有一些PIN是完全相同功能,可进行管脚互换的,建议使用这个功能。可降低硬件工程师与Layout工程师之间沟通成本,加快设计进度。

一点硬件 801

S3C2440-DMA

哈尔滨理工大学软件工程专业08-7李万鹏原创作品,转载请标明出处 http://blog.youkuaiyun.com/woshixingaaa/archive/2011/01/15/6142721.aspx S3c2440A 支持位于系统总线和外设总线之间的4 个通道的控制器。每个DMA 控制器通道无限制地执行系统总线上的设备或外设总线上的设备之间数据搬移。换句话说,就是每个通道都操作一下四种情况:...

编程开发资料库 170

Python 爬虫进阶技巧:新手必学的反爬突破与效率优化

本文系统总结了爬虫进阶的核心技巧,针对新手常见的反爬拦截、效率低下、动态页面解析等痛点问题,提出了可落地的解决方案。主要内容包括:通过随机UA池、代理IP池和Cookie池突破常见反爬机制;利用多线程/异步请求提升爬取效率;使用Selenium解析动态渲染页面;以及数据清洗方法提升数据质量。文中提供了完整的代码示例和实战对比数据,并强调爬虫开发应遵守合规性要求。这些技巧能帮助开发者快速提升爬虫实战能力,应对80%以上的常见爬取需求。

2503_91057718的博客 1436

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

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

上一篇: TDI过滤驱动分析
下一篇: S3C2440 Mini 2440 DMA方式实现Uart(串口)通信
shareCode
博客等级 码龄15年 125粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值