詳解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)行注冊使用。
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
APACHE 配置文件中文版 httpd.conf FOR Apache 2.2.13
APACHE配置文件中文版 httpd.conf FOR Apache 2.2.13 ,綜合網(wǎng)上2.0版本的翻譯,加入自己的理解,補(bǔ)充完善。2009-11-11CentOS7服務(wù)器中apache、php7以及mysql5.7的安裝配置代碼
這篇文章主要介紹了CentOS7服務(wù)器中apache、php7以及mysql5.7的安裝配置代碼,需要的朋友可以參考下2017-10-10linux下查看yum/rpm/dpkg某軟件是否已安裝的方法
這篇文章主要介紹了在linux下查看yum/rpm/dpkg某軟件是否已安裝的方法,文中給出了詳細(xì)的示例代碼,對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03使用Apache搭建http服務(wù)器實(shí)現(xiàn)CGI功能
專門處理 HTTP 請求的服務(wù)器,也被稱為 Web 服務(wù)器, 常用的 Web 服務(wù)器有 Apache和 Nginx ,當(dāng)然幾大巨頭五聯(lián)網(wǎng)公司也都有其獨(dú)自研發(fā)的 Web 服務(wù)器,比如阿里巴巴的Tengine, 這篇文章主要介紹了使用Apache搭建http服務(wù)器,實(shí)現(xiàn)CGI,需要的朋友可以參考下2024-07-07Linux Windows下設(shè)置定時(shí)執(zhí)行任務(wù)的方法
這篇文章主要介紹了Linux、windows下 設(shè)置定時(shí)執(zhí)行任務(wù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09