国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 寿阳县| 利川市| 滦南县| 什邡市| 吉木萨尔县| 嘉义市| 垫江县| 宁远县| 桐庐县| 邹城市| 鄢陵县| 塘沽区| 贡觉县| 山西省| 治县。| 融水| 闽侯县| 通山县| 新泰市| 天等县| 宁南县| 惠州市| 克什克腾旗| 鄂尔多斯市| 徐闻县| 库伦旗| 会同县| 荔波县| 新巴尔虎左旗| 阜城县| 涡阳县| 惠东县| 古丈县| 永福县| 望城县| 焉耆| 乐平市| 富蕴县| 达孜县| 衢州市| 治县。|