簡體   English   中英

在 Linux 中使用 DMA 的最簡單方法

[英]Easiest way to use DMA in Linux

我是一名 EE,在 uni 的一個項目中,我正在 FPGA (Xilinx ZYNQ) 上開發硬件輔助圖像/視頻過濾,該設備內部還有一個雙核 ARM A9 處理器,更重要的是還有一個 ARM Primecell PL330 DMA controller

我正在使用 Yocto 構建一個基本的 linux 環境,我可以在處理器上使用 Xilinx 的自定義 kernel kernel 分支。

現在,如果我理解正確,我不能直接使用 kernel DMA API,但我必須編寫一個自定義的 kernel 驅動程序,這就是問題所在,因為我沒有足夠的 kernel 知識來做到這一點(特別是為自定義模塊設置構建環境)...

那么是否有某種庫/API/任何東西真的可以從用戶空間進行 DMA 傳輸? (特別是從 memory 到 memory 映射外設(zynq 上 PS 和 PL 之間的 AXI4 端口)

更新

經過一些深夜實驗,我得到了一個基本的 hello world kernel 模塊可以正確加載,所以我想我會以正確的方式 go 並編寫一個小型設備驅動程序填充程序,從用戶空間獲取大量數據(圖像的一部分)在這種情況下)並將其傳遞給 FPGA 部分,如果 IC 通過 DMA api

我會報告我的成功或失敗;)

一種可能的選擇是使用UIO 接口(另請參閱此博客文章

鏈接中有一些示例代碼,但代碼的一般結構是:

  • 您有一個處理 IO init 並公開 DMA 的小內核模塊。 (見文檔
  • 然后,您的用戶空間程序會處理您需要的所有 IO 以使其正常工作。 (另見示例代碼

由於您沒有指定您想要做什么,我無法更具體。 但是您需要弄清楚如何在內核中初始化您的內存(有關該LDD3 的文檔,請參閱標簽 wiki 很棒)。

該特定平台肯定有一個dmaengine驅動程序。 您需要做的就是創建一個小的內核模塊,使用戶空間可以訪問 dmaengine 客戶端的 API。

請閱讀: dmaengine 客戶端

幾年前,當我得到一個 Zedboard 時,我感到很驚訝,因為我需要編寫一個設備驅動程序才能將我的應用程序連接到可編程邏輯。

所以我開始研究連接框架來解決這個問題。 Connectal 為 Zynq FPGA 以及通過 PCI Express 連接的 Xilinx 或 Altera FPGA 提供通用設備驅動程序。 設備驅動程序使用戶模式軟件能夠對硬件的控制接口進行內存映射,並與硬件共享內存(通過 DMA)。 它還為可編程邏輯提供了一個 MMU,以便應用程序和可編程邏輯可以使用相同的線性偏移量進入共享內存對象。

Connectal 使用 Bluespec Systems Verilog 作為其硬件庫,這可能會使框架或其設備驅動程序難以在您的應用程序中使用,但它是可用的,我們很樂意更詳細地解釋和記錄硬件接口。

Connectal 在 github 上可用:

相關驅動程序在這里:

有幾種選擇:

遲到了,但 Xilinx 現在有一些關於從用戶空間控制 DMA 的好文檔。 它需要一個 kernel 驅動程序,但他們在其 github 存儲庫中提供的示例非常有用。

Linux 來自用戶空間 2.0 的 DMA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM