国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 服務(wù)器 > Linux服務(wù)器 > 正文

詳解linux dma驅(qū)動編寫

2024-09-05 23:04:42
字體:
供稿:網(wǎng)友

linux下面的驅(qū)動雖然什么樣的情形都有,但是dma驅(qū)動卻并不少見。dma可以有很多的好處,其中最重要的功能就是能夠幫助我們將數(shù)據(jù)搬來搬去,這個時候cpu就由時間去做別的事情了,提高了設(shè)備效率。

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、確認(rèn)驅(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就可以正常使用了。當(dāng)然,前提是,兩個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í)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到服務(wù)器教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇赉县| 南昌县| 琼海市| 东乡族自治县| 德昌县| 栾川县| 长子县| 台北县| 黄梅县| 乾安县| 英山县| 大竹县| 敦煌市| 三明市| 扎鲁特旗| 温州市| 洪洞县| 望都县| 济宁市| 张掖市| 江陵县| 泾川县| 名山县| 饶河县| 武宣县| 永靖县| 灵宝市| 华坪县| 巩留县| 莒南县| 白城市| 榆中县| 五莲县| 临武县| 巧家县| 烟台市| 田林县| 武义县| 志丹县| 上犹县| 囊谦县|