linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见.dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。
1, dma驱动在什么地方
司机/dma
2,如何看s3c的dma驱动,先看Kconfig
配置S3C24XX_DMAC bool“三星S3C24XX DMA支持” 取决于> obj - $ (CONFIG_S3C24XX_DMAC) +=s3c24xx-dma。o
4,确认驱动文件为s3c24xx-dma.c,了解基本结构
静态结构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,驱动为基本的平台司机,接着就可以了解调查函数了
/*初始化*/memcpy引擎 dma_cap_set (DMA_MEMCPY s3cdma→memcpy.cap_mask); dma_cap_set (DMA_PRIVATE s3cdma→memcpy.cap_mask); s3cdma→memcpy.dev=, pdev→开发; 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;/*初始化奴隶引擎SoC内部专用外设*/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→开发; 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。地图=pdata→slave_map; s3cdma→slave.filter。mapcnt=pdata→slavecnt; s3cdma→slave.filter。fn=s3c24xx_dma_filter; >之前6,通过代码获悉,s3cdma有主人和奴隶两个引擎,且部分接口共享。
只要完成dma接口的适配,dma就可以正常使用了。当然,前提是,两个引擎要进行注册使用。
ret=dma_async_device_register(及s3cdma→memcpy); 如果(ret) { dev_warn(及pdev→dev, “% s未能注册memcpy作为异步设备- % d \ n”, __func__ ret); goto err_memcpy_reg; } ret=dma_async_device_register(及s3cdma→奴隶); 如果(ret) { dev_warn(及pdev→dev, “% s未能注册奴隶作为异步设备- % d \ n”, __func__ ret); goto err_slave_reg; } >之前以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
详解linux dma驱动编写