Linux设备驱动之DMA
作者:网络转载 发布时间:[ 2016/5/4 13:17:00 ] 推荐标签:操作系统 Linux
3)DMA设备数据结构
/* DMA device structre */
typedef struct {
dma_callback_t callback;//DMA操作完成后的回调函数,在中断处理例程中调用
u_long dst;//目的寄存器内容
u_long src;//源寄存器内容
u_long ctl;//此设备的控制寄存器内容
u_long dst_ctl;//目的控制寄存器内容
u_long src_ctl;//源控制寄存器内容
} dma_device_t;
4)DMA通道数据结构
/* DMA channel structure */
typedef struct {
dmach_t channel;//通道号:可为0,1,2,3
unsigned int in_use; /* Device is allocated 设备是否已*/
const char *device_id; /* Device name 设备名*/
dma_buf_t *head; /* where to insert buffers 该DMA通道缓冲区链表头*/
dma_buf_t *tail; /* where to remove buffers该DMA通道缓冲区链表尾*/
dma_buf_t *curr; /* buffer currently DMA'ed该DMA通道缓冲区链表中的当前缓冲区*/
unsigned long queue_count; /* number of buffers in the queue 链表中缓冲区个数*/
int active; /* 1 if DMA is actually processing data 该通道是否已经在使用*/
dma_regs_t *regs; /* points to appropriate DMA registers 该通道使用的DMA控制寄存器*/
int irq; /* IRQ used by the channel //通道申请的中断号*/
dma_device_t write; /* to write //执行读操作的DMA设备*/
dma_device_t read; /* to read 执行写操作的DMA设备*/
} s3c2410_dma_t;
DMA驱动主要函数功能分析:
写一个DMA驱动的主要工作包括:DMA通道申请、DMA中断申请、控制寄存器设置、挂入DMA等待队列、清除DMA中断、释放DMA通道.
int s3c2410_request_dma(const char *device_id, dmach_t channel,
dma_callback_t write_cb, dma_callback_t read_cb) (s3c2410_dma_queue_buffer);
函数描述:申请某通道的DMA资源,填充s3c2410_dma_t 数据结构的内容,申请DMA中断。
输入参数:device_id DMA 设备名;channel 通道号;
write_cb DMA写操作完成的回调函数;read_cb DMA读操作完成的回调函数
输出参数:若channel通道已使用,出错返回;否则,返回0
int s3c2410_dma_queue_buffer(dmach_t channel, void *buf_id,
dma_addr_t data, int size, int write) (s3c2410_dma_stop);
函数描述:这是DMA操作关键的函数,它完成了一系列动作:分配并初始化一个DMA内核缓冲区控制结构,并将它插入DMA等待队列,设置DMA控制寄存器内容,等待DMA操作触发
输入参数: channel 通道号;buf_id,缓冲区标识
dma_addr_t data DMA数据缓冲区起始物理地址;size DMA数据缓冲区大小;write 是写还是读操作
输出参数:操作成功,返回0;否则,返回错误号
int s3c2410_dma_stop(dmach_t channel)
函数描述:停止DMA操作。
int s3c2410_dma_flush_all(dmach_t channel)
函数描述:释放DMA通道所申请的所有内存资源
void s3c2410_free_dma(dmach_t channel)
函数描述:释放DMA通道
因为各函数功能强大,一个完整的DMA驱动程序中一般只需调用以上3个函数即可。可在驱动初始化中调用s3c2410_request_dma,开始DMA传输前调用s3c2410_dma_queue_buffer,释放驱动模块时调用s3c2410_free_dma。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Linux下开源的DDR压力测试工具曝Linux恶意软件:让树莓派设备挖掘数字货币linux系统中不同颜色的文件夹及根目录介绍软件测试工程师必知必会Linux命令Linux下DNS服务器配置如何成为不可替代的Linux运维工程师?详解Linux进程(作业)的查看和杀死Linux 日志定时轮询流程详解比特币勒索病毒不只Windows系统有,Linux版的来了Linux日志定时轮询流程详解Linux iommu和vfio概念空间解构Linux系统如何低于TCP洪水攻击Linux无损调整分区大小Linux下防火墙配置实例Linux使用Jexus托管Asp.Net Core应用程序Linux中引号的那些事

sales@spasvo.com