IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]直接内存访问(DMA)初探

    lincyang发表于 2013-12-12 14:55:18
    love 0

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



沪ICP备19023445号-2号
友情链接