s3c2440的dma操作的一般步骤

发布者:幸福家园最新更新时间:2016-06-12 来源: eefocus关键字: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;
};
以uda1314的驱动为例,驱动中定义了两个s3c2410_dma_client
static struct s3c2410_dma_client s3c2410iis_dma_out= {
    .name = "I2SSDO",
};

static struct s3c2410_dma_client s3c2410iis_dma_in = {
    .name = "I2SSDI",
};


二:
s3c2410_dma_config(dmach_t channel,int xferunit,int dcon)
 

s3c2410_dma_config(dmach_t channel,int xferunit,int dcon)
根据xferunit以及dcon设置通道的控制寄存器DCONx
xferunit为每次传输的数据大小:0:byte 1:half word 2:word


三:

int s3c2410_dma_set_buffdone_fn(dmach_t channel, s3c2410_dma_cbfn_t rtn)

 

设置相应的dma通道完成一次dma传输后的回调函数,也即是s3c2410_dma_enqueue完成后会调用的函数
回调函数应具有一下格式:
typedef void (*s3c2410_dma_cbfn_t)(struct s3c2410_dma_chan *,
                                    void *buf, int size,
                                    enum s3c2410_dma_buffresult result);
buf可以传递一些有用的数据,在uda1314的驱动中,传递的是audio_buf_t结构体


四:
int s3c2410_dma_setflags(dmach_t channel, unsigned int flags)
 

在1314驱动中,
flags = S3C2410_DMAF_AUTOSTART;        
s3c2410_dma_setflags(channel, flags);


五:

int s3c2410_dma_devconfig(int channel,
             enum s3c2410_dmasrc source,
             int hwcfg,
             unsigned long devaddr)
 

参数意义:
 * 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

如果source为S3C2410_DMASRC_HW(外设), 配置它的S3C2410_DMA_DISRCC,S3C2410_DMA_DISRC,S3C2410_DMA_DIDSTC
如果source为S3C2410_DMASRC_MEM(内存),配置它的S3C2410_DMA_DISRCC,S3C2410_DMA_DIDST,S3C2410_DMA_DIDSTC
由此可见,地址方面,只配置涉及外设的地址
以uda1341的驱动为例,这几个值为
        source = S3C2410_DMASRC_MEM;
        hwcfg = 3;
        devaddr = 0x55000010;

 

六:
void *dma_alloc_coherent(struct device *dev,size_t size,dma_addr_t *dma_handle,int flag)

 

利用此函数,申请dmabuf,建立一致性映射
以uda1314的驱动为例,调应的实例为:
dmabuf = dma_alloc_coherent(NULL, dmasize, &dmaphys, GFP_KERNEL);(在audio_setup_buf函数中)
dmabuf为虚拟地址,dmaphys是总线地址,虚拟地址用来让驱动写buf用,dmaphys用来传给dma。
dma关心的是总线地址。
关于总线地址与物理地址的区别,这里有很好的说明http://hi.baidu.com/zengzhaonong/blog/item/eeb8003083276e9ba9018ee3.html,感谢儒雅,现摘录如下:
1) 物理地址是与CPU相关的。在CPU的地址信号线上产生的就是物理地址。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。
2) 总线地址,顾名思义,是与总线相关的,就是总线的地址线或在地址周期上产生的信号。外设使用的是总线地址。
3) 物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上,物理地址与PCI总线地址是相同的。在其他平台上,也许会有某种转换,通常是线性的转换。

比如:CPU需要访问物理地址是0xfa000的单元,那么在x86平台上,会产生一个PCI总线上对0xfa000地址的访问。这个单元或者是内存中,或者是某个卡上的存储单元,甚至可能这个地址上没有对应的存储器。而在另外一个平台上,或许在PCI总线上产生的访问是针对地址为0x1fa000的单元。
上述函数是建立一致性映射。使用dma_map_single函数可以建立一致性映射:
2.当只有一个缓冲区要被传输的时候,使用dma_map_single函数来映射它
dma_addr_t dma_map_single(struct device *dev,void *buffer,size_t size, enum dma_data_direction direction)
3.为page结构指针指向的缓冲区建立映射,单页流式映射:
dma_addr_t dma_map_page(struct device *dev,struct page *page ,unsigned long offset ,size_t size,enum dma_data_direction direction);
4.分散/聚集映射
int dma_map_sg(struct device *dev,struct scatterlist *sg,int nents,enum dma_alloc_coherent direction);
还不知道哪种情况下用流式映射,哪种用一致映射。对于s3c2440,其mmc驱动中用到了分散聚集(流式)映射,声卡驱动中又用到了一致映射。


七:
int s3c2410_dma_enqueue(unsigned int channel, void *id,
            dma_addr_t data, int size)
 

发起一次dma传输
 参数意义:
 * id         the device driver's id information for this buffer
 * data       the physical address of the buffer data
 * size       the size of the buffer in bytes
将dma_alloc_coherent中得到的dmaphys传递给s3c2410_dma_enqueue. s3c2410_dma_enqueue提交一次dma请求,当dma通道可用的时候通过s3c2410_dma_loadbuffer开始一次传输,传输完成后会产生irq中断。其dma的中断服务函数中会继续启动dma请求队列中的请求,传输剩下的数据。

关键字:s3c2440  dma操作 引用地址:s3c2440的dma操作的一般步骤

上一篇:ARM-linux s3c2440 之时钟分析
下一篇:如何用STM32的片内Flash存储中文字库

推荐阅读最新更新时间:2024-03-16 14:56

基于S3C2440的u-boot的移植
1 Bootloader及u-boot简介 Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader代码与CPU芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于Bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot 等,其中u-boot是当前比较流行,功能
[单片机]
S3C2440的Keil启动文件S3C2440.s添加中断配置
前言 本文主要描述如何在Keil自带的S3C2440.s文件中添加中断配置及中断地址映射,从而可以在中断产生时跳转到用户代码中的中断服务函数。目前在TQ2440开发板是实测可用。 工程源代码下载 本文所有代码都是截取代码,“…”代表其还有上下文。可根据代码中上下文的残缺部分找到该代码添加的位置。 一,添加中断相关寄存器地址符号映射 因为原始S3C2440.s文件中不含中断相关寄存器的地址,所以需要在开头添加: ... ; * RAM_INTVEC: when set the startup code copies exception vectors ; * from execution address to
[单片机]
基于S3C2440的测试系统数字稳压电源设计
0 引言 直流稳压电源是一种比较常见的电子设备,一直被广泛地应用在电子电路、实验教学、科学研究等诸多领域。近年来,嵌入式技术发展极为迅速,出现了以单片机、嵌入式ARM为核心的高集成度处理器,并在自动化、通信等领域得到了广泛应用。电源行业也开始采用内部集成资源丰富的嵌入式控制器来实现数字稳压电源的控制系统。数字稳压电源是用脉宽调制波(PWM)来控制MOS管等开关器件的开通和关闭,从而实现电压电流的稳定输出。数字稳压电源还具备自诊断功能,能实现过压过流保护、故障警告等。 相比之前的模拟电源,数字稳压电源大大减少了在模拟电源中常见的误差、老化、温度漂移、非线性不易补偿等诸多问题,提高了电源的灵活性和适应性。将SAMSUNG公司的嵌
[单片机]
基于<font color='red'>S3C2440</font>的测试系统数字稳压电源设计
s3c2440裸机-内存控制器(三-1、norflash编程之NorFlash原理)
1.flash种类与特性: flash一般分为nand flash和nor flash,各自特性如下表: - Nor NAND XIP(片上执行) yes no 性能(擦除) 非常慢(5s,块太大) 快(3ms) 性能(写) 慢 快 性能(读) 快 快 可靠性 高 一般(容易出现位反转) 可擦除次数 10000 ~ 100000 100000 ~ 1000000 接口 与ram类似,可直接访问任意地址 I/O接口(无地址线,必须串行访问,命令、地址、数据共用8位IO) 易用性 容易 复杂 主要用途 常用于保存代码和关键数据 用于保存数据 价格 高 低 容量 小 大 常用文件系统类型 jffs yaff
[单片机]
<font color='red'>s3c2440</font>裸机-内存控制器(三-1、norflash编程之NorFlash原理)
1.2__S3C2440时钟简介
S3C2440的时钟和电源管理模块由三个部分构成:时钟控制,USB控制和电源控制。 有两个锁相环,一个用来提供FCLK,HCLK和PCLK,另一个则用于USB时钟。其中,FCLK的最大频率达到400MHz,HCLK的最大频率达到136MHz,PCLK的最大频率达到68MHz。 这些时钟为CPU和外设的正常运行提供时钟信号,其中CPU使用的是FCLK,外设使用的是PCLK,还有一部分使用高速总线HCLK。 要想程序按计划运行,时钟的选择和设置至关重要,下图为S3C2440的时钟发生器块图。 首先,S3C2440的时钟源可以选择外部晶振或外部时钟信号,一般情况下我们都使用的是外部晶振。时钟源的选择是通过设置OM 来进行
[单片机]
1.2__S3C2440时钟简介
S3C2440 字符设备驱动程序之概念介绍(一)
一、 Uboot目的是启动内核。 内核目的是启动应用程序。 二、 应用程序:读写文件、点灯、获取按键 三、 1、框架: 应用 open,read,write C库 系统调用接口 sytem call interface 内核 VFS virtual file system sys_open,sys_read,sys_write 驱动 Led_open,led_read,led_write 2、简单的应用程序 int main() { int fd1,fd2; int val = 1; fd1=open(“/dev/led”, O_RDWR);
[单片机]
<font color='red'>S3C2440</font> 字符设备驱动程序之概念介绍(一)
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控制器
stm32 DMA数据搬运 操作寄存器+库函数
DMA(Direct Memory Access)常译为 存储器直接存取 。早在Intel的8086平台上就有了DMA应用了。 一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。。。这样的数据搬运工作将使CPU的负荷显得相当繁重。 严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CP
[单片机]
stm32 <font color='red'>DMA</font>数据搬运 <font color='red'>操作</font>寄存器+库函数
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved