直接内存访问(DMA)初探

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原理与应用设计 三恒星科技

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值