16 uboot study DMA控制器介绍

DMA 简介

DMA (Direct Memory Access ,直接内存存取)是比一种效率比较高的系统内部的一种数据传输方式,在系统运行时经常需要从一个地址空间拷贝大量数据到另一个地址空间,每次拷贝都需要占用cpu大量的时间,不能够去执行其他的工作,而DMA控制器就是为了解决这个问题,当需要拷贝数据时,cpu只要告诉DMA控制器源地址,目标地址,拷贝大小这些参数后就可以去做其他事情了,DMA会接管相关总线,去完成数据拷贝的工作。当DMA完成传输工作后,会通知CPU来进行处理。这样就大大提高了CPU的工作效率。

S3C6410的DMAC

S3C6410 包括4个DMA控制器,每个DMA控制器有8个传输通道,DMA控制器的每个通道都能够无限制的在AXI SYSTEM 总线和AXI PERIPHERAL 总线之间通过AHBtoAXI 桥路传输数据。换句话说,每个通道能够应用在下面的场合:

  • 1 源和目标都在SYSTEM总线上
  • 2 源在SYSTEM总线但目标在PERIPHREAL 总线
  • 3 源在PERIPHREAL总线但是目标在SYSTEM总线
  • 4 源和目标都在PERIPHREAL总线上

DMA的主要优势就是在没有CPU的干涉下也能进行数据传输,DMA传输操作可以被软件或硬件驱动,或者是内部外设的请求,或者是外部引脚的请求。
一些特性:

  • 4个 DMA 控制器,每个含8个通道,每个通道支持一个单向传输
  • 每个DMA控制器提供16个外围DMA请求
  • 每个外设能够请求一个突发模式或单次模式的DMA请求,突发模式大小在DMAC寄存器设置
  • 支持内存到内存,内存到外设,外设到内存,外设到外设四种请求
  • 使用链表支持分散或者聚集的DMA请求
  • 硬件DMA优先级区分,每个通道都有固定的优先级,从Chanal 0到Chanal 7 优先级依次降低
  • 源或目标源地址自动递增或非递增
  • 可编程的突发模式的数据大小,通常为FIFO的一般
  • 每个通道4个字的FIFO
  • 支持8,16,32bit 宽度传输
  • 分离的DMA 错误和DMA 总数中断请求,一个中断能够通过DMA 错误或者DMA count达到0 产生(通常意味着传输完成)
  • 中断屏蔽
  • 原始中断状态
block
block

S3C6410 支持64个DMA 源,四个DMA控制器分为安全DMA控制器和通用DMA控制器两种,通过系统控制模块中的SDMA_SEL寄存器进行选择,64个DMA源如下表:


source
source

使能一个DMA通道的步骤

  • 1、决定使用安全DMA控制器还是通用DMA控制器,若要使用通用的DMA控制器,关闭系统控制器的安全DMA控制寄存器(SDMA_SEL),复位值是SDMAC
  • 2、选择一个符合优先级要求的空闲的DMA通道 Chanal 0 到Chanal 7 优先级从高到低
  • 3、清空通道中断挂起寄存器和错误寄存器 DMACIntTCClr 和 DMACIntErrClr
  • 4、写源地址到源地址寄存器 DMACCxSrcAddr
  • 5、写目的地址到目标地址寄存器 DMACCxDestAddr
  • 6、写下次链接地址到DMACCxLLI寄存器,如果传输包含一个单数据包,则必须写入这个寄存器
  • 7、编程DMACCxControl 寄存器填写控制信息
  • 8、编程通道配置信息到DMACCxConfiguration 寄存器,如果使能位被设置,则DMA通道会自动使能

寄存器描述

四个DMA控制器被命名为DMAC0,DMAC1,SDMAC0,SDMAC1,寄存器基地址分别为0x7500_0000,0x7510_0000,0x7DB0_0000和0x7DC0_0000。


reg
reg

reg
reg

reg
reg
  • 中断状态寄存器
    中断状态寄存器 DMACIntStatus 是一个只读的用来指示屏蔽后的中断状态的寄存器,某位为高表示一个特定的DMA通道中断请求是激活的,请求能够被错误或终端计数中断请求产生。


  • 终端计数中断状态寄存器


  • 终端计数请求清零寄存器


  • 错误中断状态寄存器


  • 错误中断状态清零


  • 原始终端计数中断寄存器


  • 原始错误中断状态寄存器


  • 通道使能状态寄存器


  • Burst请求寄存器


  • Single请求寄存器


  • DMACConfiguration 使能寄存器


  • 同步寄存器


  • 源地址寄存器


  • 目标地址寄存器


  • 链接表寄存器


  • 通道控制寄存器0




  • 通道控制寄存器1


  • 通道配置寄存器



  • 通道配置寄存器-额外


简单代码分析

/*
S3C6410中DMA操作步骤:
1、决定使用安全DMAC(SDMAC)还是通用DMAC(DMAC);
2、开启DMAC控制,设置DMAC_Configuration寄存器;
3、清除传输结束中断寄存器和错误中断寄存器;
4、选择合适的优先级通道;
5、设置通道的源数据地址和目的数据地址(设置DMACC_SrcAddr和DMACC_DestAddr);
6、设置通道控制寄存器0(设置DMACC_Control0);
7、设置通道控制寄存器1,(传输大小,设置DMACC_Control1);
8、设置通道配置寄存器;(设置DMACC_Configuration)
9、使能相应通道(设置DMACC_Configuratoin);
*/

#define SDMA_SEL                (*((volatile unsigned long *)0x7E00F110))
#define DMACIntTCClear          (*((volatile unsigned long *)0x7DB00008))
#define DMACIntErrClr           (*((volatile unsigned long *)0x7DB00010))
#define DMACConfiguration       (*((volatile unsigned long *)0x7DB00030))
#define DMACSync                (*((volatile unsigned long *)0x7DB00034))
#define DMACC0SrcAddr           (*((volatile unsigned long *)0x7DB00100))
#define DMACC0DestAddr          (*((volatile unsigned long *)0x7DB00104))
#define DMACC0Control0          (*((volatile unsigned long *)0x7DB0010c))
#define DMACC0Control1          (*((volatile unsigned long *)0x7DB00110))
#define DMACC0Configuration     (*((volatile unsigned long *)0x7DB00114))


#define UTXH0           (volatile unsigned long *)0x7F005020

char src[100] = "\n\rHello World-> This is a test!\n\r";


void dma_init()

{

    //DMA控制器的选择(SDMAC0)
    SDMA_SEL = 0;


    /* 如果外设的工作时钟与DMA控制器的时钟不相同, 要使能"同步逻辑" */
    DMACSync = 0;

    //DMA控制器使能
    DMACConfiguration = 1;


    //初始化源地址
    DMACC0SrcAddr = (unsigned int)src;
    

    //初始化目的地址
    DMACC0DestAddr = (unsigned int)UTXH0;

    //对控制寄存器进行配置
    /*
    源地址自增
    目的地址固定、
    目标主机选择AHB主机2
    源主机选择AHB主机1
    */


    DMACC0Control0 =(1<<25) | (1 << 26)| (1<<31);
    DMACC0Control1 = 0x64;     //传输的大小
    /*
    流控制和传输类型:MTP 为 001
    目标外设:DMA_UART0_1,源外设:DMA_MEM
    通道有效: 1
    */
    DMACC0Configuration = (1<<6) | (1<<11) | (1<<14) | (1<<15);
}

void dma_start()
{
    //开启channel0 DMA
    DMACC0Configuration  = 1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容