1. 程式人生 > >3. ZCU102 HDMI Demo工程修改【PCIE視訊傳輸】

3. ZCU102 HDMI Demo工程修改【PCIE視訊傳輸】

為了更快速的開發我需要的帶快取的hdmi收發通路,將上一節的demo進行修改來實現。當然,可以從頭開始自己進行配置,我就這麼做了,但是因為fpga配置的不同,還要修改更多的驅動程式碼,相當麻煩,所以就直接拿demo的工程來用吧。(我一開始參考了TRD的工程程式碼,跟hdmi demo的配置還是有區別的,比如RX通道的參考時鐘,TRD用了SI5324的晶體,而demo用的是fpga輸出的時鐘)。

1 Vivado 工程修改

將上節的zcu102 hdmi demo工程開啟,選擇File -> Save Projeject As
將名稱設定為zcu102_hdmi_frame
1.png

開啟block design
因為不使用音訊功能,所以將audio相關的連線和模組刪除。刪除前參考TRD的設計,可以看到v_hdmi_tx_ss的s_axis_audio_aclk和s_axis_audio_aresetn需要進行連線,其他的直接刪除或接0即可。
刪除下面的模組。
2.png


將tx和rx的s_axis_audio_aresetn和fid訊號連線刪除。將s_axis_audio_aclk連線到s_axi_cpu_aclk。

新增Video Mixer IP
3.png
雙擊IP進行配置
4.png

新增Video Frame Buffer Write IP
8.png
雙擊進行配置,視訊格式選擇了RGB8、YUV8、YUYV三種常見的HDMI視訊格式。
9.png

新增AXI Data FIFO IP
雙擊進行配置,將資料頻寬改為128,Write FIFO Depthe設定為512,delay設定為ON。
10.png

將v_tpg_ss_0這個結構改名為v_dma_ss,然後將剛才新增的這些IP都拖進來。
雙擊結構中的v_tpg,將所有功能勾選。
11.png


雙擊結構中的axi_gpio,將GPIO Width改為3。結構中的tpg、mix、frmbuf_wr都需要用GPIO來實現非同步復位,這是官方Linux驅動的要求,就按照它的辦吧。當然不用linux的話也可以將這些復位管腳接到reset模組。
12.png
然後新增3個slice分別定位到0、1、2位,分別連線到tpg、mix、frmbuf_wr模組。

雙擊zynq ps,新增兩個主AXI HPM FPD和兩個從AXI HP FPD。第一個主介面用來低速的AXI外設配置(100MHz),第二個主介面用來高速的AXI外設配置(300MHz);第一個從介面用來實現HDMI TX通道資料讀取(300MHz),第二個從介面用來實現HDMI RX通道資料寫入(300MHz)。
13.png


在zynq_us_ss_0中新增AXI Interconnect IP

新增AXI Interconnect IP
雙擊進行配置,4輸入1輸出,Max Performence,Enable Register Slice, Enable Data FIFO
5.png
6.png
7.png
再新增一個AXI Interconnect IP,1輸入1輸出,其它配置跟前邊的相同。

再新增一個AXI Interconnect IP,1輸入4輸出,選擇Minimal Area,Enable Register Slice選擇Outer,Enable Data FIFO選擇NONE
將原有的一個AXI Interconnect IP也配置成相同的模式1輸入4輸出,並將fmch_axi_iic重新連線到M03_AXI介面。
將中斷前的concat改為6輸入。連線tpg、mix、frmbuf_wr的中斷輸出。

最終vmda相關的連線如下圖
14.png
zynq_us相關的連線如下圖
15.png
總體連線如下圖
16.png
auto assign address將所有ip的暫存器偏移進行配置,然後將不用的OCM、QSPI、PCIE儲存空間unmap掉
17.png
18.png
validate design驗證設計
19.png

將不會用到的audio相關rtl程式碼以及audio相關的xdc約束刪除。

直接點選Generate Bitstream
在有cache的基礎上大概編譯了半個小時。
資源使用較demo來說dsp、bram和lut佔用增長了許多
20.png

Export Hardware, Launch SDK完成這一階段的設計

2 SDK 工程修改

對於HDMI RX通道來說,完全被修改了,需要重新設計驅動程式碼。
對於HDMI TX通道來說,我保留了TPG模組,所以可以將程式碼部分修改即可進行HDMI輸出測試,這樣也挺好的。
生成了一個新的exdes_wrapper_hw_platform_1,將原來的*_0刪除。
因為驅動要變,所以重新生成一個Passthrough_A53例程,並進行修改,重新生成前需要將原有程式程式碼和bsp刪除。勾選刪除原始檔。
使用預設配置生成一個新的bsp:zcu102_hdmi_frame_bsp
匯入hdmi Passthrough_A53例程。
可以看到例子中有錯誤,這是因為我們刪掉了audio相關的東西以及一些其他內容導致的。我們現在開始剪裁這個程式碼,使他滿足我們現在的fpga邏輯。
結果發現簡單的修改就能正常編譯了。。

XPAR_V_TPG_SS_0_AXI_GPIO_DEVICE_ID
換成XPAR_V_DMA_SS_AXI_GPIO_DEVICE_ID

XPAR_V_TPG_SS_0_V_TPG_DEVICE_ID換成
XPAR_V_DMA_SS_V_TPG_DEVICE_ID

先不管mix和frmbuf_wr的驅動,直接用保留的TPG測試HDMI TX的輸出。
燒錄fpga,燒錄ps,螢幕一閃,看來能用啊。
21.png
因為不能TPG的輸入時MIX,所以沒有passthrough功能了,手動配置,按”c”選擇輸出colorbar,顯示器能夠顯示,表明HDMI TX通道是能夠正常用的,只要編寫mix的驅動就可以了。
而且從前面圖中的log可以看到

RX stream is up

所以說明輸入通道也是ok的,只要編寫frmbuf_wr的驅動就可以了。
把兩個驅動編寫完畢,再用三重緩衝的方式將視訊記憶體排程起來,應該就能夠間接實現passthrough功能了。

雖然這樣能用,但是還有audio相關的程式碼沒有刪除或是遮蔽,最好處理一下。。

下面的log測試了輸出不同解析度和tpg產生的pattern圖形,都是正常的。

Starting colorbar
RX stream is up
TX stream is up
--------
Pass-Through :
        Color Format:     RGB
        Color Depth:      8
        Pixels Per Clock: 2
        Mode:             Progressive
        Frame Rate:       60Hz
        Resolution:       [email protected]
        Pixel Clock:      148500000
--------
Starting colorbar
TX stream is down
TX stream is up
--------
Colorbar :
        Color Format:     RGB
        Color Depth:      8
        Pixels Per Clock: 2
        Mode:             Progressive
        Frame Rate:       60Hz
        Resolution:       [email protected]
        Pixel Clock:      148500000
--------

---------------------------
---   RESOLUTION MENU   ---
---------------------------
 1 -  720 x 480p
 2 -  720 x 576p
 3 - 1280 x 720p
 4 - 1680 x 720p
 5 - 1920 x 1080p
 6 - 2560 x 1080p
 7 - 3840 x 2160p
 8 - 4096 x 2160p
 9 - 1920 x 1080i
10 -  640 x 480p (VGA / DMT0659)
11 -  800 x 600p (SVGA / DMT0860)
12 - 1024 x 768p (XGA / DMT1060)
13 - 1280 x 768p (WXGA / CVT1260E)
14 - 1366 x 768p (WXGA+ / DMT1360)
15 - 1280 x 1024p (SXGA / DMT1260G)
16 - 1680 x 1050p (WSXGA+ / CVT1660D)
17 - 1600 x 1200p (UXGA / DMT1660)
18 - 1920 x 1200p (WUXGA / CVT1960D)
19 -  720 x 480i (NTSC)
20 -  720 x 576i (PAL)
21 - 3840 x 2160p (SB) (Custom)
99 - Exit
Starting colorbar> 4
TX stream is down
TX stream is up
--------
Colorbar :
        Color Format:     RGB
        Color Depth:      8
        Pixels Per Clock: 2
        Mode:             Progressive
        Frame Rate:       60Hz
        Resolution:       [email protected]
        Pixel Clock:      99000000
--------
Starting colorbar> 3
TX stream is down
TX stream is up
--------
Colorbar :
        Color Format:     RGB
        Color Depth:      8
        Pixels Per Clock: 2
        Mode:             Progressive
        Frame Rate:       60Hz
        Resolution:       [email protected]
        Pixel Clock:      74250000
--------
Starting colorbar> 5
TX stream is down
TX stream is up
--------
Colorbar :
        Color Format:     RGB
        Color Depth:      8
        Pixels Per Clock: 2
        Mode:             Progressive
        Frame Rate:       60Hz
        Resolution:       [email protected]
        Pixel Clock:      148500000
--------
Returning to main menu.

----------------------
---   VIDEO MENU   ---
----------------------
  1 - Color bars
  2 - Solid red
  3 - Solid green
  4 - Solid blue
  5 - Solid black
  6 - Solid white
  7 - Horizontal ramp
  8 - Vertical ramp
  9 - Rainbow color
 10 - Checker board
 11 - Cross hatch
 12 - Noise
 13 - Black (Video Mask)
 14 - White (Video Mask)
 15 - Red (Video Mask)
 16 - Green (Video Mask)
 17 - Blue (Video Mask)
 18 - Noise (Video Mask)
 99 - Exit

其中的9 - Rainbow color看起來效果不錯,以前都是拿的ZedBoard的VGA介面進行測試的,RGB三色的深度太小,顯示出來都是離散的色塊,現在拿RGB24來顯示,果然比較平滑了。

修改顏色格式為RGB、YUV444、YUV422也都是能用的,但是切換的時候應該是有個bug,會同時將顏色深度變為12,顯示器就會不正常顯示了。

感覺這個demo的測試程式還是寫的非常好的,比較穩定,以後要是還會用到的話,可以拿來借鑑。

3 程式梳理

下面對demo程式進行梳理,將他的程式流程整理出來。
這裡就不畫框圖了,文字整理。

  1. 雜項
    • 宣告相關變數、結構體指標
    • 列印啟動資訊,包含了elf編譯的時間
    • 標誌位初始化
  2. 初始化基本功能
    • 初始化ps端的iic0、iic1
    • 使用iic1配置U34 iic擴充套件晶片(0x74),將iic1匯流排switch到(第5個通道,0x10)U20時鐘晶片(驅動裡面是Si5324,實際是Si5328)
    • 使用iic1-ch5,配置Si5328時鐘晶片(0x69)
      1. 3,0x15。在校準時關閉時鐘輸出。
      2. 4,0x92。自動選擇時鐘並可逆,history delay default。
      3. 6,0x0f。輸出訊號電平CKOUT1、CKOUT2:Low swing LVDS
      4. 10,0x08。CKOUT2 disabled,CKOUT1 enabled。
      5. 11,0x42。CKIN2 disabled,CKIN1 enabled。
      6. 19,0x23。設定快速時鐘
      7. 137,0x01。使能快速鎖定。
      8. 輸入設定為晶體輸入114285000Hz,輸出為156250000Hz。
        • 使用軟體計算出分頻倍頻數值。
        • 0,0x54。使用xtal輸入,使能free running。
        • 配置分頻倍頻係數到晶片。
      9. 仔細看了一下,這個晶片實際在ZCU102裡面是驅動SFP的,不知道幹嘛還要這個,直接刪掉??。。。
    • 使用pl端的axi_iic,配置Si5324時鐘晶片(0x68)
      1. 配置與Si5328前半部分相同。
      2. 輸入時鐘選擇CKIN1,輸出選擇CKOUT1。
      3. 完成配置。
    • 沒有使用HDCP功能,很大一部分程式碼被註釋了
    • 初始化中斷功能Gic
  3. 初始化HDMI相關功能
    • 預設配置初始化HDMI_TX_SS模組
    • 將HDMI_TX_SS模組的中斷服務程式繫結到對應Gic的中斷號上
    • 使能Gic中HDMI_TX_SS的中斷
    • 配置HDMI_TX_SS模組的回撥函式介面
      1. XV_HDMITXSS_HANDLER_CONNECT-> TxConnectCallback
      2. XV_HDMITXSS_HANDLER_TOGGLE-> TxToggleCallback
      3. XV_HDMITXSS_HANDLER_VS-> TxVsCallback
      4. XV_HDMITXSS_HANDLER_STREAM_UP-> TxStreamUpCallback
      5. XV_HDMITXSS_HANDLER_STREAM_DOWN-> TxStreamDownCallback
      6. 各個回撥函式功能如其名稱
    • 配置HDMI_RX_SS模組中的EDID資訊
    • 預設配置初始化HDMI_RX_SS模組
    • 將HDMI_RX_SS模組的中斷服務程式繫結到對應Gic的中斷號上
    • 使能Gic中HDMI_RX_SS的中斷
    • 配置HDMI_RX_SS模組的回撥函式介面
      1. XV_HDMIRXSS_HANDLER_CONNECT-> RxConnectCallback
      2. XV_HDMIRXSS_HANDLER_AUX-> RxAuxCallback
      3. XV_HDMIRXSS_HANDLER_AUD-> RxAudCallback
      4. XV_HDMIRXSS_HANDLER_LNKSTA-> RxLnkStaCallback
      5. XV_HDMIRXSS_HANDLER_STREAM_DOWN-> RxStreamDownCallback
      6. XV_HDMIRXSS_HANDLER_STREAM_INIT-> RxStreamInitCallback
      7. XV_HDMIRXSS_HANDLER_STREAM_UP-> RxStreamUpCallback
      8. 各個回撥函式功能如其名稱
    • 預設配置初始化Video_PHY模組
    • 將Video_PHY模組的中斷服務程式繫結到對應Gic的中斷號上
    • 使能Gic中Video_PHY的中斷
    • 配置Video_PHY模組的回撥函式介面
      1. XVPHY_HDMI_HANDLER_TXINIT-> VphyHdmiTxInitCallback
      2. XVPHY_HDMI_HANDLER_TXREADY-> VphyHdmiTxReadyCallback
      3. XVPHY_HDMI_HANDLER_RXINIT-> VphyHdmiRxInitCallback
      4. XVPHY_HDMI_HANDLER_RXREADY-> VphyHdmiRxReadyCallback
      5. VphyErrorCallback
      6. 各個回撥函式功能如其名稱
  4. 初始化其他影象相關模組
    • 預設配置,初始化AXI_GPIO模組
    • 復位TPG模組
    • 預設配置,初始化TPG模組
  5. 設定程式異常回調函式,並使能異常檢測
  6. 初始化HDMI Menu軟體模組
  7. 初始化Video_PHY和HDMI_TX_SS模組,使能Colorbar、1080p、RGB8輸出配置,HDMI RX不接的情況下會輸入,加入RX接了輸入訊號,會快速的觸發中斷,改為passthrough模式?
  8. 進入程式的主迴圈
    • 根據是否接入了RX訊號,來進行模式配置
      1. RX電纜連線、RX資料流建立成功會將StartTxAfterRxFlag置為TRUE,觸發執行StartTxAfterRx
        • 清除StartTxAfterRxFlag為FALSE
        • 關閉Video_PHY的TX TMDS的OBUFTDS差分時鐘
        • 開啟HDMI TX的流,設定畫素速率、顏色深度、顏色格式、scrambler?、時鐘速率、寫log
        • 開啟Video_PHY的RX TMDS的OBUFTDS差分時鐘輸出
        • 判斷HDMI TX和HDMI RX是否繫結在了一個GT收發器上
          1. 不在一個GT上,需要對收發參考時鐘進行頻率一致的設定
          2. 在一個GT上
            • 復位Si5324
            • 重新初始化Si5324
        • 復位TPG模組
        • 重新根據HDMI解析度配置TPG模組
        • 如果HDMI TX和HDMI RX繫結在一個GT上,開啟Video_PHY的TX TMDS的OBUFTDS差分時鐘
      2. TX電纜連線、RX連線會將TxRestartColorbar置為TRUE
        • 清除TxRestartColorbar為FALSE
        • 執行EnableColorBar
    • TX的流建立成功後,會將IsStreamUp置為TRUE
      1. 清除IsStreamUp為FASLE
      2. 通過AXI_IIC根據Video_PHY的資訊配置DP159晶片
      3. 開啟Video_PHY的TX TMDS的OBUFTDS差分時鐘
    • 執行HDMI Menu程式模組,響應指令並作出動作
    • 根據VphyErrorFlag標誌來進行錯誤處理,Video_PHY的錯誤回撥函式會將VphyErrorCallback置為TRUE
      asd

4 總結

把HDMI的Demo的大概結構已經理清楚了,下一次拿以前寫好的mix和frmbuf_wr的驅動新增到工程,把初始化以及相關的中斷程式寫好來進行帶幀緩衝的透傳功能。當然,可以將一些影象處理演算法加進來,這樣系統的功能就比較強大了~
幀同步的方法看起來是需要在XV_HDMITXSS_HANDLER_VS中斷裡面去做,就先這樣吧。

相關推薦

3. ZCU102 HDMI Demo工程修改PCIE視訊傳輸

為了更快速的開發我需要的帶快取的hdmi收發通路,將上一節的demo進行修改來實現。當然,可以從頭開始自己進行配置,我就這麼做了,但是因為fpga配置的不同,還要修改更多的驅動程式碼,相當麻煩,所以就直接拿demo的工程來用吧。(我一開始參考了TRD的工程程式碼

4. MIZ7035 HDMI測試PCIE視訊傳輸

1 MIZ7035的HDMI工程建立 將上次用到的MIG_AXI工程拿來進行HDMI的工程建立。 不像ZCU102的開發板那樣用GT收發器,MIZ7035的HDMI介面是靠PL的邏輯來實現輸入輸出的。所以要寫RTL程式碼來做HDMI的編解碼。 測了幾天MI

5. MIZ7035 PCIe測試 RIFFAPCIE視訊傳輸

1.前言 MIZ7035官方提供了兩種pcie的demo,一個就是普通的PIO測試,一個是BMD測試。我只是試驗了PIO功能,可以對板卡直接進行IO暫存器讀寫。而另外一個BMD功能使用了DMA來加速資料讀寫速度。 我也是第一次接觸PCIe,BMD確實也可以完

Android 使用librtmp推流視訊傳輸

1.通過jni呼叫librtmp 下面是jni中提供給java呼叫的本地方法: public final class PublishJni { static { System.loadLibrary("publish"); } s

修改局域網內的服務器ip

多個 網絡配置 廣播 localhost 組成 服務 sys sysconfig ifconf 我們知道 在局域網內部訪問時,必須是同一網段才可以訪問。我們修改網絡配置前,必須知道所屬網段才行: 1. 查看網段 2. 通過上面操作我們可以看到網段為194, 網關ip為2

如何在你的專案中整合 CAP手把手視訊教程

前言 之前錄製過一期關於CAP的視訊,但是由於當時是直播時錄製的視訊,背景音比較雜所以質量有點差。這次的視訊沒有直播,直接錄製的,視訊質量會好很多,第一遍錄製完成之後發現播放到一半沒有聲音,所以又重新錄製了一遍。 視訊簡介 CAP 2.3 版本釋出後,針對於一些介面做了一些調整,內部也做了很多修改,這一期的視

GIF視訊轉換Video to Gif Pro for Mac破解版

想要在視訊中提取剪輯甚至幀以轉換為GIF嗎? 小編為您帶來Video to Gif Pro Mac破解版,這是一款非常方便的GIF視訊轉換工具,它支援當下所有主流視訊格式,快速從你的視訊檔案中進行提取剪輯,並轉換為GIF格式,非常的時候快捷,有需要的朋友快來看看吧! Video to Gif P

UML視訊總結——UML概述

本章介紹內容較多,但都是提綱要領,不會細細展開 一、面向物件技術 面向物件技術是一種程式設計方法,是對現實世界中問題的抽象方式         軟體質量衡量的指標 外部: 1、正確性 2、健壯性和

分享視訊資源React JS教程

React 是一個用於構建使用者介面的 JAVASCRIPT 庫。 React主要用於構建UI,很多人認為 React 是 MVC 中的 V(檢視)。 React 起源於 Facebook 的內部專案,用來架設 Instagram 的網站,並於 2013 年

視訊傳輸二、Opencv結合socket進行視訊傳輸(TCP協議)

        博文由來:筆者突發奇想,做採集4個USB攝像頭畫面小實驗時,卻遇到了在電腦上最多隻能同時開啟3個這樣頭痛的問題(個人分析認為是電腦的問題),故出此下策,在客戶端掛1個,伺服器掛3個攝像頭,利用socket進行視訊傳輸,本篇文章是利用的是TCP協議。筆者拙見,

百度ARAndroiddemo工程使用手記

AR【百度AR】【Android】demo工程使用手記 demo工程獲取和註意事項 百度AR平臺地址:https://ar.baidu.com/testapply 技術文檔地址:https://ai.baidu.com/docs#/DuMixAR-Android-SDK/top AR內容管理地址:https

leetcode 287. 尋找重複數Medium陣列 && 劍指Offer 面試題3 題目2:不修改陣列找出重複的數字

       這道題leetcode和劍指Offer題目略有不同。leetcode說陣列中的重複數可能不止一個,但是結果要求返回一個就行;劍指Offer上說只有一個重複的數,但是重複的次數不一定。兩個題目的共性就是隻需要返回一個重複的數即可。 leetco

迅為iTop4412學習筆記3. 編譯linux的Makefile修改

本節目標 如何把原本編譯進linux核心的LEDS取消掉 首先編譯一個最小的linux燒寫試試 解壓迅為提供過的原始碼包iTop4412_Kernel_3.0_20180604.tar.gz tar -xvf iTop4412*.ta

opensmile翻譯2.3提取特徵demo-編寫opensmile配置檔案

文件機翻 openSMILE可以生成配置用於簡單場景的模板。 我們將使用此功能生成我們的第一個配置,能夠讀取波形,計算幀能量,並儲存輸出到CSV檔案。首先,建立一個目錄myconfig,它將儲存你的配置檔案。現在鍵入以下內容(不帶換行符)以生成第一個配置檔案

[RK3399][Android7.1] 除錯筆記 :UBOOT 中HDMI預設解析度的修改UBOOT上HDMI LOGO 顯示程式碼分析

平臺 核心版本 安卓版本 RK3399 Linux4.4 Android7.1 文章目錄 問題: 現象:

Xilinx Artix-7 FPGA 1之實現DEMO工程並燒寫

一、主要目的 使用vivado 15.4 建立A7 FPGA工程 Verilog、約束等資原始檔的編寫及新增 程式的模擬 程式燒入固化 二、建立 A7 FPGA Vivado 工程 (1)選擇新建工程: (2)專案名稱及儲存路徑 (3)選擇工程型別 在

VS2010中的MFC工程修改

修改前的知識準備: 1、解決方案相關檔案 AAA.sln檔案和AAA.suo檔案為MFC自動生成的解決方案檔案,它包含當前解決方案中的工程資訊,儲存解決方案的設定。 2、工程相關檔案 AAA.vcxproj檔案是MFC生成的工程檔案,它包含當前工程的設定和工程所包含

甘道夫Ubuntu14 server + Hadoop2.2.0環境下Sqoop1.99.3部署記錄

tool share 環境變量 解壓 gdi yar base soft mil 第一步。下載、解壓、配置環境變量: 官網下載sqoop1.99.3 http://mirrors.cnnic.cn/apache/sqoop/1.99.3/ 將sqoop解

利用STM32CubeMX來生成USB_HID_Mouse工程添加ADC(1)

page perf stm32cube ets lar hid data before variable 現在原來的基礎上添加ADC的功能。 現在(利用STM32CubeMX來生成USB_HID_Mouse工程)基礎上新增硬件 JoyStick Shield 遊戲搖桿擴展板

X-Forwarded-ForWEB修改訪客IP

識別 int urn 開發 user p地址 連接 通過 light X-Forwarded-For(XFF)是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段。 Squid 緩存代理服務器的開發人員最早引入了這一HTTP