详解linux dma驱动编写

  

linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。

  

1, dma驱动在什么地方

        司机/dma      

2,如何看s3c的dma驱动,先看Kconfig

        配置S3C24XX_DMAC   bool“三星S3C24XX DMA支持”   取决于>   obj - $ (CONFIG_S3C24XX_DMAC) +=s3c24xx-dma。o      

4,确认驱动文件为s3c24xx-dma.c,了解基本结构

        静态结构platform_driver s3c24xx_dma_driver={   .driver={   . name=" s3c24xx-dma ",   },   .id_table=s3c24xx_dma_driver_ids,   .probe=s3c24xx_dma_probe,   .remove=s3c24xx_dma_remove,   };      module_platform_driver (s3c24xx_dma_driver);   之前      

5,驱动为基本的平台司机,接着就可以了解调查函数了

     /*初始化*/memcpy引擎   dma_cap_set (DMA_MEMCPY s3cdma→memcpy.cap_mask);   dma_cap_set (DMA_PRIVATE s3cdma→memcpy.cap_mask);   s3cdma→memcpy.dev=, pdev→开发;   s3cdma→memcpy.device_free_chan_resources=s3c24xx_dma_free_chan_resources;   s3cdma→memcpy.device_prep_dma_memcpy=s3c24xx_dma_prep_memcpy;   s3cdma→memcpy.device_tx_status=s3c24xx_dma_tx_status;   s3cdma→memcpy.device_issue_pending=s3c24xx_dma_issue_pending;   s3cdma→memcpy.device_config=s3c24xx_dma_set_runtime_config;   s3cdma→memcpy.device_terminate_all=s3c24xx_dma_terminate_all;   s3cdma→memcpy.device_synchronize=s3c24xx_dma_synchronize;/*初始化奴隶引擎SoC内部专用外设*/dma_cap_set (DMA_SLAVE s3cdma→slave.cap_mask);   dma_cap_set (DMA_CYCLIC s3cdma→slave.cap_mask);   dma_cap_set (DMA_PRIVATE s3cdma→slave.cap_mask);   s3cdma→slave.dev=, pdev→开发;   s3cdma→slave.device_free_chan_resources=s3c24xx_dma_free_chan_resources;   s3cdma→slave.device_tx_status=s3c24xx_dma_tx_status;   s3cdma→slave.device_issue_pending=s3c24xx_dma_issue_pending;   s3cdma→slave.device_prep_slave_sg=s3c24xx_dma_prep_slave_sg;   s3cdma→slave.device_prep_dma_cyclic=s3c24xx_dma_prep_dma_cyclic;   s3cdma→slave.device_config=s3c24xx_dma_set_runtime_config;   s3cdma→slave.device_terminate_all=s3c24xx_dma_terminate_all;   s3cdma→slave.device_synchronize=s3c24xx_dma_synchronize;   s3cdma→slave.filter。地图=pdata→slave_map;   s3cdma→slave.filter。mapcnt=pdata→slavecnt;   s3cdma→slave.filter。fn=s3c24xx_dma_filter;   之前      

6,通过代码获悉,s3cdma有主人和奴隶两个引擎,且部分接口共享。

  

只要完成dma接口的适配,dma就可以正常使用了。当然,前提是,两个引擎要进行注册使用。

        ret=dma_async_device_register(及s3cdma→memcpy);   如果(ret) {   dev_warn(及pdev→dev,   “% s未能注册memcpy作为异步设备- % d \ n”,   __func__ ret);   goto err_memcpy_reg;   }      ret=dma_async_device_register(及s3cdma→奴隶);   如果(ret) {   dev_warn(及pdev→dev,   “% s未能注册奴隶作为异步设备- % d \ n”,   __func__ ret);   goto err_slave_reg;   }   之前      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

详解linux dma驱动编写