1.DMA简介
DMA(Direct Memory Access),直译为直接内存访问,是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。
使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。
例如,LCD控制器拥有一个专用的DMA,支持从系统存储器的视频缓冲中读取映像数据。
2.DMA工作过程
DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发的执行其他任务。当DMA结束后,DMAC通过中断通知CPU数据传输已经结束,由CPU执行相应的中断服务程序进行后续处理。
工作过程图如下:
1)外设向DMAC发出请求
2)DMAC通过HOLD向CPU发出总线请求
3)CPU响应释放三总线,并且发应答HLDA
4)DMAC向外设发DMA应答
5)DMAC发出地址、控制信号,为外设传送数据
最后,传送完规定的数据后,DMAC撤销HOLD信号,CPU也撤销HLDA信号,恢复对三总线的控制
3.Linux下的DMA编程
代码路径:
arch/arm/include/asm/mach/dma.h
arch/arm/kernel/dma.c
头文件中非常重要的DMA结构体
struct dma_struct {
void *addr; /* single DMA address */
unsigned long count; /* single DMA size */
struct scatterlist buf; /* single DMA */
int sgcount; /* number of DMA SG */
struct scatterlist *sg; /* DMA Scatter-Gather List */
unsigned int active:1; /* Transfer active */
unsigned int invalid:1; /* Address/Count changed */
unsigned int dma_mode; /* DMA mode */
int speed; /* DMA speed */
unsigned int lock; /* Device is allocated */
const char *device_id; /* Device name */
const struct dma_ops *d_ops;
};
设备驱动中DMA相关代码的流程:
基于S3C2440处理器的开发板相对应的Linux DMA代码路径:
./arch/arm/mach-s3c24xx/include/mach/dma.h
./arch/arm/mach-s3c24xx/dma.c
参考文献:
1.Linux设备驱动开发详解(第2版) 宋宝华
2.ARM9原理与应用设计 三恒星科技