中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解linux dma驅動編寫

發布時間:2020-09-27 21:19:43 來源:腳本之家 閱讀:174 作者:feixiaoxing 欄目:服務器

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", 
    __func__, ret); 
  goto err_slave_reg; 
} 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汽车| 林芝县| 和林格尔县| 祥云县| 五台县| 新余市| 铅山县| 镇赉县| 安吉县| 赣榆县| 育儿| 威宁| 东明县| 黄骅市| 泸水县| 慈溪市| 鱼台县| 阿克苏市| 昌邑市| 电白县| 武川县| 沛县| 内黄县| 博罗县| 贵阳市| 拉萨市| 会宁县| 曲阳县| 娄烦县| 水城县| 濮阳县| 开鲁县| 洛隆县| 周宁县| 阜新| 靖西县| 嘉善县| 府谷县| 内江市| 舞阳县| 双柏县|