PCIE-XPDMA-Simple DMA傳輸筆記

聲明:所有文章屬於個人在工作中所記下和蒐集的筆記,不得轉載

參考的手冊地址:
a). Xilinx PCIe axi memory mapped手冊地址鏈接:https://china.xilinx.com/support/documentation/ip_documentation/axi_pcie/v2_8/pg055-axi-bridge-pcie.pdf
b). xapp1171文檔PCI Express Endpoint-DMA Initiator Subsystem手冊地址鏈接: https://www.xilinx.com/support/documentation/application_notes/xapp1171-pcie-central-dma-subsystem.pdf
c)AXI Central Direct Memory Access (CDMA) 手冊地址鏈接: https://china.xilinx.com/support/documentation/ip_documentation/axi_cdma/v4_1/pg034-axi-cdma.pdf

昨晚上熬夜寫完PCIE調用SGDMA的筆記,今天早上起來再寫寫Simple DMA的筆記。

五月底了,長沙的天氣還是下雨很多,好在很涼快,早上下了一場大雨,空氣清新,結束了這幾天悶熱的天氣。坐在窗戶邊,透過10樓的窗戶,看着窗外的風景,不遠處便是嶽麓山,寫寫博客,聽聽歌。轉眼從滿是皖A的城市來到滿是湘A的城市9個月了,時間過得很快,還是需要加油ya。

  1. 首先搭建好Block模塊,使用Simple DMA與使用SG DMA搭建的還是有點區別的:
    在這裏插入圖片描述
    用了兩個interconnect模塊,axi_interconnect_0模塊連接PCIE_CTL接口、CDMA_LITE接口、PCIE_PIO_M_AXI接口;axi_interconnect_1模塊連接AXI_PCIE接口、PCIE_DATA_M_AXI接口。其實一個1x3和一個1x2這兩個axi_interconnect模塊所消耗的資源加起來比SG模式下用到的3x6的axi_interconnect模塊所消耗的資源要少很多。
    axi_cdma模塊不勾選Enable Scatter Gather,讀寫數據位寬64,地址位寬33(注意是:33),突發讀寫大小爲256;
    AXI Memory Mapped To PCI Express模塊:
    PCIEBAR2AXIBAR勾選BAR0,映射基地址爲:0x8100_0000,128kilobytes夠用了(0x8102_0000);
    AXIBAR2PCIEBAR勾選BAR0,映射基地址BAR0爲:0x0000_0000,用來存放數據;
    在添加AXI總線接口的時候Frequency填:125000000,CLK Domain填:design_1_axi_pcie_1_0_axi_aclk_out

  2. 地址分配:
    在這裏插入圖片描述
    從上圖可以看出,在地址分配的時候PCIE的BAR0 AXI總線地址空間分配了整個RC端的CPU內存大小,這樣跟前一篇博客講到的分配8M的地址空間是有區別的;
    pcie_data_m_axi空間也是分配了很大,這裏假設外部掛的是一個4G內存的DDR存儲。
    pcie的m_axi進行cdma寄存器配置、pcie寄存器配置、外部寄存器配置

  3. 寄存器配置流程
    由於採用的是簡單DMA模式,所以就不需要描述符這些東西。配置好寄存器後直接就可以工作。
    關於詳細的寄存器描述請參考pg055和pg034;
    PCIEBAR2AXIBAR0=0x8100_0000

1).PCIEBAR2AXIBAR0+0X0000_C000 數據:0x0000_0004;配置CDMA的寄存器,對CDMA復位
2).PCIEBAR2AXIBAR0+0X0000_C000 數據:0x0000_7000;配置CDMA的寄存器,開啓DMA傳輸完成中斷,錯誤中斷,啓用簡單模式
3).PCIEBAR2AXIBAR0+0X0000_8208 數據:0x0000_0000;配置PCIE的寄存器,bar0映射的RC端的高32位物理地址(該值不需修改
4).PCIEBAR2AXIBAR0+0X0000_820c 數據:0x0000_0000;配置PCIE的寄存器,bar0映射的RC端的低32位物理地址(該值不需修改
5).PCIEBAR2AXIBAR0+0X0000_c018 數據:32’hxxxx_xxxx;配置CDMA的寄存器,CDMA SA起始讀低地址
6).PCIEBAR2AXIBAR0+0X0000_c01c 數據:32’hxxxx_xxxx;配置CDMA的寄存器,CDMA SA_M起始讀高地址
7).PCIEBAR2AXIBAR0+0X0000_c020 數據:32’hxxxx_xxxx;配置CDMA的寄存器,CDMA DA起始寫低地址
8).PCIEBAR2AXIBAR0+0X0000_c024 數據:32’hxxxx_xxxx;配置CDMA的寄存器,CDMA DA_M起始寫高地址
9).PCIEBAR2AXIBAR0+0X0000_c028 數據:32’hxxxx_xxxx;配置CDMA的寄存器,傳輸的字節數,寫入大於4時,啓動DMA的數據傳輸,最大值0x3ef_ffff;
10).寫入第九步的寄存器後DMA工作開始,直到讀完上面設置的字節個數,完成數據搬移動作後,停止。關於數據的搬移可以看CDMA IP的官方仿真平臺。
11).PCIEBAR2AXIBAR0+0X0000_C004 數據:0x0000_7000;因爲沒有描述符,所以要想知道什麼時候傳輸完成了,建議啓用中斷,中斷髮生後需要在CDMA的狀態寄存器寫1清除中斷。
12).跳轉到第3步重複之前的步驟就可以連續傳輸了,根據SA和DA的地址決定了數據傳輸的方向。

需要注意的是:因爲PCIE的0x208寄存器和0x20c寄存器固定配置成了0,所以BAR1端的地址映射到RC端是從0開始的,那麼以PCIE寫數據爲例:SA地址直接給RC端的物理地址即可,DA端的地址低位直接給DDR的地址,高位必須得給0x0000_0001。

  1. 封裝後的Block生成HDL Wrapper和SG DMA的一樣,這裏不再重複,請參考https://blog.csdn.net/Real003/article/details/90454365

  2. Sample DMA要求RC端申請的數據地址必須是連續的,而SG DMA因爲有描述符的存在,所以可以要求RC端申請的數據地址不連續,但是要求描述符必須要正確,不然取數據會不對。
    另外對於字節對齊的問題也同樣是需要考慮!

  3. XPDMA軟件驅動 https://github.com/strezh/XPDMA 中貌似沒有中斷部分,如果需要用到PCIE的中斷,這部分代碼還得自己去開發,我們的策略是通過自定義的一個狀態寄存器來讓PCIE通過PIO來輪詢讀取判斷EP端是否有數據供RC端讀。

筆記差不多記完了,如果你也需要開發PCIE memory mapped的驅動,pg055、pg034、xapp1171需要仔細去看看,瞭解整個工作流程就能跑起來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章