日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux串口dma,详解linux dma驱动编写

發布時間:2024/8/1 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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驱动编写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。