簡體   English   中英

帶 PCIe 的 DMA 驅動程序,用於將信息從 FPGA 傳輸到 RAM

[英]DMA driver with PCIe for transferring information from the FPGA to RAM

我想編寫一個驅動程序和軟件:

軟件每二十秒請求一次數據,硬件將數據寫入 DMA 緩沖區並在完成時引發中斷。

不幸的是我沒有編寫驅動程序的經驗,我不能使用已經有驅動程序的 Xilinx IP 內核。

我使用的 PCIe IP Core 是 UltraScale+ Device Integrated Block for PCI Express (PCIe)。


我已經實現了一個簡單的驅動程序,可以讀取 FPGA 上的狀態寄存器。 我按照以下步驟來實施 DMA:

//Driver_Probe
pci_set_master(pdev);
drv_priv->virt_addr = kmalloc(2048, GFP_DMA);
if (!drv_priv->virt_addr)
{
    dev_err(dev, "Failed to kmalloc");
    err = -ENOMEM;
    return err;
}
drv_priv->bus_addr = pci_map_single(pdev, drv_priv->virt_addr, 2048, PCI_DMA_FROMDEVICE);
if (!drv_priv->bus_addr)
{
    dev_err(dev, "Failed to allocate DMA buffer");
    err = -ENOMEM;
    return err;
}

我還需要添加什么來實現這個驅動程序?

據說在文檔中取消映射操作之前,無法讀取緩沖區中的數據。 取消映射后如何才能成功讀取數據?

有完整的例子嗎? 我發現的參考資料對於新手來說太簡短了。

我將不勝感激任何幫助。

幾年前,我寫了一個教程,使用 PCIe 將數據從 FPGA 傳輸到 CPU RAM,但它使用的是 CycloneV。

簡而言之:

  • 首先,您必須分配一個連貫的緩沖區:
/* Allocate and initialize shared control data */
dmas->dmabuff = dmam_alloc_coherent(&pdev->dev, BUFF_SIZE, &dmas->dma_handle, GFP_KERNEL);
if (!dmas->dmabuff){
  printk("Error, can't alloc coherent\n");
  goto err_return;
}
  • 然后在你FPGA下的DMA controller中寫入緩沖區地址。
writel((unsigned long)(dmas->dma_handle), &dmas->bar0[CRA_REG_A2P_ADDR_MAP_LO0/4]);

在此示例中,dma 地址配置寄存器位於 CRA_REG_A2P_ADDR_MAP_LO0 中的CRA_REG_A2P_ADDR_MAP_LO0下。

一旦 FPGA 中的 PCIe 內核有了緩沖區地址,它就可以讀/寫 CPU RAM。

這是一個舊教程,也許 Linux API 現在改變了一點。 但我認為精神保持不變。

暫無
暫無

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

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