详解linux dma驱动编写

 更新时间:2018年04月11日 10:09:41   作者:feixiaoxing  
这篇文章主要介绍了详解linux dma驱动编写,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

1、dma驱动在什么地方

drivers/dma 

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

config S3C24XX_DMAC 
  bool "Samsung S3C24XX DMA support" 
  depends on ARCH_S3C24XX || COMPILE_TEST 
  select DMA_ENGINE 
  select DMA_VIRTUAL_CHANNELS 
  help 
   Support for the Samsung S3C24XX DMA controller driver. The 
   DMA controller is having multiple DMA channels which can be 
   configured for different peripherals like audio, UART, SPI. 
   The DMA controller can transfer data from memory to peripheral, 
   periphal to memory, periphal to periphal and memory to memory. 

3、发现s3c只依赖于S3C24XX_DMAC,这样可以接着看Makefile

obj-$(CONFIG_S3C24XX_DMAC) += s3c24xx-dma.o 

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

static struct 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、驱动为基本的platform driver,接着就可以了解probe函数了

/* Initialize memcpy engine */ 
dma_cap_set(DMA_MEMCPY, s3cdma->memcpy.cap_mask); 
dma_cap_set(DMA_PRIVATE, s3cdma->memcpy.cap_mask); 
s3cdma->memcpy.dev = &pdev->dev; 
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; 
 
/* Initialize slave engine for SoC internal dedicated peripherals */ 
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->dev; 
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.map = pdata->slave_map; 
s3cdma->slave.filter.mapcnt = pdata->slavecnt; 
s3cdma->slave.filter.fn = s3c24xx_dma_filter; 

6、通过code获悉,s3cdma有master和slave两个engine,且部分接口共享。

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

ret = dma_async_device_register(&s3cdma->memcpy); 
if (ret) { 
  dev_warn(&pdev->dev, 
    "%s failed to register memcpy as an async device - %d\n", 
    __func__, ret); 
  goto err_memcpy_reg; 
} 
 
ret = dma_async_device_register(&s3cdma->slave); 
if (ret) { 
  dev_warn(&pdev->dev, 
    "%s failed to register slave as an async device - %d\n", 
    __func__, ret); 
  goto err_slave_reg; 
} 

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

相关文章

  • APACHE 配置文件中文版 httpd.conf FOR Apache 2.2.13

    APACHE 配置文件中文版 httpd.conf FOR Apache 2.2.13

    APACHE配置文件中文版 httpd.conf FOR Apache 2.2.13 ,综合网上2.0版本的翻译,加入自己的理解,补充完善。
    2009-11-11
  • Deepin下安装神器Pyenv的步骤记录

    Deepin下安装神器Pyenv的步骤记录

    这篇文章主要给大家介绍了关于Deepin下安装神器Pyenv的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Deepin具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • CentOS7服务器中apache、php7以及mysql5.7的安装配置代码

    CentOS7服务器中apache、php7以及mysql5.7的安装配置代码

    这篇文章主要介绍了CentOS7服务器中apache、php7以及mysql5.7的安装配置代码,需要的朋友可以参考下
    2017-10-10
  • Linux 环境变量详解及实例

    Linux 环境变量详解及实例

    这篇文章主要介绍了Linux 环境变量详解及实例的相关资料,需要的朋友可以参考下
    2017-02-02
  • Linux文件系统之缓冲区详解

    Linux文件系统之缓冲区详解

    在 Linux 中,缓冲区通常指的是用于临时存储数据的内存区域,它可以用来提高系统性能,Linux 中有多种类型的缓冲区,包括文件系统缓冲区、网络缓冲区等,本文给大家详细介绍了Linux文件系统之缓冲区,感兴趣的朋友可以参考下
    2024-02-02
  • SecureCRT中文显示乱码问题的解决方法

    SecureCRT中文显示乱码问题的解决方法

    这篇文章主要介绍了SecureCRT中文显示乱码问题的解决方法,需要的朋友可以参考下
    2016-07-07
  • linux下查看yum/rpm/dpkg某软件是否已安装的方法

    linux下查看yum/rpm/dpkg某软件是否已安装的方法

    这篇文章主要介绍了在linux下查看yum/rpm/dpkg某软件是否已安装的方法,文中给出了详细的示例代码,对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • ubuntu下编译安装opencv的方法

    ubuntu下编译安装opencv的方法

    今天小编就为大家分享一篇关于ubuntu下编译安装opencv的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 使用Apache搭建http服务器实现CGI功能

    使用Apache搭建http服务器实现CGI功能

    专门处理 HTTP 请求的服务器,也被称为 Web 服务器, 常用的 Web 服务器有 Apache和 Nginx ,当然几大巨头五联网公司也都有其独自研发的 Web 服务器,比如阿里巴巴的Tengine, 这篇文章主要介绍了使用Apache搭建http服务器,实现CGI,需要的朋友可以参考下
    2024-07-07
  • Linux Windows下设置定时执行任务的方法

    Linux Windows下设置定时执行任务的方法

    这篇文章主要介绍了Linux、windows下 设置定时执行任务的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09

最新评论