S3C2440 DMA 驱动示例

发布者:温暖的拥抱最新更新时间:2024-07-23 来源: cnblogs关键字:S3C2440  DMA 手机看文章 扫描二维码
随时随地手机看文章

将 DMA 抽象为一个字符设备,在初始化函数中调用


void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)

函数来分配两段物理地址连续的空间,一段作为源空间,一段作为目的空间。


然后将物理地址进行 ioremap 供驱动使用,最后调用 register_chrdev 来注册这个字符设备。


DMA 的 regs:

#define DMA0_BASE_ADDR  0x4B000000

#define DMA1_BASE_ADDR  0x4B000040

#define DMA2_BASE_ADDR  0x4B000080

#define DMA3_BASE_ADDR  0x4B0000C0


struct s3c_dma_regs {

unsigned long disrc;

unsigned long disrcc;

unsigned long didst;

unsigned long didstc;

unsigned long dcon;

unsigned long dstat;

unsigned long dcsrc;

unsigned long dcdst;

unsigned long dmasktrig;

};

配置 DMA(通过 ioctl 调用)

    ev_dma = 0;


    /* 把源,目的,长度告诉 DMA */

    dma_regs->disrc      = src_phys;            /* 源的物理地址 */

    dma_regs->disrcc     = (0<<1) | (0<<0);     /* 源位于 AHB 总线, 源地址递增 */

    dma_regs->didst      = dst_phys;            /* 目的的物理地址 */

    dma_regs->didstc     = (0<<2) | (0<<1) | (0<<0);     /* 目的位于 AHB 总线, 目的地址递增 */

    dma_regs->dcon       = (1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(0<<20)|(BUF_SIZE<<0);  /* 使能中断,单个传输,软件触发, */

    

    /* 启动 DMA */

    dma_regs->dmasktrig  = (1<<1) | (1<<0);

    

    /* 如何知道 DMA 什么时候完成 ? */

    /* 休眠 */

    wait_event_interruptible(dma_waitq, ev_dma);

    

    if (memcmp(src, dst, BUF_SIZE) == 0)

    {

    printk('MEM_CPY_DMA OKn');

    }

    else

    {

    printk('MEM_CPY_DMA ERRORn');

    }

当 DMA 开始工作时会休眠一段时间,直到复制完成后触发中断来唤醒。


static irqreturn_t s3c_dma_irq(int irq, void *devid)

{

/* 唤醒 */

ev_dma = 1;

    wake_up_interruptible(&dma_waitq);   /* 唤醒休眠的进程 */

return IRQ_HANDLED;

}

可能这样的实验并不会看出 DMA 的作用,我们可以与普通的复制做一下速度上的对比。例如用 memcpy 来与 DMA PK 一下速度就能看出效果来。


关键字:S3C2440  DMA 引用地址:S3C2440 DMA 驱动示例

上一篇:S3C2440时钟体系
下一篇:s3c2440的IIS的控制模块

推荐阅读最新更新时间:2026-03-22 10:21

S3C2440 DMA工作原理
这里具体DMA CONTROL寄存器(DCON)的配置说明,进而引出DMA的各种工作方式。 Atomic transfer:指的是DMA的单次原子操作,它可以是Unit模式(传输1个data size),也可以是burst模式(传输4个data size),具体对应DCON 。 Data Size:指的是单次原子操作的数据位宽,8、16、32,具体对应DCON 。 Request Source:DMA请求的来源有两种,软件&硬件模块,由DCON 控制;当为前者时,由软件对DMASKTRIG寄存器的位0置位触发一次DMA 操作。当为后者时,具体来源由DCON 控制,不同硬件模块的某时间触发一次DMA操作,具体要见不同的硬件模
[单片机]
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.数据走得什么总线
[单片机]
S3C2440 DMA驱动程序编写及测试(三十二)
DMA(Direct Memory Access) 即直接存储访问,DMA传输方式无需CPU直接控制传输,通过硬件为RAM、I/O设备开辟一条直接传输数据的通路,能使CPU的效率大为提高。 学了这么多驱动,不难退出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops - 2.1)file_operations里设置DMA硬件相关操作,来启动DMA 由于我们是用字符设备的测试方式测试的,而本例子只是用两个地址之间的拷贝来演示DMA的作用,所以采用字符设备方式编写 1、驱动编写之前,先来讲如何分配释放缓冲区、DMA相关寄存器、使用DMA中断 1.1 在linux中,分配释
[单片机]
<font color='red'>S3C2440</font> <font color='red'>DMA</font><font color='red'>驱动</font>程序编写及测试(三十二)
代码示例_Input 按键驱动
button_drv.c 1 #include linux/module.h 2 #include linux/init.h 3 #include linux/input.h 4 #include linux/gpio.h 5 #include linux/interrupt.h 6 7 8 static int irqno; 9 static struct input_dev *key_inputdev; 10 11 12 irqreturn_t input_key_irq_svc(int irqno, void *dev_id) 13 { 14 //区分是按下还是抬起 15
[单片机]
几种驱动蜂鸣器的编程示例
以下介绍几种在S3F9454/9444下驱动蜂鸣器的编程示例,供参考 A.第一种,普通IO高低 电平 驱动法 ;运行环境: S3F9454,Fosc= 3.2M Hz 无 分频 iframe id="iframeu2163852_0" src="http://pos.baidu.com/vctm?conwid=250&conhei=250&rdid=2163852&dc=3&di=u2163852&dri=0&dis=0&dai=3&ps=784x824&enu=encoding&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&t
[单片机]
AVR单片机驱动NOKIA3310的示例程序
#include mega48.h #include delay.h #include nokia3310.h void main(void) { PORTB&=209; DDRB|=46; //设置单片机的4个LCD引脚输出0 while(1) { lcd_init(); //lcd初始化 lcd_cls(); //清屏,光标回位 lcd_gotoxy(16,2); //光标定位到第16列,第1行(最上面是0行)
[单片机]
uboot在s3c2440上的移植(4)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。 7)u-boot对CS8900或者DM9000X网卡的支持。 u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/ne
[单片机]
uboot在<font color='red'>s3c2440</font>上的移植(4)
S3C2440时钟体系笔记
一、整体架构  S3C2440的主时钟源可以是外部谐振器(XTIpll),或者外部输入时钟(EXTCLK),经过锁相环MPLL、UPLL产生高频时钟信号,并经由分配传输给AHB总线,APB总线,USB设备,以及内核使用。其中UPLL是USB专用的PLL。以下是时钟体系的总体框架: 二、控制逻辑 时钟控制逻辑的主要内容为时钟的开启、配置过程。首先是时钟的上电开启时序: 上图来自于芯片手册,是时钟的上电开启过程,经上电与复位,谐振器开始输入信号,此时PLL根据默认配置启动,进入LockTime,由于上电后PLL工作不稳定,其输出信号并不会接入FCLK等,而是接入谐振器输入频率信号,只有在软件配置PLL后才会接入到FCLK等,即使
[单片机]
<font color='red'>S3C2440</font>时钟体系笔记
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved