linux串口dma,详解linux dma驱动编写
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",ret);
goto err_slave_reg;
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持編程小技巧。
總結
以上是編程之家為你收集整理的詳解linux dma驅動編寫全部內容,希望文章能夠幫你解決詳解linux dma驅動編寫所遇到的程序開發問題。
如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。
本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。
總結
以上是生活随笔為你收集整理的linux串口dma,详解linux dma驱动编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fildder教程
- 下一篇: java进度条的使用_java 中进度条