千家信息网

详解linux dma驱动编写

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见。dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。1、d
千家信息网最后更新 2026年11月02日详解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; } 

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

驱动 两个 就是 接口 帮助 少见 重要 事情 内容 函数 前提 功能 地方 好处 情形 效率 数据 文件 时候 时间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 互联网科技公司税收优惠 美国互联网科技巨头监管 互联网下的科技发展 互联网金融 科技 喔噻互联网科技 奇酷互联网科技公司 碳银互联网科技有限公司 互联网 科技服务平台 互联网科技类展会 甘肃拓世互联网科技有限公司 爱医互联网络科技 无锡工业互联网科技有限公司 银行科技岗属于互联网吗 广东工业互联网大赛深圳学泰科技 宁波跨境商互联网科技有限公司 云鲸互联网络科技有限公司 陕西九四连强互联网科技有限公司 10位科技互联网大佬 知域互联网科技有限公司官网 互联网科技有限公司经营范围 金融科技与互联网金融 互联网科技英文翻译 未来五年的互联网科技 广州新华互联网科技学校电竞方面 科技赋能视角下互联网保险发展 互联网科技包装股 科技互联网行业投资研究 北京军民互联网科技公司 互联网科技大佬云集
0