5. MIZ7035 PCIe測試 RIFFA【PCIE視頻傳輸】


1.前言

MIZ7035官方提供了兩種pcie的demo,一個就是普通的PIO測試,一個是BMD測試。我只是試驗了PIO功能,可以對板卡直接進行IO寄存器讀寫。而另外一個BMD功能使用了DMA來加速數據讀寫速度。 
我也是第一次接觸PCIe,BMD確實也可以完成應用的需求,搞起來應該沒有問題。准備用這個開始做實驗呢,問了一下學校之前的第二導師,他直接給我說了5個字母:R-I-F-F-A。說讓我去查一下,底層FPGA和上層軟件都已經是一個完整的架構了,可以直接使用。既然老師說了,一定是這個方法可能更為方便吧,而且他說一直在用這個架構。

2.RIFFA和XILLYBUS

先百度了一下CPU與FPGA的通信方式,找到一個知乎問題: 
CPU與FPGA進行數據通信有哪些方法? 
有回答者直接貼了兩個可用的框架: 
XILLYBUS: 
An FPGA IP core for easy DMA over PCIe with Windows and Linux 
RIFFA2: 
RIFFA: Home | RIFFA: A Reusable Integration Framework For FPGA Accelerators 
還有一個北大無線可重構體系結構課題小組的框架: 
EPEE: 
EPEE – An Efficient and Flexible Host-FPGA PCIe Communication Library

XILLYBUS

XILLYBUS最早接觸是在參加OpenHW2014比賽時候看到過的,當時真是不知道它是干什么的。當時在用zybo和zedboard做比賽項目,XILLYBUS提供了一個在這兩個開發板上可以運行的Ubuntu操作系統,叫做Xillinux,很強大。雖然說這個Ubuntu的界面在沒有GPU加持的Zynq器件上運行起來稍微有些卡頓,但是它畢竟是一個完整的桌面操作系統,我們很多參加比賽的人都是在這個上面搞起來的,還有一部分原因就是很多人不會PetaLinux,而且自己去添加桌面的難度更是高。查了一下,已經推出了Xillinux 2.0 beta版本,有空了去試一下。 
在Xillinux中,官方提供了一個AXI接口的Xillybus,當時還沒想明白是干啥用的。現在終於明白了。。原來是為了兼容它的PCIe接口驅動。Xillybus還是主打他的PCIe接口驅動的。 
下圖是Xillybus的結構 
2.png

Xillybus是用到了Altera或Xilinux的PCIe接口core,接入它自己的Xillybus IP core,最后通過FIFO接口將TX、RX通道映射出來。結構很清晰,我們需要的只是在FIFO接口后接入我們自己的IP core,按照自己的協議來進行通信即可。 
上層代碼直接通過打開名為xillybus的設備,然后進行文件讀寫即可實現對底層FIFO收發數據的控制 
3.png 
這樣看來PCIe接口的Xillybus是獨立於PCIe接口FPGA的另外一個嵌入式Linux系統或是桌面的Windows、Linux操作系統。 
而AXI接口的Xillybus對應的HOST就是本身Zynq器件上的ARM處理器。

RIFFA

RIFFA是第一次接觸,他的結構如下圖 
4.png 
FPGA部分首先是Xilinx的PCIe core,然后使用TX、RX引擎,在經過通道仲裁映射到最多12個TX、RX通道上。結構與PIO、BMD的結構類似,增加了通道擴展的功能,這樣就不用我們自己去寫仲裁代碼了。 
PC部分就是基本的驅動、應用結構,PCIe的訪問空間映射到了PC的內存上,RIFFA的驅動負責內存以及PCIe接口的管理,RIFFA庫可以被用戶空間程序調用來實現對底層RIFFA驅動的調用,並最終實現PCIe的數據通信。 
RIFFA的讀寫函數名為fpga_recv和fpga_send,函數接口也類似於一個文件讀寫命令,只不過可以在參數中指定PCIe的通道編號、數據的大小等信息。 
fpga_send的流程 
5.png 
fpga_recv的流程 
6.png 
里面都有有一個叫做build scatter gather list的步驟,我的理解是在PC上malloc申請內存時候容易申請到非連續的物理內存,可能被分為好幾塊,所以要將這些空間進行分離並生成這個list,然后將list信息發送給PCIe的endpoint,EP再根據這個list來依次使用DMA直接操作PC上的內存空間。 
看到上面兩個圖,我真是慶幸自己沒有去嘗試自己搞,根本沒那么多時間去搞啊,而且感覺也沒那能力···囧。

EPEE

EPEE的框圖如下 
7.png 
沒有仔細看,就不分析了。

以上說到的三個框架,肯定是都可以使用的,但是聽老師的建議,直接去搞RIFFA吧,也沒有為什么。

2.建立RIFFA工程

去網上下載官方提供的RIFFA源文件,需要填寫一些信息即可拿到下載地址。http://riffa.ucsd.edu/download

我直接下載了最新release的版本RIFFA 2.2.2 
解壓后的文件結構: 
8.png

ZC706 Demo

./source/fpga/xilinx目錄下可以看到xilinx開發板的demo,MIZ7035的zynq芯片最為接近zc706開發板,我們就用這個demo來進行參考。 
使用vivado直接打開工程./source/fpga/xilinx/zc706/ZC706_Gen2x4If128/prj/ZC706_Gen2x4If128.xpr,點擊自動升級到Vivado 2017.4的版本。 
軟件更新依賴關系后,發現工程中缺失了一些文件,這些文件是riffa相關的hdl代碼,我們在工程中直接添加目錄./source/fpga/riffa_hdl下的所有文件,並勾選紅框位置的兩個選項 
9.png
點擊Finish,等待文件結構的更新,可以看到已經沒有錯誤警告了 
10.png 
看到多了一個altera相關的verilog文件,可以刪除掉。因為我沒有ZC706的開發板,就不綜合了,直接去在MIZ7035上去實驗。

MIZ7035工程設計

繼續將前一節測試過的HDMI、MIG工程拿來添加PCIe功能 
點擊IP Catalog->搜索pcie->雙擊7 Series Integrated Block for PCI Express->選擇Customize IP,這里不能將IP加入到BD中去,因為這個IP Core是包含在另外一個hdl文件中的。 
11.png
為了方便移植,同時打開ZC706 Demo和MIZ7035工程中的PCIe IP,參照demo的配置來配置miz7035的IP。貼圖: 
X4,5.0GT/s,100MHz Ref clock 
12.png
13.png
14.png
15.png
16.png
17.png
18.png
19.png
20.png
21.png
22.png
23.png
24.png
25.png
先不去管各個配置的意義了,照着demo做就應該沒問題了。

在自己的工程中新建文件MIZ7035_Gen2x4lf128.v,然后復制./source/fpga/xilinx/zc706/ZC706_Gen2x4If128/hdl/ZC706_Gen2x4If128.v內的代碼並粘貼進來。將ZC706字符都改為MIZ7035,其它不用修改。

在自己的工程中新建文件riffa_wrapper_miz7035.v,然后復制./source/fpga/xilinx/zc706/riffa_wrapper_zc706.v內的代碼並粘貼進來。將ZC706字符都改為MIZ7035,其它不用修改。

然后文件目錄更新就會提示文件缺失,然后按照剛才demo的方法,將./source/fpga/riffa_hdl下的所有文件添加到工程,等待更新,可以刪除不需要的文件。 
最終目錄如下 
26.png

因為我之前的工程中有BD,為了例化一個MIZ7035_Gen2x4lf128模塊,需要將BD和這個模塊重新例化然后作為頂層文件。 
新建一個MIZ7035_PCIE_RIFFA.v文件,復制之前BD生成的wrapper代碼並復制進來。刪除原先BD的wrapper。下面對MIZ7035_Gen2x4lf128進行例化。

module MIZ7035_PCIE_RIFFA(
//pcie
    PCI_EXP_TXP,
    PCI_EXP_TXN,
    PCI_EXP_RXP,
    PCI_EXP_RXN,

    PCIE_REFCLK_P,
    PCIE_REFCLK_N,
    PCIE_RESET_N,
...
...
parameter C_NUM_LANES =  4;

output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXP;
 output [(C_NUM_LANES - 1) : 0] PCI_EXP_TXN;
 input [(C_NUM_LANES - 1) : 0]  PCI_EXP_RXP;
 input [(C_NUM_LANES - 1) : 0]  PCI_EXP_RXN;

 input                          PCIE_REFCLK_P;
 input                          PCIE_REFCLK_N;
 input                          PCIE_RESET_N;

 MIZ7035_Gen2x4If128 MIZ7035_Gen2x4If128_inst
 (
    .PCI_EXP_TXP(PCI_EXP_TXP),
    .PCI_EXP_TXN(PCI_EXP_TXN),
    .PCI_EXP_RXP(PCI_EXP_RXP),
    .PCI_EXP_RXN(PCI_EXP_RXN),

    .LED(),
    .PCIE_REFCLK_P(PCIE_REFCLK_P),
    .PCIE_REFCLK_N(PCIE_REFCLK_N),
    .PCIE_RESET_N(PCIE_RESET_N)
);
endmodule
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

將新建的MIZ7035_PCIE_RIFFA.v文件作為頂層文件。 
最后的目錄如下: 
27.png 
其中有一個chnl_tester的例化,代碼如下:

`timescale 1ns/1ns
module chnl_tester #(
    parameter C_PCI_DATA_WIDTH = 9'd32
)
(
    input CLK,
    input RST,
    output CHNL_RX_CLK, 
    input CHNL_RX, 
    output CHNL_RX_ACK, 
    input CHNL_RX_LAST, 
    input [31:0] CHNL_RX_LEN, 
    input [30:0] CHNL_RX_OFF, 
    input [C_PCI_DATA_WIDTH-1:0] CHNL_RX_DATA, 
    input CHNL_RX_DATA_VALID, 
    output CHNL_RX_DATA_REN,

    output CHNL_TX_CLK, 
    output CHNL_TX, 
    input CHNL_TX_ACK, 
    output CHNL_TX_LAST, 
    output [31:0] CHNL_TX_LEN, 
    output [30:0] CHNL_TX_OFF, 
    output [C_PCI_DATA_WIDTH-1:0] CHNL_TX_DATA, 
    output CHNL_TX_DATA_VALID, 
    input CHNL_TX_DATA_REN
);

reg [C_PCI_DATA_WIDTH-1:0] rData={C_PCI_DATA_WIDTH{1'b0}};
reg [31:0] rLen=0;
reg [31:0] rCount=0;
reg [1:0] rState=0;

assign CHNL_RX_CLK = CLK;
assign CHNL_RX_ACK = (rState == 2'd1);
assign CHNL_RX_DATA_REN = (rState == 2'd1);

assign CHNL_TX_CLK = CLK;
assign CHNL_TX = (rState == 2'd3);
assign CHNL_TX_LAST = 1'd1;
assign CHNL_TX_LEN = rLen; // in words
assign CHNL_TX_OFF = 0;
assign CHNL_TX_DATA = rData;
assign CHNL_TX_DATA_VALID = (rState == 2'd3);

always @(posedge CLK or posedge RST) begin
    if (RST) begin
        rLen <= #1 0;
        rCount <= #1 0;
        rState <= #1 0;
        rData <= #1 0;
    end
    else begin
        case (rState)

        2'd0: begin // Wait for start of RX, save length
            if (CHNL_RX) begin
                rLen <= #1 CHNL_RX_LEN;
                rCount <= #1 0;
                rState <= #1 2'd1;
            end
        end

        2'd1: begin // Wait for last data in RX, save value
            if (CHNL_RX_DATA_VALID) begin
                rData <= #1 CHNL_RX_DATA;
                rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
            end
            if (rCount >= rLen)
                rState <= #1 2'd2;
        end

        2'd2: begin // Prepare for TX
            rCount <= #1 (C_PCI_DATA_WIDTH/32);
            rState <= #1 2'd3;
        end

        2'd3: begin // Start TX with save length and data value
            if (CHNL_TX_DATA_REN & CHNL_TX_DATA_VALID) begin
                rData <= #1 {rCount + 4, rCount + 3, rCount + 2, rCount + 1};
                rCount <= #1 rCount + (C_PCI_DATA_WIDTH/32);
                if (rCount >= rLen)
                    rState <= #1 2'd0;
            end
        end

        endcase
    end
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90

CHNL就是RIFFA實現的一個類似FIFO或是AXIS的接口,這個文件等於是做了一個回環。RX將收到的最后一個數據進行保存,然后使用TX將數據每次增加一個數值后再發送出去。這個測試與上位機測試代碼將能夠一起對PCIe的帶寬進行測試。

接着在之前的MIZ7035_IO.xdc中添加約束:

#PCIe
set_property IOSTANDARD LVCMOS33 [get_ports PCIE_RESET_N]
set_property PACKAGE_PIN V19 [get_ports PCIE_RESET_N]
set_property PULLUP true [get_ports PCIE_RESET_N]
set_false_path -from [get_ports PCIE_RESET_N]

create_clock -period 10.000 -name sys_clk [get_ports PCIE_REFCLK_P]
set_property PACKAGE_PIN W6 [get_ports PCIE_REFCLK_P]
set_property PACKAGE_PIN W5 [get_ports PCIE_REFCLK_N]

set_property PACKAGE_PIN AC2 [get_ports {PCI_EXP_TXP[0]}]
set_property PACKAGE_PIN AE2 [get_ports {PCI_EXP_TXP[1]}]
set_property PACKAGE_PIN AF4 [get_ports {PCI_EXP_TXP[2]}]
set_property PACKAGE_PIN AF8 [get_ports {PCI_EXP_TXP[3]}]

set_property PACKAGE_PIN AC1 [get_ports {PCI_EXP_TXN[0]}]
set_property PACKAGE_PIN AE1 [get_ports {PCI_EXP_TXN[1]}]
set_property PACKAGE_PIN AF3 [get_ports {PCI_EXP_TXN[2]}]
set_property PACKAGE_PIN AF7 [get_ports {PCI_EXP_TXN[3]}]

set_property PACKAGE_PIN AD4 [get_ports {PCI_EXP_RXP[0]}]
set_property PACKAGE_PIN AC6 [get_ports {PCI_EXP_RXP[1]}]
set_property PACKAGE_PIN AE6 [get_ports {PCI_EXP_RXP[2]}]
set_property PACKAGE_PIN AD8 [get_ports {PCI_EXP_RXP[3]}]

set_property PACKAGE_PIN AD3 [get_ports {PCI_EXP_RXN[0]}]
set_property PACKAGE_PIN AC5 [get_ports {PCI_EXP_RXN[1]}]
set_property PACKAGE_PIN AE5 [get_ports {PCI_EXP_RXN[2]}]
set_property PACKAGE_PIN AD7 [get_ports {PCI_EXP_RXN[3]}]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

這樣就可以了,進行綜合、實現、生成bit。 
看一下實現后的Schematic 
28.png 
紅色框內是PCIe相關的,藍色框內是之前HDMI和MIG相關的。可以看到兩者直接沒有任何連接,也確實是我們還沒有添加它們之間的通信關系,等驗證完接口后,我再來用它的CHNL通道來實現視頻數據的連接。

占用資源,可以看到我們使用了一個X4的PCIe 
29.png

輸出到SDK,新建一個fsbl工程,更顯原有工程,然后生成一個BOOT.bin。將文件復制到SD卡,插入到MIZ7035上,並將開發板啟動方式改為SD卡啟動,這樣我們就不用JTAG進行下載了。 
將開發板插到電腦上並上電,然后啟動PC,用之前安裝過的Windriver就可以看到我們的設備了,說明PCIe接口已經啟動。下面我們來用RIFFA進行測試。

3.RIFFA驅動安裝

Windows RIFFA

先看一下./install/windows/README.txt 
里面說到只能支持Windows 7的32、64位系統。 
再看./source/driver/windows/README.txt 
里面說到Debugging on Windows is difficult because there exists no kernel log file. 
我也試了一下,WDK真是不會用,編譯的時候也出錯了。等有空了再來試吧。

我也安裝了,當啟動電腦后即可找到我們的設備 
1.png

Windows 7的WDK下載地址:https://www.microsoft.com/en-us/download/details.aspx?id=11800

Linux RIFFA

./install/linux/README.txt 
里面說直接使用driver目錄下的編譯和安裝驅動即可 
./source/driver/linux/README.txt 
里面說了驅動的安裝指令

$ sudo make setup
$ make
$ sudo make install
  • 1
  • 2
  • 3
  • 4

很簡單的就能夠安裝了,在應用程序編寫時直接include riffa.h 並link -lriffa即可,看起來很方便。

問題又來了,我電腦上沒有Linux實體機,而VMWare的虛擬機又不支持PCIe設備的連入,別人的電腦搞起來又不方便,之前zcu102 petalinux的pcie還沒 
編完。 
眼前一亮,看到了一個TX1開發板,搞起?

Linux RIFFA TX1

將MIZ7035插到TX1的PCIe插槽上,打開MIZ7035的電源,等待SDK啟動成功。 
在TX1上連接網線、HDMI顯示器,按下TX1的POWER BTN按鍵打開TX1開發板。

我直接用Xshell通過網絡登錄到了TX1的命令行。 
看一下pci設備

ubuntu@tegra-ubuntu:~$ lspci
00:01.0 PCI bridge: NVIDIA Corporation Device 0fae (rev a1)
01:00.0 Memory controller: Xilinx Corporation Device 7024
  • 1
  • 2
  • 3
  • 4

可以看到MIZ7035的PCIe已經被識別到了。 
用U盤或TFTP將./source/driver,./source/c_c++,./source/python復制到開發板上去,然后進入./driver/linux/目錄執行

$ sudo make setup
  • 1
  • 2

結果提示安裝linux-headers-3.10.96-tegra時找不到軟件包。網上也沒有一個回答清楚的答案。試了試執行make指令,通過警告信息,可以看到定位到了目錄/usr/src/linux-headers-3.10.96-tegra 
查看該目錄下的README,

These headers are provided to enable external module builds. They must be prepared on the target system before being used for module compilation. To prepare the headers, go into the headers package top level directory, and issue the following command:

sudo make modules_prepare

After preparation completes, external modules can be built following the process described in Documentation/kbuild/modules.txt.

原來是這樣TX1 tegra的linux-headers是從apt-get源上找不到的,我們需要直接用開發板自己提供的,編譯一下就好了。 
在該目錄下執行命令編譯linux-headers

$ sudo make modules_prepare
  • 1
  • 2

返回剛才的的./driver/linux/目錄

$ sudo make setup
$ make
$ sudo make install
  • 1
  • 2
  • 3
  • 4

這樣riffa的功能看起來就完成編譯了,激動人心的測試要開始了。 
進入目錄./c_c++/linux/x64/sample_app,這個app就是用來對應FPGA中的chnl_tester模塊的。編譯:

$ make clean
$ make
  • 1
  • 2
  • 3

測試前可以看一下源碼,了解測試命令。測試:

ubuntu@tegra-ubuntu:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 0
Number of devices: 1
0: id:0
0: num_chnls:1
0: name:0000:01:00.00
0: vendor id:10EE
0: device id:7024
ubuntu@tegra-ubuntu:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 1 0
ubuntu@tegra-ubuntu:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 2 0 0 5000000
words sent: 5000000
words recv: 5000000
recvBuffer[0]: 4999997
recvBuffer[1]: 4999998
recvBuffer[2]: 4999999
recvBuffer[3]: 5000000
recvBuffer[4]: 5
recvBuffer[5]: 6
recvBuffer[6]: 7
recvBuffer[7]: 8
recvBuffer[8]: 9
recvBuffer[9]: 10
recvBuffer[10]: 11
recvBuffer[11]: 12
recvBuffer[12]: 13
recvBuffer[13]: 14
recvBuffer[14]: 15
recvBuffer[15]: 16
recvBuffer[16]: 17
recvBuffer[17]: 18
recvBuffer[18]: 19
recvBuffer[19]: 20
recvBuffer[4463772]: 0, expected 4463773
send bw: 943.800814 MB/s 20.209229ms
recv bw: 588.343826 MB/s 32.418945ms
ubuntu@tegra-ubuntu:~/pcie/c_c++/linux/x64/sample_app$ ./testutil 2 0 0 93312000
words sent: 93312000
words recv: 93312000
recvBuffer[0]: 93311997
recvBuffer[1]: 93311998
recvBuffer[2]: 93311999
recvBuffer[3]: 93312000
recvBuffer[4]: 5
recvBuffer[5]: 6
recvBuffer[6]: 7
recvBuffer[7]: 8
recvBuffer[8]: 9
recvBuffer[9]: 10
recvBuffer[10]: 11
recvBuffer[11]: 12
recvBuffer[12]: 13
recvBuffer[13]: 14
recvBuffer[14]: 15
recvBuffer[15]: 16
recvBuffer[16]: 17
recvBuffer[17]: 18
recvBuffer[18]: 19
recvBuffer[19]: 20
recvBuffer[702060]: 0, expected 702061
send bw: 1028.932190 MB/s 345.947998ms
recv bw: 1577.181281 MB/s 225.691895ms
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

下面分析一下測試指令

  1. 指令0用來列舉所有的PCIe RIFFA設備,打印出了他們的RIFFA id,內部的chnl通道數量,設備名稱,廠家和設備id。
  2. 指令1用來對PCIe core進行復位
  3. 指令2用來對PCIe的收發功能與速度進行測試,最后一個參數指定了測試的word(4字節)數量。
  4. 第一次測試了5000000個word,大約19MB,速度為 
    send bw: 943.800814 MB/s 20.209229ms 
    recv bw: 588.343826 MB/s 32.418945ms
  5. 第一次測試了1個1920*1080@60Hz 24bit圖像大小的數據包,大約356MB,速度為 
    send bw: 1028.932190 MB/s 345.947998ms 
    recv bw: 1577.181281 MB/s 225.691895ms

PCIe Gen2 x 4的理論帶寬為2000MB/s,看來這個RIFFA是會有一些損失的,不過還能接受。

python測試

ubuntu@tegra-ubuntu:~/pcie/python$ sudo python setup.py install
ubuntu@tegra-ubuntu:~/pcie/python$ cd sample_app/
ubuntu@tegra-ubuntu:~/pcie/python/sample_app$ vim sampleapp.py
將腳本中的amt改為20 :wq
ubuntu@tegra-ubuntu:~/pcie/python/sample_app$ python sampleapp.py
array('I', [1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L])
array('I', [17L, 18L, 19L, 20L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L])
ubuntu@tegra-ubuntu:~/pcie/python/sample_app$
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可以看到測試的前4個數據發生了錯誤,還不知道是什么原因。先不管了

4.總結

這次使用了老師給我推薦的RIFFA功能來測試PCIe的通信。一開始想着自己來做所有的工作,現在看來真的沒必要,畢竟相關的東西太多太多,光是linux內核的驅動就夠我受的了。RIFFA這個框架從知道這個名稱,經過MIZ7035開發板一直,到最后用測試用例測試帶寬,整個過程只有不到5個小時,感覺還是非常非常效率的

接下來要去熟悉一下它的CHNL接口,然后再這個接口上添加我自己的通道,實現最先計划的PCIe視頻傳輸。

轉載:https://blog.csdn.net/vacajk/article/details/79073125


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM