关键点,查找文档,找出DMA要用到的寄存器,然后通过struct结构体描述这些寄存器,再通过ioremap映射地址,配置寄存器,
申请中断。
参考的文档S3C2440.pdf
S3C2440A SPECIAL REGISTERS
下面的内容是从文档的第一章中找到的,对应的代码如下
DMA章节
因此初始化:(根据寄存器的描述,配置相关寄存器,仔细看还比较简单,关键是理解文档的意思)
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);
寄存器配置
可以参考下面的写法
代码
顺势定义 : static volatile struct s3c_dma_regs *dma_regs;
相关的操作,物理地址映射:
define DMA0_BASE_ADDR 0x4B000000
define DMA1_BASE_ADDR 0x4B000040
define DMA2_BASE_ADDR 0x4B000080
define DMA3_BASE_ADDR 0x4B0000C0
dma_regs = ==ioremap==(DMA3_BASE_ADDR, sizeof(struct s3c_dma_regs));
中断处理
IRQ_DMA3 是应该linux系统中定义的
查看中断的使用情况
request_irq(IRQ_DMA3, s3c_dma_irq, 0, "s3c_dma", 1)
注册成功