詳解linux dma驅(qū)動編寫
linux下面的驅(qū)動雖然什么樣的情形都有,但是dma驅(qū)動卻并不少見。dma可以有很多的好處,其中最重要的功能就是能夠幫助我們將數(shù)據(jù)搬來搬去,這個時候cpu就由時間去做別的事情了,提高了設備效率。
1、dma驅(qū)動在什么地方
drivers/dma
2、如何看s3c的dma驅(qū)動,先看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、確認驅(qū)動文件為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ū)動為基本的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兩個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;
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Linux之進程間通信(共享內(nèi)存【mmap實現(xiàn)+系統(tǒng)V】)
這篇文章主要介紹了Linux之進程間通信(共享內(nèi)存【mmap實現(xiàn)+系統(tǒng)V】),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
apache啟動報 shmget() failed: Invalid argument的解決方法
在apache啟動時報錯:“shmget() failed: Invalid argument”,如何解決呢?這里簡單分享下,方便需要的朋友2013-06-06
Lamp環(huán)境下設置綁定apache域名的方法分析
這篇文章主要介紹了Lamp環(huán)境下設置綁定apache域名的方法,簡單分析了Lamp環(huán)境下的Apache域名綁定設置相關(guān)屬性、功能與操作技巧,需要的朋友可以參考下2018-03-03

