yd2763132的个人空间 https://www.eechina.com/space-uid-36266.html [收藏] [复制] [分享] [RSS]

博客

2410 DMA初始化代码导读笔记(1)

已有 1030 次阅读2011-5-12 20:02 |个人分类:linux|

鉴于DMA的重要性花了2天时间读了一下初始化代码,做一下相关笔记。
首先有一些重要的数据结构如下:
typedef enum {
?S3C2410_DMA_IDLE, //器件空闲
?S3C2410_DMA_RUNNING,//器件运行
?S3C2410_DMA_PAUSED //器件暂停
} s3c2410_dma_state_t;//描述DMA器件状态
??
typedef enum {
?S3C2410_DMALOAD_NONE //没有缓存被负载
?S3C2410_DMALOAD_1LOADED,//有缓存,但没有被批准使用
?S3C2410_DMALOAD_1RUNNING,//缓存被批准运行,且没有完成
?S3C2410_DMALOAD_1LOADED_1RUNNING,//当前缓冲运行完后再加载其他缓存
} s3c2410_dma_loadst_t; //用于描述缓存资源状态
??
typedef enum {
S3C2410_RES_OK, //正常
S3C2410_RES_ERR, //错误
S3C2410_RES_ABORT //中止
} s3c2410_dma_buffresult_t;//用于描述操作结果
??
enum s3c2410_chan_op_e {//控制dma的操作命令
S3C2410_DMAOP_START, //启动DMA
S3C2410_DMAOP_STOP, //停止
S3C2410_DMAOP_PAUSE, //暂停
S3C2410_DMAOP_RESUME, //恢复
S3C2410_DMAOP_FLUSH, //刷新
S3C2410_DMAOP_TIMEOUT,//超时处理内部信号
};??
??
struct s3c2410_dma_buf_s {//缓存资源描述结构数组
s3c2410_dma_buf_t *next; //下一个缓存
int magic; /* magic */
int size; //缓存大小
dma_addr_t data; //起始地址值
dma_addr_t ptr; //当前地址值
void *id; //客户端id
};??
??
缓存传送完成后回调函数
typedef void (*s3c2410_dma_cbfn_t)(s3c2410_dma_chan_t *, void *buf, int size,
s3c2410_dma_buffresult_t result);?
通道工作完成后回调函数
typedef int (*s3c2410_dma_opfn_t)(s3c2410_dma_chan_t *,s3c2410_chan_op_t );??
??
struct s3c2410_dma_stats_s {//缓存加载统计结构体
unsigned long loads; //加载次数
unsigned long timeout_longest; //最大加载次数
unsigned long timeout_shortest;//最短加载次数
unsigned long timeout_avg; //等待累积次数
unsigned long timeout_failed; //失败次数
};??
??
DMA通道描述结构体,4个通道结构体存放在全局数组s3c2410_chans[S3C2410_DMA_CHANNELS]中:
struct s3c2410_dma_chan_s {
unsigned char number; //通道数
unsigned char in_use; //通道已使用标志
unsigned char irq_claimed; //中断声明
unsigned char irq_enabled; //中断使能
unsigned char xfer_unit; //一次传送大小(1或4字节)
s3c2410_dma_state_t state; //dma器件工作状态空闲 运行 暂停
s3c2410_dma_loadst_t load_state; //用于描述缓存加载状态
s3c2410_dma_client_t *client; //该通道上的某客户端
/* channel configuration */
s3c2410_dmasrc_t source; //操作设备类型描述
unsigned long dev_addr; //操作设备物理地址
unsigned long load_timeout; //装载益处时间
unsigned int flags; //标志自动启动或是慢速启动
/* channel's hardware position and configuration */
void __iomem *regs; //通道初始源地址寄存器
void __iomem *addr_reg; //通道初始目的地地址寄存器
unsigned int irq; //通道中断号
unsigned long dcon; //DCON默认值
/* driver handles */
s3c2410_dma_cbfn_t callback_fn; //缓存数据完成后回调函数
s3c2410_dma_opfn_t op_fn; //通道完成后回调函数
/* stats gathering */
s3c2410_dma_stats_t *stats; //指向stats_store成员指针用于描述加载信息
s3c2410_dma_stats_t stats_store;
/* buffer list and information */
s3c2410_dma_buf_t *curr; //目前缓存链表指针
s3c2410_dma_buf_t *next; //下一个待处理链表指针
s3c2410_dma_buf_t *end; //结束处缓存指针
/* system device */
struct sys_device dev; //dma是作为class目录中设备来使用的
};??
??
在使用DMA时可以调用配置DMA的函数如下:??
int s3c2410_dma_enqueue(dmach_t channel,s3c2410_dma_client_t *, void *dev);??
id 器件驱动的ID信息
data 希望传送数据的物理地址
size 希望传送数据的尺寸大小
此函数用来为传送地址建立一个缓存结构(struct s3c2410_dma_buf_s)。??
??
int s3c2410_dma_request(unsigned int channel, s3c2410_dma_client_t *client,void *dev)??
即将某DMA通道上支持的期间作为客户端配置为其添加中断处理功能。??
??
int s3c2410_dma_free(dmach_t channel, s3c2410_dma_client_t *client)
停止DMA后释放客户端占用的中断资源。
??
int s3c2410_dma_ctrl(dmach_t channel, s3c2410_chan_op_t op)
控制DMA函数有如下一些命令:??
?S3C2410_DMAOP_START://启动DMA?
?S3C2410_DMAOP_STOP://停止DMA
?S3C2410_DMAOP_PAUSE://暂停?
?S3C2410_DMAOP_RESUME://恢复?
?S3C2410_DMAOP_TIMEOUT://超时处理内部信号?
?S3C2410_DMAOP_FLUSH://停止DMA且释放通道上的传送缓存?
??
int s3c2410_dma_config(dmach_t channel,int xferunit,int dcon)??
??xfersize:传送单元大小(1,2,4)字节
dcon: DCONx的基础配置值
配置传送尺寸 使能中断和硬件触发DMA功能
??
int s3c2410_dma_setflags(dmach_t channel, unsigned int flags)??
?设置标志位?
??
int s3c2410_dma_set_opfn(dmach_t channel, s3c2410_dma_opfn_t rtn)??
?设置通道完成后回调函数?
??
int s3c2410_dma_set_buffdone_fn(dmach_t channel, s3c2410_dma_cbfn_t rtn)??
?设置缓存数据完成后回调函数?
??
int s3c2410_dma_devconfig(int channel,s3c2410_dmasrc_t source,int hwcfg,
unsigned long devaddr)??
设置外设种类 配置值 外设物理首地址??
??
int s3c2410_dma_getposition(dmach_t channel, dma_addr_t *src, dma_addr_t *dst)??
?获取当前传送指针的源地址和目的地地址
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yd4330152763132/archive/2010/02/01/5275750.aspx
1

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 liyunbing84 2011-5-12 23:12

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部