详解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;

}

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

原文链接:https://blog.csdn.net/feixiaoxing/article/details/79873782

原创文章,作者:RWBYW,如若转载,请注明出处:http://www.wangzhanshi.com/n/6781.html

(0)
RWBYW的头像RWBYW
上一篇 2025年1月1日 16:24:09
下一篇 2025年1月1日 16:24:11

相关推荐

  • 记一次真实的zip密码破解

    事情的背景是这样的,最近在学习网络的时候遇到一个工具cain&abel,于是到网上去找。原作者的网站已经不运营了,所以只能找到一些网友提供的下载包。 相信很多同学也跟我一样…

    2025年1月1日
  • Linux部署msmtp+mutt发送邮件功能

    一、前言 首先,得明白发送一封邮件的流程,下面一段理论摘抄自廖雪峰的官网网站https://www.liaoxuefeng.com/article/0013738767489009…

    2025年1月1日
  • linux sort多字段排序实例解析

    本文研究的主要是linux sort多字段排序,具体介绍如下。 Linux多数发行版自带的sort程序,非常强大,在此只说多字段排序 sort 有个参数-k,可以指定字段,有比较复…

    Linux 2025年1月1日
  • 详解Linux 下开发微信小程序安装开发工具

    详解Linux 下开发微信小程序安装开发工具  1. ? git clone https://github.com/yuan1994/wechat_web_devtools 然后创…

    Linux 2025年1月1日
  • Linux 在Shell脚本中使用函数实例详解

    Linux 在Shell脚本中使用函数实例详解 Shell的函数 Shell程序也支持函数。函数能完成一特定的功能,可以重复调用这个函数。 函数格式如下: ? 函数名() {   …

    Linux 2025年1月1日
  • linux环境之kerberos服务安装方式

    kerberos服务安装-linux环境 由于需要调试kafka开启kerberos认证相关的环境,特此记录一下关于kerberos环境搭建的步骤。 安装时间同步服务 yum in…

    2024年12月17日
  • 在Linux上安装和使用Docker的方法

    容器现在风靡于 it 界 —— 这很好理解。容器是轻量级的,包含应用运行所需所有东西(代码、库、运行时环境、系统设置,以及依赖关系)的独立的包。每个容器都部署于它自己的 cpu、内…

    2025年1月1日
  • Linux上增加自定义脚本的展现量

    前言 在一台Linux机器上写好一个脚本以后,希望这个脚本让这台机器上其他用户使用,但是不可能会让别人记住这个脚本的路径,这个时候该怎么办呢? 原理 在回答上面的问题之前,我们首先…

    Linux 2025年1月1日
  • linux vps服务器常用服务iptables策略

    vps服务器裸奔在公网上,总感觉有点不安全,没办法总得整点措施来加固下服务器呀,安全第一。linux系统自带防火墙必须要好好利用起来,可是我有一年多没写过防火墙策略了,该忘的都忘了…

    Linux 2025年1月1日
  • ssh修改超时自动登出时间的方法

    前言 众所周知,当我们通过ssh远程登录到另一台服务器之后,如果长时间不做操作,那么会被服务器自动登出,并且会告诉你timed out waiting for input: aut…

    Linux 2025年1月1日

发表回复

登录后才能评论