详解linux dma驱动编写
作者:feixiaoxing 时间:2023-07-27 15:14:09
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
标签:linux,dma,驱动
0
投稿
猜你喜欢
沃尔玛网站开售健康护理产品 欲成美网购第一站
2009-10-14 09:28:00
在VMware上 安装 centos8的详细教程
2022-08-06 17:11:26
微软:“黑屏”反盗版 对正版用户是一种保护
2010-03-08 09:10:00
微软首次披露:Bing的命名取自百岁老人
2009-10-14 09:26:00
名博怎样练成 析月光博客成功的六个原因
2008-12-01 15:59:00
帝国网站管理系统ECMS 6.6测试版本开源发布
2011-03-08 13:39:00
淘宝网首次开放外网淘宝会员免注册登录机制
2009-10-30 15:09:00
防止黑客用TTL值鉴别你的系统
2009-12-02 19:12:00
解决VMware中安装Centos7后无法ping通外网的问题
2021-09-22 10:42:03
Linux 和Windows 安装Git 步骤详细介绍
2023-08-25 16:30:58
一份详细的服务器安全解决方案
2008-08-16 17:11:00
泡、调、煎,看SEO的烹调艺术
2009-02-01 11:50:00
美国主机BlueHost介绍及购买图文教程
2010-03-28 17:19:00
Windows 2000安全审核让入侵者无处遁形
2009-12-02 18:48:00
Linux中的Screen命令使用技巧详解
2010-08-23 18:39:00
YouTube影片服务规格升至1080P 近期将上线
2009-11-17 08:58:00
Win2K服务器端安全设置教程(3)
2007-12-29 09:58:00
详细讲解Apache主配置文件(配置解说)
2010-05-08 18:31:00
彭宇诚:博客推广方法详解
2010-03-04 10:13:00
教你如何使用反盗链技术
2008-07-02 12:49:00