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的控制模块

推荐阅读最新更新时间:2024-11-11 18:09

STM32_DMA 标准初始化设置解释
DMA 全称是:Direct Memory Access;根据 ST 公司提供的相关信息,DMA是STM32中一个独立于 Cortex-M3 内核的模块,有点类似于 ADC、PWM、TIMER 等模块;主要功能是起通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速访问各寄存器,其传输不受 CPU 的支配,传输还是双向的;例如,从“表面”上看,它可以将 flash 中的数据与储存器中变量建立通讯,还可以将某一个外设的寄存器或缓冲器与另一个外设的寄存器或缓冲器建立双向通讯,有点像把外设硬件之间用“导线”连接在一起了。其间的通讯不占 CPU 资源,访问速度快,对于实时性强的应用将是一个很好的选择。下面代码是一个标
[单片机]
s3c2440裸机-I2c编程-2.i2c控制器
1.I2c主控与从设备关系 对于写操作,主控作为transmitter,从设备作为receiver 对于读操作,主控作为receiver, 从设备作为transmitter 2.I2c控制器 2.1总框图 Pclk = 50Mhz, 经过prescaler分频,可以得到SCL。 IICSTAT:发出S(start)信号或者P(stop)信号。 Data Bus可以把数据写入IICDS寄存器,然后会自动产生SCL,并且会将8位数据从SDA同步给slave dev, 在数据发送出去后,在第9个SCL时钟,会受到slave dev的ack应答,可以通过查询IICSTAT来判断是否有ACK回应。 当slave dev回应ACK后,
[单片机]
<font color='red'>s3c2440</font>裸机-I2c编程-2.i2c控制器
十、S3C2440 开发资源
10.1 S3C2440 内部资源 1.2V 内核供电, 1.8V/2.5V/3.3V 储存器供电, 3.3V 外部 I/O 供电,具备 16KB 的指令缓存和 16KB 的数据缓存和 MMU 的微处理器 外部存储控制器(SDRAM 控制和片选逻辑) LCD 控制器(最大支持 4K 色 STN 和 256K 色 TFT)提供 1 通道 LCD 专用 DMA 4 通道 DMA 并有外部请求引脚 3 通道 UART(IrDA1.0, 64 字节发送 FIFO 和 64 字节接收 FIFO) 2 通道 SPI 1 通道 IIC 总线接口(支持多主机) 1 通道 IIS 总线音频编码器接口 AC’97 编解码器接口
[单片机]
十、<font color='red'>S3C2440</font> 开发资源
STM32——多通道ADC的DMA方式采集方法
前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法。 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 多通道ADC的配置 #define Channel_Num 9 //ADC的通道数,本例使用9个通道 #define Sample_Num 10 //采样次数,本例使用平均滤波,采样10次取均值 u16 ADC_ConvertedValue ;//ADC采集数据的缓存 uint16_t ADC_Value ={0};//9个ADC通道的采样值 下面为ADC及DMA的详细配置函数。 void ADC_DMA
[单片机]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
Linux系统:Ubuntu9.10 交叉编译器:arm-linux-gcc-4.3.2(已安装) Qt:qt-x11-opensource-src-4.5.3.tar.gz qt-embedded-linux-opensource-src-4.5.3.tar.gz 1、安装Qt Qt下载地址:https://www.qt.io/download-open-source/ 这里下载的安装包为:qt-embedded-linux-opensource-src-4.5.3.tar.gz(大小123MB) 2、安装Qt-x11 将qt-x11-opensource-src-4.5.3.tar.gz包放到U
[单片机]
OpenCV2.0.0移植到ARM9(五)(JZ2440----S3c2440)
一文了解stm32使用DMA模块的相关操作
DMA(Direct Memory Access)常译为“存储器直接存取”。早在Intel的8086平台上就有了DMA应用了。 一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。这样的数据搬运工作将使CPU的负荷显得相当繁重。 严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU还需要负责复杂的中断申
[单片机]
一文了解stm32使用<font color='red'>DMA</font>模块的相关操作
06-S3C2440学习之移植2012u-boot到S3C2440(移植过程二)支持NAND启动
说明: 原来的代码在链接时加了 -pie 选项, 使得u-boot.bin里多了 *(.rel*) , *(.dynsym) (*(.rel*) , *(.dynsym)这些地址信息用于实现UBOOT可以被拷贝到任何地方,更新地址信息),但使得程序非常大,结构复杂,不利于从NAND启动(重定位之前的启动代码应该少于4K)。所提去掉了pie功能。 (1)使用一下之前写的init.c 拷贝到2440单板下: 修改init内容为: /* NAND FLASH控制器 */ #define NFCONF (*((volatile unsigned long *)0x4E000000)) #define
[单片机]
06-S3C2440学习之移植2012u-boot到<font color='red'>S3C2440</font>(移植过程二)支持NAND启动
s3c6410 s3c2440串口发送接收数据的实现(轮询)及相关寄存器
1 6410与串口相关寄存器 一 需要设置的寄存器(其实进入uboot后,串口已经设置好了,直接发送数据就行了,) 1)模式 UCON (轮询,中断,DMA等) 2)相关参数 ULCON0 定义了串口数据的帧格式,数据位长度,奇偶校验位,停止位(8-N-1) BRDIV 定义了波特率的计算公式所得结果的整数部分 UDIVSLOT0 定义了波特率的计算公式所得结果的小数部分 3)高级选项(串口的发送接收缓冲的大小(fifo)默认是1B,可改成64B 二 发送接收数据 相关的寄存器 UTXH0 UART channel 0 transmit buffer register URXH0 UART chan
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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