2017-06-21 211 views
1

我和朋友正試圖爲高級操作系統類編寫虛擬設備的設備驅動程序(讀取:不是PCI或USB)。我們正在使用Ubuntu 16.04。我們的任務是在我們的驅動程序中調用IOCTL併爲它提供一個完整的RGB值(一個整數數組),一個空目標緩衝區和一個長度的源緩衝區。我們將調用DMA控制器將源緩衝區的內容傳輸到目標緩衝區,然後對目標緩衝區中的值應用線性轉換。是否可以在Linux中進行內存到內存的DMA傳輸?如果是這樣,什麼函數調用DMA來開始傳輸?

我們已經成功地完成了沒有DMA的轉換,並且我們已經成功地爲我們的設備分配了DMA通道。我們遇到的問題是我們似乎無法找到任何地方的功能,它描述了使用DMA啓動傳輸。我們希望在完成後引發中斷(驅動程序不應該等待傳輸完成)。

爲了清楚我們要求的內容,我們只想知道在哪裏可以找到描述此過程的函數的定義。我們不是要求代碼或完成此任務的確切方法;我們只想知道可以使用哪些函數和/或什麼頭文件來查找它們。我們已經通過linux/dma-mapping.h查看了看起來令人難以置信的內容。我們也研究了LDD3一段時間,但似乎完全通過建立DMA的過程,而沒有提供關於實際開始DMA傳輸的函數的信息。

回答

1

有在最近的Linux內核,支持能夠存儲到內存複製本地DMA引擎在drivers/dma目錄「DMA引擎」的API,檢查它們是如何實現的:

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES 
bool "DMA Engine support" 
depends on HAS_DMA 
help 
    DMA engines can do asynchronous data transfers without 
    involving the host CPU. Currently, this framework can be 
    used to offload memory copies in the network stack and 
    RAID operations in the MD driver. This menu only presents 
    DMA Device drivers supported by the configured arch, it may 
    be empty in some cases. 

DMA引擎在多個硬件平臺上實現,但不是在每臺PC或服務器或SoC中實現。檢查Kconfig中的選項,如INTEL_IDMA64「英特爾集成DMA ..英特爾Skylake PCH」,INTEL_IOATDMA「英特爾(R)I/OAT DMA引擎,出現在最新的英特爾至強芯片組中。

其他選項是使用一些虛擬化平臺(如qemu)並實現您自己的設備仿真(https://stackoverflow.com/a/44612957 edu設備和simple driver,http://wiki.qemu.org/Features/QOM)。

如果你問如何登記中斷處理程序,告訴我們什麼是你的(虛擬)總線,你的(虛擬)設備的連接方式(以及如何你沒有實現虛擬設備)。和qemu's "edu" pci.c driver has some examples for PCI-compatible interruptsrequest_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major)

相關問題