詳解linux dma驅(qū)動(dòng)編寫
linux下面的驅(qū)動(dòng)雖然什么樣的情形都有,但是dma驅(qū)動(dòng)卻并不少見。dma可以有很多的好處,其中最重要的功能就是能夠幫助我們將數(shù)據(jù)搬來搬去,這個(gè)時(shí)候cpu就由時(shí)間去做別的事情了,提高了設(shè)備效率。
1、dma驅(qū)動(dòng)在什么地方
drivers/dma
2、如何看s3c的dma驅(qū)動(dòng),先看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、發(fā)現(xiàn)s3c只依賴于S3C24XX_DMAC,這樣可以接著看Makefile
obj-$(CONFIG_S3C24XX_DMAC) += s3c24xx-dma.o
4、確認(rèn)驅(qū)動(dòng)文件為s3c24xx-dma.c,了解基本結(jié)構(gòu)
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、驅(qū)動(dòng)為基本的platform driver,接著就可以了解probe函數(shù)了
/* 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兩個(gè)engine,且部分接口共享。
只要完成dma接口的適配,dma就可以正常使用了。當(dāng)然,前提是,兩個(gè)engine要進(jìn)行注冊(cè)使用。
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;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Linux之進(jìn)程間通信(共享內(nèi)存【mmap實(shí)現(xiàn)+系統(tǒng)V】)
這篇文章主要介紹了Linux之進(jìn)程間通信(共享內(nèi)存【mmap實(shí)現(xiàn)+系統(tǒng)V】),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
linux下修改文件權(quán)限chmod命令詳細(xì)解析
大家好,本篇文章主要講的是linux下修改文件權(quán)限chmod命令詳細(xì)解析,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
apache啟動(dòng)報(bào) shmget() failed: Invalid argument的解決方法
在apache啟動(dòng)時(shí)報(bào)錯(cuò):“shmget() failed: Invalid argument”,如何解決呢?這里簡(jiǎn)單分享下,方便需要的朋友2013-06-06
Lamp環(huán)境下設(shè)置綁定apache域名的方法分析
這篇文章主要介紹了Lamp環(huán)境下設(shè)置綁定apache域名的方法,簡(jiǎn)單分析了Lamp環(huán)境下的Apache域名綁定設(shè)置相關(guān)屬性、功能與操作技巧,需要的朋友可以參考下2018-03-03
新手學(xué)習(xí)Linux系統(tǒng)的11點(diǎn)建議
這篇文章主要為大家詳細(xì)介紹了新手學(xué)習(xí)Linux系統(tǒng)的11點(diǎn)建議,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09

