2440的DMA驱动

1.kmalloc 分配的虚拟地址连续,物理地址一定连续2.想用DMA必须分配连续的内存3. kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。定义源src 目的dst 源物理地址src_phys 目的物理地址dst_phys 大小定义宏4.在驱动的入口函数分配缓冲区(注意不能用vmalloc分配出来物理地址不一定连续)第一个源表示在系统总线上还是外
摘要由CSDN通过智能技术生成

1.kmalloc 分配的虚拟地址连续,物理地址一定连续
2.想用DMA必须分配连续的内存
3. kmalloc特殊之处在于它分配的内存是物理上连续的,这对于要进行DMA的设备十分重要. 而用vmalloc分配的内存只是线性地址连续,物理地址不一定连续,不能直接用于DMA。

定义源src  目的dst   源物理地址src_phys  目的物理地址dst_phys 大小定义宏

在这里插入图片描述

4.在驱动的入口函数分配缓冲区(注意不能用vmalloc分配出来物理地址不一定连续

在这里插入图片描述

在这里插入图片描述

第一个源表示在系统总线上还是外设总线上
第二个源地址是递增的还是固定的

在这里插入图片描述
目的地在内存上还是外设上

6.操作寄存器
在这里插入图片描述
创建结构体封装寄存器unsigned long型
DMA0和DMA1,DMA2寄存器地址然后定义变量static volatile struct s3c_dma_regs *dma_regs;

然后再去映射物理地址ioremap。
在这里插入图片描述

2.具体步骤
把源,目的,长度告诉DMA
源地址操作寄存器(注意是物理地址)
在这里插入图片描述
第一位控制源地址在内存还是在外设,如下图。
在这里插入图片描述
目的地址的物理地址
在这里插入图片描述
目的寄存器操作
在这里插入图片描述在这里插入图片描述

DMA控制寄存器

(1)DMA模式
(2)同步 外设发给单片机请求DMA,答应给我一个DMArequst给我一个回应信号ACK
(3)中断
(4)使能中断知道他已经传输完成。
在这里插入图片描述
在这里插入图片描述

第二个模式会一直站住总线知道DMA传输完
在这里插入图片描述

23位设为0用软件触发的
在这里插入图片描述

数据传输大小一个字节,
在这里插入图片描述

还有TSZ和DSZ
DSZ:读写数据的大小 传输一次一字节还是4字节
TSZ:单次传输R/W一次 burst传输R/W四次
TC: 传输多少次
总长度=TCTSZDSZ。

dma_regs->dcon = (1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<23)|(0<<20)|(BUF_SIZE<<0);  

/* 使能中断,单个传输,软件触发, */

启动DMA
如何意识到已经传输完成?
(1)完成会产生中断,所以我们先requst_irq

if (request_irq(IRQ_DMA3, s3c_dma_irq, 0, "s3c_dma", 1))
	{
   
		printk("can't request_irq for DMA\n");
		return -EBUSY;
	}
tatic irqreturn_t s3c_dma_irq(int irq, void *devid)
{
   
	/* 唤醒 */
	ev_dma = 1; /* 中断事件标志复位 */
    wake_up_interruptible(&dma_waitq);   /* 唤醒休眠的进程 */
	return IRQ_HANDLED;
}

在启动DMA后休眠在中断后唤醒

static DECLARE_WAIT_QUEUE_HEAD(dma_waitq);  /* 定义队列 */
wait_event_interruptible(dma_waitq, ev_dma);  /* 需要定义中断事件标志来判断条件是否满足 */
static volatile int ev_dma = 0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴凯你在想啥呢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值