Hi3531D调试手记(六):IT6801实现HDMI转码BT1120输入VI
??Hi3531D 的 MPP 系統中 VI 模塊接收視頻流就是基于 BT656/BT1120 協議的,開發板上做出的 HDMI 輸入則是利用 IT6801 將 HDMI 硬件轉碼為 BT1120 實現的。雖說自制的板子上同時留了兩種預案的接口,BT1120 接口也能把圖像數據送進 VI,但是因為其他的一些原因,還是得把 HDMI 輸入也實裝 Orz…
目錄
- 零、私貨(吐槽)
- 一、概念
- 1.1 HDMI 傳輸原理
- 1.2 HPD 與 EDID
- 1.3 IT6801 編程相關引腳
- 1.4 Linux I2C 驅動框架
- 二、IT6801驅動實現
- 2.1 I2C 適配器驅動配置
- 2.2 HDMI 寄存器初始化配置
- 2.3 EDID 配置
- 2.3.1 啟用內部 EDID
- 2.3.2 更新 EDID(自定義 EDID)
- 2.4 中斷處理
- 2.5 視頻輸出配置
- 2.5.1 視頻輸入狀態監測
- 2.5.2 輸出格式配置
- 2.5.3 色偏矯正(咕~)
零、私貨(吐槽)
- 編程手冊上展示的芯片工作流程倒是很簡單,但是調試起來莫名地痛苦。
- 自己做的板子上跑不了 IT6801 的 DEMO,能否正常輸出暫且不論,單單連跑完 HDMI 寄存器初始化都做不到,嗯,無法理解。
- 網上關于 IT6801 驅動開發的討論簡直少得離譜,又有種以前搗鼓 UWB 的感覺,不過這次的更離譜,官網都不給資料下載。合著這玩意兒的驅動算商業機密?
- IT6801 Programming Guide 是真滴難找,大部分資料包里塞的都是 IT6802 的編程手冊,據說用起來效果是一樣的,在入手 IT6801 的編程手冊之前咱也確實是在參考 IT6802 的手冊來配置 IT6801。但是!可能的話還是建議用 IT6801 Programming Guide 來進行開發。
一、概念
1.1 HDMI 傳輸原理
??HDM(High-Definition Multimedia Interface,高清晰多媒體接口)是一種采用 TMDS (Time Minimized Differential Signal,最小化傳輸差分信號)傳輸技術的數字音頻視頻接口。TMDS 是一種微分信號機制,采用差分傳動方式,利用 2 個引腳間電壓差來傳送信號的技術,其傳輸數據的數值(“0” 或者 “1”)由兩腳間電壓正負極性和大小決定。
??每一個標準的 HDMI 連接,都包含了 3 個用于傳輸數據的 TMDS 傳輸通道,還有 1 個獨立的 TMDS 時鐘通道,以保證傳輸時所需的統一時序。在一個時鐘周期內,每個 TMDS 通道都能
傳送 10bit 的數據流。而這 10bit 數據,可以由若干種不同的編碼格式構成。
- HDMI 把視頻信號分為 R、G、B、H、V 五種信號用 TMDS 技術編碼;
- TMDS 的三個通道分別傳輸 R、G、B 三原色, H、V 編碼在 B 信號通道里面傳輸(嵌入式傳輸),R、G、B 的多余位置可以用來傳輸音頻信號;
- DDC(Display Data Channel,顯示數據通道)用來傳輸接收端支持的視頻配置信息和數據格式信息,輸出端會讀取這些 E-EDID,并以此來決定輸出的視頻格式;
- CEC 即消費電子控制通道,通過該通道可以控制視聽設備的工作。
1.2 HPD 與 EDID
??之前已經有人做過 IT6801 的調試并記錄了心得 —— HDMI接收芯片 IT6801fn 輸入調試,這算是咱在網絡上找到的為數不多的有用信息之一了,這里對其做一些細化補充。
- 首先介紹 EDID。EDID 的全稱是 Extended Display Identification Data(擴展顯示標識數據),分為主塊和擴展塊兩個部分,長度均為 128 字節。主塊包含必要的信息因此必須存在,而擴展塊的內容主要和音頻屬性相關。DVI 和 VGA 沒有音頻,HDMI 自帶音頻,所以 VGA、DVI 的 EDID 由主塊 128 字節組成,HDMI 的 EDID 則會在主塊的基礎上再增加擴展塊,也就是會有 256 字節的 EDID。HDMI EDID 擴展塊數據規范按照 CEA-861x 標準定義。EDID 中包含了有關顯示器及其性能的參數,包括供應商信息、最大圖像大小、顏色設置、廠商預設置、頻率范圍的限制以及顯示器名和序列號的字符串等等。形象地說,EDID 就是顯示器的身份證、戶口本、技能證書等證件的集合,目的就是告訴別人我是誰,我從哪來,我能干什么。
- HPD 信號是標準 HDMI 接口使用的重要信號之一,用于設備的熱插拔檢測。這個信號是主機系統用來判斷是否需要對 HDMI/DVI 接口是否發送 TMDS 信號的依據。具體的判斷方法為:當主機系統檢測到 HDMI 接口上的 HPD 信號從低電平被拉高到高電平時,就認為有顯示器連接到 HDMI 口,此時就會作出響應,請求讀取顯示器端的 EDID 信息,以獲取顯示器支持的顯示時序。如果發現自己能夠輸出使顯示器正常顯示的視頻信號,主機系統就會開始 TMDS 信號傳輸,將視頻流送出 HDMI 接口。
??因此,要想 IT6801 能夠正常被 PC 識別,就需要在完成初始化工作(包括對 EDID 的設置)之后主動拉高 HPD才行。另外, IT6801 是有內部 EDID RAM,有初始 EDID 的,只要使用自帶的 EDID RAM(具體使用方法后面介紹),就可以不另外設置 EDID 以及外接 EDID。
1.3 IT6801 編程相關引腳
??數據手冊里對所有的引腳都有進行描述,然而這里重點關注的只有 Programming Pins(硬件設計部分不歸咱管)。
??雖說硬件不歸咱管,但是 CDSENSE 這個引腳注意一下,雖然描述是用來檢測 MHL 的連接,但是如果確定使用 HDMI 而不使用 MHL 請務必接地,務必接地,務必接地!不要問為什么 QAQ
PS:即便確定了只使用 HDMI 的 Video 部分而無需 Audio 部分,也請務必保證 Audio 相關的供電與接地引腳連接到位!
1.4 Linux I2C 驅動框架
??在裸機開發中編寫某個使用 I2C 來通信的設備驅動時,一般會有兩個部分的驅動:
- I2C 主機驅動,這是處理器的 I2C 接口驅動,一旦編寫完成就不需要再做修改,其他的 I2C 設備直接調用主機驅動提供的 API 函數完成讀寫操作即可;
- I2C 設備驅動。也就是直接適配對應設備的驅動,一個蘿卜一個坑,不能混用。
??Linux 內核根據驅動分離與分層的思想,也將 I2C 驅動分為了類似的兩部分:
- I2C 總線驅動,就是 SOC 的 I2C 控制器驅動,也叫做 I2C 適配器驅動;
- I2C 設備驅動,與裸機開發的 I2C 設備驅動類似,就是針對具體的 I2C 設備而編寫的驅動。
??Linux 內核代碼文件 i2c-dev.c(位置在源碼目錄 drivers/i2c/i2c-dev.c) 中實現了 I2C 適配器設備文件的功能,針對每個適配器生成一個主設備號為 89 的設備節點(定義在源碼目錄 include/linux/i2c-dev.h 中,次設備號為 0-255),i2c-dev.c 提供了通用的 read()、write() 和 ioctl() 等文件操作接口,因此在用戶空間的應用層就可以借用這些接口訪問掛接在適配器上的 I2C 設備的存儲空間或寄存器,并控制 I2C 設備的工作方式。
??I2C 適配器的設備節點是 /dev/i2c-x,其中 x 是數字。由于適配器編號是動態分配的(和注冊次序有關),所以想了解哪一個適配器對應什么編號,可以查看 /sys/class/i2c-dev/ 目錄下的文件內容。
二、IT6801驅動實現
2.1 I2C 適配器驅動配置
??雖說可以在 dts 文件下檢查默認的引腳復用配置,但為了保險起見,還是根據引腳復用 Excel 表,在 pinmux.sh(引腳復用的寄存器統一配置腳本)中增加了相關復用信息:
#pinmux.sh 增加內容 #i2c0 himm 0x120f01cc 1 himm 0x120f01d0 12.2 HDMI 寄存器初始化配置
??首先是打開 I2C 適配器并完成基礎設置:
/** 打開 I2C 適配器* iic_name : i2c 適配器設備節點 /dev/i2c-x* flag : 操作權限 O_RDWR*/ static int open_iic(const char *iic_name, int flag) {int fd;fd = open(iic_name, flag);return fd; }/** 設置 I2C 適配器* reg_width : 寄存器和數據的寬度 0:8位 1:16位* iic_addr : iic器件的地址*/ static void set_iic_mode(int regwidth, int iic_addr) {int ret;ret = ioctl(fd_i2c, I2C_SLAVE_FORCE, iic_addr); // 強制設置從機地址if (ret < 0) printf("set iic_addr failed!\n");ret = ioctl(fd_i2c, I2C_16BIT_REG, regwidth);if (ret < 0) printf("set reg_width error!\n");ret = ioctl(fd_i2c, I2C_16BIT_DATA, regwidth);if (ret < 0) printf("set data_width error!\n"); }- 根據 IT6801 數據手冊中的編程相關引腳描述,IT6801 的器件地址取決于 PCADR 引腳是上拉(0x92)還是下拉(0x90),這里是下拉,因此 iic_addr 的值為 0x90:
- 寄存器位寬和數據位寬經由手冊可以判斷出應為 8 位,因此 regwidth 的值為 0:
- I2C_SLAVE_FORCE、I2C_16BIT_REG、I2C_16BIT_DATA 均為定義在內核源碼目錄的 include/uapi/linux/i2c-dev.h 中的 IOCTL 宏:
??接下來就是根據編程手冊里的推薦順序來初始化寄存器了(總表長度占了一整頁,這里只截取了一部分):
??就結果來看,是能正常配置 IT6801 的寄存器的,而此時還沒有做其他的配置,PC 并未識別出 IT6801 芯片:
2.3 EDID 配置
2.3.1 啟用內部 EDID
??根據編程手冊的說法,如果要啟用內部 EDID,就需要斷開與外部 EDID ROM DDC 總線的連接,同時在 reg87 使能 EDID Block 的訪問權限并設置好 EDID 的 I2C 從機地址。在初始化代碼中增加如下部分:
??有了關于 EDID 和 HPD 的設置,現在已經能被 PC 識別到:
2.3.2 更新 EDID(自定義 EDID)
??IT6801 內部自帶的 EDID 已經直接將 1080p 設置為了推薦分辨率,如無特殊要求可以直接使用(個人的需求是 4k,改肯定是要改的,但是本文就以 1080p 接著往下調了)。如果需要修改,就需要根據之前設置好的 EDID RAM 的 I2C 從機地址修改 I2C 接口設置,以查看和修改 EDID RAM 內的數據。注意,RAM 已經足夠說明這里的修改只是本次運行的設置修改,掉電就會失效。EDID RAM 的配置列表可以直接從 DEMO 里扒出來,在熟悉 EDID 結構的基礎上可以自行修改配置,沒必要把 DEMO 里一堆看似智能實際冗余的自動計算部分也搬出來。
unsigned char Edid_Block[256] = { // IT6802 with 640x480p , 720x480p , 1280x720p , 1920x1080p // EDID 主塊(Block 0): 0x00 ~ 0x7F /*----------------------------------------------- Header -----------------------------------------------*/ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, // 0x00 ~ 0x07:EDID開始標志 /*----------------------------------- Vendor / Product Identification ----------------------------------*/ 0x26, 0x85, // 0x08 ~ 0x09:制造商名稱 0x02, 0x68, // 0x0A ~ 0x0B:產品代碼 0x01, 0x68, 0x00, 0x00, // 0x0C ~ 0x0F:產品序列號 0x00, 0x17, // 0x10 , 0x11:制造周(0無效),制造年份(1990年為0) /*---------------------------------- EDID Structure Version / Revision ---------------------------------*/ 0x01, 0x03, // 0x12 , 0x13:版本號,修改號(v1.3) /*---------------------------------- Basic Display Parameters / Features -------------------------------*/ 0x80, // 0x14:視頻信號定義(bit7=1,數字信號) 0x73, 0x41, // 0x15 , 0x16:最大水平圖像尺寸(cm),最大垂直圖像尺寸(cm) 0x78, // 0x17:顯示傳輸特性(Gamma * 100 - 100)范圍[1,3.55] 0x2A, // 0x18:電源管理標準 DPMS(bit5=1,支持Off Mode功能;bit[4:3]=01,RGB顏色顯示;bit1=1,推薦分辨率模式,即推薦分辨率為第一個描述的時序 DTD) /*---------------------------------------- Color Characteristics ---------------------------------------*/ 0x7C, 0x11, 0x9E, 0x59, 0x47, 0x9B, 0x27, 0x10, 0x50, 0x54, // 0x19 ~ 0x22:紅綠、藍白場的 xy 坐標信息 /*----------------------------------------- Established Timings ----------------------------------------*/ 0x00, 0x00, 0x00, // 0x23 ~ 0x25:提供基本固定的一些輸出時序,未使用時設為 0x00 /*----------------------------------- Standard Timing Identification -----------------------------------*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x26 ~ 0x35:提供最多 8 種分辨率的識別,兩兩一組,未使用時設為 0x01 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /*---------------------------------- Detailed Timing Descriptions(DTD) ---------------------------------*/ // 推薦分辨率(單個 DTD 占 18 字節,共可記錄 4 個 DTD,因此這一部分共占 72 字節) 0x02, 0x3A, // 0x36 , 0x37:十進制像素時鐘/10000,先存儲低8位,這里存儲的時鐘頻率就是 148.5MHz(0x3A02) 0x80, 0x18, 0x71, // 0x38 ~ 0x3A:分別對應 H_Active 低8位、H_Blanking 低8位、{H_Active 高4位,H_Blanking 高4位},這里的 H_Active 為 1920(0x780) pixels,H_Blanking 為 280(0x118) pixels 0x38, 0x2D, 0x40, // 0x3B ~ 0x3D:V 參數信息,與 H 類似,這里的 V_Active 為 1080(0x438) lines,V_Blanking 為 45(0x2D) lines 0x58, 0x2C, // 0x3E , 0x3F:H_Sync Offset 低8位,H_Sync Pulse Width 低8位 0x45, // 0x40:{V_Sync Offset 低4位,V_Sync Pulse Width 低4位} 0x00, // 0x41:{H_Sync Offset 高2位,H_Sync Pulse Width 高2位,V_Sync Offset 高2位,V_Sync Pulse Width 高2位} 0x10, 0x09, // 0x42 , 0x43:H_Image Size(mm) 低8位,V_Image Size(mm) 低8位 0x00, // 0x44:{H_Image Size 高4位,V_Image Size 高4位} 0x00, 0x00, // 0x45 , 0x46:H_Border,V_Border 0x1E, // 0x47:bit7=0,不交錯;bit[6:5]=11,正常顯示無立體;bit[4:3]=11,數字分離信號 // 第二個 DTD 0x8C, 0x0A, 0xD0, 0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, // 0x48 ~ 0x59 0x96, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x18, // 第三個 DTD 0x00, 0x00, 0x00, 0xFC, 0x00, 0x49, 0x54, 0x45, 0x36, 0x38, // 0x5A ~ 0x6B 0x30, 0x32, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, // 第四個 DTD 0x00, 0x00, 0x00, 0xFD, 0x00, 0x30, 0x7A, 0x0F, 0x50, 0x10, // 0x6C ~ 0x7D 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, /*-------------------------------------------- Extension Flag ------------------------------------------*/ 0x01, // 0x7E:后面有 EDID 擴展塊(Block 1) 0xF3, // 0x7F:主塊(Block 0)的 Checksum,使前127字節加上此字節的總和為0// EDID 擴展塊(Block 1): 0x80 ~ 0xFF /*---------------------------------------- CEA Extension Header ----------------------------------------*/ 0x02, // 0x80:CEA Extension Tag,固定為 0x02 0x03, // 0x81:修訂號,目前一般為 0x03 0x19, // 0x82:DTD 開始地址,這里表示從 0x19(+0x80) 開始描述 DTD 0x72, // 0x83:bit6=1,支持 basic audio;bit5=1,支持 YUV444;bit4=1,支持 YUV422;bit[3:0]=0010,DTD 個數為2 /*------------------------------------------ Vedio Data Block ------------------------------------------*/ 0x46, // 0x84:bit[7:5]=010,對應 Tag 為 Vedio Data Block(0x02);bit[4:0]=00110,該字節后還有 6 個字節(SVD)屬于這個 VDB 0x90, 0x04, 0x13, 0x01, 0x02, 0x03, // 0x85 ~ 0x8A:每個字節表示支持的一種分辨率,代號與分辨率的關系由 HDMI 標準直接定義 /*------------------------------------------ Audio Data Block ------------------------------------------*/ 0x23, // 0x8B:bit[7:5]=001,對應 Tag 為 Audio Data Block(0x01);bit[4:0]=00011,該字節后還有 3 個字節屬于這個 ADB 0x09, 0x07, 0x07, // 0x8C ~ 0x8E:三個字節為一組,因此這里只有一組聲音相關的描述信息// byte1(0x09)的bit[6:3]=0001,音頻格式為 Linear PCM;bit[2:0]=001,Max Number of channels 為 001+1=2;// byte2(0x07)的bit[6:0]=0000111,支持頻率 48KHz、44.1KHz、32KHz// byte3(0x07)的bit[2:0]=111,支持位寬 24bit、20bit、16bit /*------------------------------------ Speaker Allocation Data Block -----------------------------------*/ 0x83, // 0x8F:bit[7:5]=100,對應 Tag 為 Speaker Allocation Data Block;bit[4:0]=00011,該字節后還有 3 個字節屬于這個 SADB 0x01, 0x00, 0x00, // 0x90 ~ 0x92:三個字節為一組,因此這里只有一組關于喇叭位置的描述信息 /*-------------------------------------- Vendor Specific Data Block ------------------------------------*/ 0x65, // 0x93:bit[7:5]=011,對應 Tag 為 Vendor Specific Data Block(VSDB);bit[4:0]=00101,該字節后還有 5 個字節屬于這個 VSDB 0x03, 0x0C, 0x00, // 0x94 ~ 0x96:H14b VSDB 固定標識,0x000C03 0x10, 0x00, // 0x97 ~ 0x98:CEC物理地址,此處為 1.0.0.0,同時也對應 AB(0x97)、CD(0x98) 的值 /*---------------------------------- Detailed Timing Descriptions(DTD) ---------------------------------*/ 0x01, 0x1D, 0x00, 0x72, 0x51, 0xD0, 0x1E, 0x20, 0x6E, 0x28, // 0x99 ~ 0xAA:補充的第一組 DTD 0x55, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x1E, 0xD6, 0x09, 0x80, 0xA0, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x60, // 0xAB ~ 0xBC:補充的第二組 DTD 0xA2, 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x18, 0x8C, 0x0A, 0xD0, 0x8A, 0x20, 0xE0, 0x2D, 0x10, 0x10, 0x3E, // 0xBC ~ 0xCE:補充的第三組 DTD 0x96, 0x00, 0x10, 0x09, 0x00, 0x00, 0x00, 0x18, /*----------------------------------------------- Reserved ---------------------------------------------*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0xCF:從該字節開始,之后沒有用到的位置均用 0 填充 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /*-------------------------------------------- Extension Flag ------------------------------------------*/ 0x7B // 0xFF:擴展塊(Block 1)的 Checksum,使前127字節加上此字節的總和為0 }/** EDID RAM 初始化* *pIT6801EDID : 用來初始化 EDID RAM 的配置列表*/ static void EDIDRAMInitial(unsigned char *pIT6801EDID) {int i;unsigned char send_buf[4] = {0};unsigned char recv_buf[4] = {0};hdmirxset(0xc0, 0x01, 0x01); // HDMI RegC0[1:0]=11 for disable HDMI DDC bus to access EDID RAMset_iic_mode(0, EDID_I2C_ADDR);printf("Read EDID Table:\n");for(i = 0; i < 256; i++){recv_buf[0] = (unsigned char)i;read(fd_i2c, recv_buf, 1);printf("%02x ",recv_buf[0]);if((i % 16) == 15)printf("\r\n");}printf("Set EDID Table:\n");for(i = 0; i < 256; i++){send_buf[0] = (unsigned char)i;send_buf[1] = *(pIT6801EDID+i);write(fd_i2c, send_buf, 2);printf("%02x ",send_buf[1]);if((i % 16) == 15)printf("\r\n");}// printf("Check EDID Table:\n");// for(i = 0; i < 256; i++)// {// recv_buf[0] = (unsigned char)i;// read(fd_i2c, recv_buf, 1);// printf("%02x ",recv_buf[0]);// if((i % 16) == 15)// printf("\r\n");// }set_iic_mode(0, HDMI_I2C_ADDR);hdmirxset(0xc1, 0xff, 0x97); // VSDB 地址(0x93+4)hdmirxset(0xc2, 0xff, 0x10); // AB 的值hdmirxset(0xc3, 0xff, 0x00); // CD 的值hdmirxset(0xc4, 0xff, pIT6801EDID[127]);hdmirxset(0xc5, 0xff, pIT6801EDID[255]);hdmirxset(0xc0, 0x01, 0x00); // HDMI RegC0[1:0]=00 for enable HDMI DDC bus to access EDID RAM }??雖然和初始的 EDID 推薦顯示模式配置相同,但是從顯示器名還是能看出區別來的:
2.4 中斷處理
??數據手冊里已經指明了軟件中斷處理的必要性。因此,簡單處理一下就是完成初始化以后就進入輪詢的方式,持續檢測幾個中斷相關的寄存器,并根據中斷事件做出相應的處理(DEMO 里后續的視頻輸出配置全部由中斷狀態決定,當然也可以從一開始就設置好固定的輸出格式)。這也是可以從 DEMO 里挑著扒下來的。
2.5 視頻輸出配置
2.5.1 視頻輸入狀態監測
??做完以上部分的工作,就可以通過寄存器 reg0A 持續監測 IT6801 的 input port 狀態了:沒有數據輸入時讀出來的值就是 0x11,有數據輸入時就是 0xaf 或是 0xbf(如果出現了諸如 0x3f 等其他奇怪的值,則有可能是 硬件上的連接問題 QAQ 或是 信號的質量問題 導致的),至此同時實現了 4 步中的前 2 步:
2.5.2 輸出格式配置
??之后的色彩空間配置就可以根據兩張基本表自行調整了:
PS:YUV 601 和 YUV 709 對應兩種不同的標準,601 是 BT601,SDTV 數據結構,BT656 是 SDTV 的接口定義;709 是 BT709,HDTV 數據結構,BT1120 是 HDTV 的接口定義。除此以外,YUV 還有 BT2020 標準(并不是 2020 年出的標準),不同標準下 YUV 和 RGB 之間的轉換參數矩陣也不相同,這就是轉換公式存在不同版本的原因。
??最后是設置輸出引腳。這一部分跟著編程手冊走也沒有問題:
2.5.3 色偏矯正(咕~)
??在配置好 IT6801 后與 Hi3531D 的 VI 對接,出現了下圖的顯示效果:
??隨后將掩碼 1 清零,掩碼 0 依次設置為 0xFF000000 和 0xFF0000測試效果如下:
- 0xFF000000,0x0。這個乍一看不知道該怎么解釋 Orz:
- 0xFF0000,0x0。這個看起來倒是靠譜很多,像是 Y 分量正常而 UV=0 的樣子:
??之后在易百納社區里找到了類似的問題帖:[hi3531/hi3535/hi3536] 求助,Hi3531DV100 接BT1120圖像顏色異常,現象高度相似,硬件連接基本一致,因此大致可以確定 Hi3531D 輸入處存在 Y/C 接反的問題。然而咱使用的 SDK 貌似不是新版的,沒找到軟件設置翻轉的接口,設置分量掩碼也改不過來。硬件修改的話,又不是有很多時間能花在這個比較雞肋的 HDMI 輸入方案(其實軟件也一樣)上,就著 Y 分量的顯示效果往下調 4k 似乎勉強也行(以調通為優先,效果次之),所以本文記錄到此為止。
總結
以上是生活随笔為你收集整理的Hi3531D调试手记(六):IT6801实现HDMI转码BT1120输入VI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以后遇见 visual studio的调
- 下一篇: extern 全局变量在不同的文件使用方