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
開啟block design
因為不使用音訊功能,所以將audio相關的連線和模組刪除。刪除前參考TRD的設計,可以看到v_hdmi_tx_ss的s_axis_audio_aclk和s_axis_audio_aresetn需要進行連線,其他的直接刪除或接0即可。
刪除下面的模組。
將tx和rx的s_axis_audio_aresetn和fid訊號連線刪除。將s_axis_audio_aclk連線到s_axi_cpu_aclk。
新增Video Mixer IP
雙擊IP進行配置
新增Video Frame Buffer Write IP
雙擊進行配置,視訊格式選擇了RGB8、YUV8、YUYV三種常見的HDMI視訊格式。
新增AXI Data FIFO IP
雙擊進行配置,將資料頻寬改為128,Write FIFO Depthe設定為512,delay設定為ON。
將v_tpg_ss_0這個結構改名為v_dma_ss,然後將剛才新增的這些IP都拖進來。
雙擊結構中的v_tpg,將所有功能勾選。
雙擊結構中的axi_gpio,將GPIO Width改為3。結構中的tpg、mix、frmbuf_wr都需要用GPIO來實現非同步復位,這是官方Linux驅動的要求,就按照它的辦吧。當然不用linux的話也可以將這些復位管腳接到reset模組。
然後新增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)。
在zynq_us_ss_0中新增AXI Interconnect IP
新增AXI Interconnect IP
雙擊進行配置,4輸入1輸出,Max Performence,Enable Register Slice, Enable Data FIFO
再新增一個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相關的連線如下圖
zynq_us相關的連線如下圖
總體連線如下圖
auto assign address將所有ip的暫存器偏移進行配置,然後將不用的OCM、QSPI、PCIE儲存空間unmap掉
validate design驗證設計
將不會用到的audio相關rtl程式碼以及audio相關的xdc約束刪除。
直接點選Generate Bitstream
在有cache的基礎上大概編譯了半個小時。
資源使用較demo來說dsp、bram和lut佔用增長了許多
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,螢幕一閃,看來能用啊。
因為不能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程式進行梳理,將他的程式流程整理出來。
這裡就不畫框圖了,文字整理。
- 雜項
- 宣告相關變數、結構體指標
- 列印啟動資訊,包含了elf編譯的時間
- 標誌位初始化
- 初始化基本功能
- 初始化ps端的iic0、iic1
- 使用iic1配置U34 iic擴充套件晶片(0x74),將iic1匯流排switch到(第5個通道,0x10)U20時鐘晶片(驅動裡面是Si5324,實際是Si5328)
- 使用iic1-ch5,配置Si5328時鐘晶片(0x69)
- 3,0x15。在校準時關閉時鐘輸出。
- 4,0x92。自動選擇時鐘並可逆,history delay default。
- 6,0x0f。輸出訊號電平CKOUT1、CKOUT2:Low swing LVDS
- 10,0x08。CKOUT2 disabled,CKOUT1 enabled。
- 11,0x42。CKIN2 disabled,CKIN1 enabled。
- 19,0x23。設定快速時鐘
- 137,0x01。使能快速鎖定。
- 輸入設定為晶體輸入114285000Hz,輸出為156250000Hz。
- 使用軟體計算出分頻倍頻數值。
- 0,0x54。使用xtal輸入,使能free running。
- 配置分頻倍頻係數到晶片。
- 仔細看了一下,這個晶片實際在ZCU102裡面是驅動SFP的,不知道幹嘛還要這個,直接刪掉??。。。
- 使用pl端的axi_iic,配置Si5324時鐘晶片(0x68)
- 配置與Si5328前半部分相同。
- 輸入時鐘選擇CKIN1,輸出選擇CKOUT1。
- 完成配置。
- 沒有使用HDCP功能,很大一部分程式碼被註釋了
- 初始化中斷功能Gic
- 初始化HDMI相關功能
- 預設配置初始化HDMI_TX_SS模組
- 將HDMI_TX_SS模組的中斷服務程式繫結到對應Gic的中斷號上
- 使能Gic中HDMI_TX_SS的中斷
- 配置HDMI_TX_SS模組的回撥函式介面
- XV_HDMITXSS_HANDLER_CONNECT-> TxConnectCallback
- XV_HDMITXSS_HANDLER_TOGGLE-> TxToggleCallback
- XV_HDMITXSS_HANDLER_VS-> TxVsCallback
- XV_HDMITXSS_HANDLER_STREAM_UP-> TxStreamUpCallback
- XV_HDMITXSS_HANDLER_STREAM_DOWN-> TxStreamDownCallback
- 各個回撥函式功能如其名稱
- 配置HDMI_RX_SS模組中的EDID資訊
- 預設配置初始化HDMI_RX_SS模組
- 將HDMI_RX_SS模組的中斷服務程式繫結到對應Gic的中斷號上
- 使能Gic中HDMI_RX_SS的中斷
- 配置HDMI_RX_SS模組的回撥函式介面
- XV_HDMIRXSS_HANDLER_CONNECT-> RxConnectCallback
- XV_HDMIRXSS_HANDLER_AUX-> RxAuxCallback
- XV_HDMIRXSS_HANDLER_AUD-> RxAudCallback
- XV_HDMIRXSS_HANDLER_LNKSTA-> RxLnkStaCallback
- XV_HDMIRXSS_HANDLER_STREAM_DOWN-> RxStreamDownCallback
- XV_HDMIRXSS_HANDLER_STREAM_INIT-> RxStreamInitCallback
- XV_HDMIRXSS_HANDLER_STREAM_UP-> RxStreamUpCallback
- 各個回撥函式功能如其名稱
- 預設配置初始化Video_PHY模組
- 將Video_PHY模組的中斷服務程式繫結到對應Gic的中斷號上
- 使能Gic中Video_PHY的中斷
- 配置Video_PHY模組的回撥函式介面
- XVPHY_HDMI_HANDLER_TXINIT-> VphyHdmiTxInitCallback
- XVPHY_HDMI_HANDLER_TXREADY-> VphyHdmiTxReadyCallback
- XVPHY_HDMI_HANDLER_RXINIT-> VphyHdmiRxInitCallback
- XVPHY_HDMI_HANDLER_RXREADY-> VphyHdmiRxReadyCallback
- VphyErrorCallback
- 各個回撥函式功能如其名稱
- 初始化其他影象相關模組
- 預設配置,初始化AXI_GPIO模組
- 復位TPG模組
- 預設配置,初始化TPG模組
- 設定程式異常回調函式,並使能異常檢測
- 初始化HDMI Menu軟體模組
- 初始化Video_PHY和HDMI_TX_SS模組,使能Colorbar、1080p、RGB8輸出配置,HDMI RX不接的情況下會輸入,加入RX接了輸入訊號,會快速的觸發中斷,改為passthrough模式?
- 進入程式的主迴圈
- 根據是否接入了RX訊號,來進行模式配置
- 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收發器上
- 不在一個GT上,需要對收發參考時鐘進行頻率一致的設定
- 在一個GT上
- 復位Si5324
- 重新初始化Si5324
- 復位TPG模組
- 重新根據HDMI解析度配置TPG模組
- 如果HDMI TX和HDMI RX繫結在一個GT上,開啟Video_PHY的TX TMDS的OBUFTDS差分時鐘
- TX電纜連線、RX連線會將TxRestartColorbar置為TRUE
- 清除TxRestartColorbar為FALSE
- 執行EnableColorBar
- RX電纜連線、RX資料流建立成功會將StartTxAfterRxFlag置為TRUE,觸發執行StartTxAfterRx
- TX的流建立成功後,會將IsStreamUp置為TRUE
- 清除IsStreamUp為FASLE
- 通過AXI_IIC根據Video_PHY的資訊配置DP159晶片
- 開啟Video_PHY的TX TMDS的OBUFTDS差分時鐘
- 執行HDMI Menu程式模組,響應指令並作出動作
- 根據VphyErrorFlag標誌來進行錯誤處理,Video_PHY的錯誤回撥函式會將VphyErrorCallback置為TRUE
asd
- 根據是否接入了RX訊號,來進行模式配置
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測試 RIFFA【PCIE視訊傳輸】
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協議。筆者拙見,
【百度AR】【Android】demo工程使用手記
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-For】WEB修改訪客IP
識別 int urn 開發 user p地址 連接 通過 light X-Forwarded-For(XFF)是用來識別通過HTTP代理或負載均衡方式連接到Web服務器的客戶端最原始的IP地址的HTTP請求頭字段。 Squid 緩存代理服務器的開發人員最早引入了這一HTTP