Hi3531D调试手记(六):IT6801实现HDMI转码BT1120输入VI
??Hi3531D 的 MPP 系統(tǒng)中 VI 模塊接收視頻流就是基于 BT656/BT1120 協(xié)議的,開發(fā)板上做出的 HDMI 輸入則是利用 IT6801 將 HDMI 硬件轉(zhuǎn)碼為 BT1120 實現(xiàn)的。雖說自制的板子上同時留了兩種預(yù)案的接口,BT1120 接口也能把圖像數(shù)據(jù)送進(jìn) VI,但是因為其他的一些原因,還是得把 HDMI 輸入也實裝 Orz…
目錄
- 零、私貨(吐槽)
- 一、概念
- 1.1 HDMI 傳輸原理
- 1.2 HPD 與 EDID
- 1.3 IT6801 編程相關(guān)引腳
- 1.4 Linux I2C 驅(qū)動框架
- 二、IT6801驅(qū)動實現(xiàn)
- 2.1 I2C 適配器驅(qū)動配置
- 2.2 HDMI 寄存器初始化配置
- 2.3 EDID 配置
- 2.3.1 啟用內(nèi)部 EDID
- 2.3.2 更新 EDID(自定義 EDID)
- 2.4 中斷處理
- 2.5 視頻輸出配置
- 2.5.1 視頻輸入狀態(tài)監(jiān)測
- 2.5.2 輸出格式配置
- 2.5.3 色偏矯正(咕~)
零、私貨(吐槽)
- 編程手冊上展示的芯片工作流程倒是很簡單,但是調(diào)試起來莫名地痛苦。
- 自己做的板子上跑不了 IT6801 的 DEMO,能否正常輸出暫且不論,單單連跑完 HDMI 寄存器初始化都做不到,嗯,無法理解。
- 網(wǎng)上關(guān)于 IT6801 驅(qū)動開發(fā)的討論簡直少得離譜,又有種以前搗鼓 UWB 的感覺,不過這次的更離譜,官網(wǎng)都不給資料下載。合著這玩意兒的驅(qū)動算商業(yè)機密?
- IT6801 Programming Guide 是真滴難找,大部分資料包里塞的都是 IT6802 的編程手冊,據(jù)說用起來效果是一樣的,在入手 IT6801 的編程手冊之前咱也確實是在參考 IT6802 的手冊來配置 IT6801。但是!可能的話還是建議用 IT6801 Programming Guide 來進(jìn)行開發(fā)。
一、概念
1.1 HDMI 傳輸原理
??HDM(High-Definition Multimedia Interface,高清晰多媒體接口)是一種采用 TMDS (Time Minimized Differential Signal,最小化傳輸差分信號)傳輸技術(shù)的數(shù)字音頻視頻接口。TMDS 是一種微分信號機制,采用差分傳動方式,利用 2 個引腳間電壓差來傳送信號的技術(shù),其傳輸數(shù)據(jù)的數(shù)值(“0” 或者 “1”)由兩腳間電壓正負(fù)極性和大小決定。
??每一個標(biāo)準(zhǔn)的 HDMI 連接,都包含了 3 個用于傳輸數(shù)據(jù)的 TMDS 傳輸通道,還有 1 個獨立的 TMDS 時鐘通道,以保證傳輸時所需的統(tǒng)一時序。在一個時鐘周期內(nèi),每個 TMDS 通道都能
傳送 10bit 的數(shù)據(jù)流。而這 10bit 數(shù)據(jù),可以由若干種不同的編碼格式構(gòu)成。
- HDMI 把視頻信號分為 R、G、B、H、V 五種信號用 TMDS 技術(shù)編碼;
- TMDS 的三個通道分別傳輸 R、G、B 三原色, H、V 編碼在 B 信號通道里面?zhèn)鬏?#xff08;嵌入式傳輸),R、G、B 的多余位置可以用來傳輸音頻信號;
- DDC(Display Data Channel,顯示數(shù)據(jù)通道)用來傳輸接收端支持的視頻配置信息和數(shù)據(jù)格式信息,輸出端會讀取這些 E-EDID,并以此來決定輸出的視頻格式;
- CEC 即消費電子控制通道,通過該通道可以控制視聽設(shè)備的工作。
1.2 HPD 與 EDID
??之前已經(jīng)有人做過 IT6801 的調(diào)試并記錄了心得 —— HDMI接收芯片 IT6801fn 輸入調(diào)試,這算是咱在網(wǎng)絡(luò)上找到的為數(shù)不多的有用信息之一了,這里對其做一些細(xì)化補充。
- 首先介紹 EDID。EDID 的全稱是 Extended Display Identification Data(擴展顯示標(biāo)識數(shù)據(jù)),分為主塊和擴展塊兩個部分,長度均為 128 字節(jié)。主塊包含必要的信息因此必須存在,而擴展塊的內(nèi)容主要和音頻屬性相關(guān)。DVI 和 VGA 沒有音頻,HDMI 自帶音頻,所以 VGA、DVI 的 EDID 由主塊 128 字節(jié)組成,HDMI 的 EDID 則會在主塊的基礎(chǔ)上再增加擴展塊,也就是會有 256 字節(jié)的 EDID。HDMI EDID 擴展塊數(shù)據(jù)規(guī)范按照 CEA-861x 標(biāo)準(zhǔn)定義。EDID 中包含了有關(guān)顯示器及其性能的參數(shù),包括供應(yīng)商信息、最大圖像大小、顏色設(shè)置、廠商預(yù)設(shè)置、頻率范圍的限制以及顯示器名和序列號的字符串等等。形象地說,EDID 就是顯示器的身份證、戶口本、技能證書等證件的集合,目的就是告訴別人我是誰,我從哪來,我能干什么。
- HPD 信號是標(biāo)準(zhǔn) HDMI 接口使用的重要信號之一,用于設(shè)備的熱插拔檢測。這個信號是主機系統(tǒng)用來判斷是否需要對 HDMI/DVI 接口是否發(fā)送 TMDS 信號的依據(jù)。具體的判斷方法為:當(dāng)主機系統(tǒng)檢測到 HDMI 接口上的 HPD 信號從低電平被拉高到高電平時,就認(rèn)為有顯示器連接到 HDMI 口,此時就會作出響應(yīng),請求讀取顯示器端的 EDID 信息,以獲取顯示器支持的顯示時序。如果發(fā)現(xiàn)自己能夠輸出使顯示器正常顯示的視頻信號,主機系統(tǒng)就會開始 TMDS 信號傳輸,將視頻流送出 HDMI 接口。
??因此,要想 IT6801 能夠正常被 PC 識別,就需要在完成初始化工作(包括對 EDID 的設(shè)置)之后主動拉高 HPD才行。另外, IT6801 是有內(nèi)部 EDID RAM,有初始 EDID 的,只要使用自帶的 EDID RAM(具體使用方法后面介紹),就可以不另外設(shè)置 EDID 以及外接 EDID。
1.3 IT6801 編程相關(guān)引腳
??數(shù)據(jù)手冊里對所有的引腳都有進(jìn)行描述,然而這里重點關(guān)注的只有 Programming Pins(硬件設(shè)計部分不歸咱管)。
??雖說硬件不歸咱管,但是 CDSENSE 這個引腳注意一下,雖然描述是用來檢測 MHL 的連接,但是如果確定使用 HDMI 而不使用 MHL 請務(wù)必接地,務(wù)必接地,務(wù)必接地!不要問為什么 QAQ
PS:即便確定了只使用 HDMI 的 Video 部分而無需 Audio 部分,也請務(wù)必保證 Audio 相關(guān)的供電與接地引腳連接到位!
1.4 Linux I2C 驅(qū)動框架
??在裸機開發(fā)中編寫某個使用 I2C 來通信的設(shè)備驅(qū)動時,一般會有兩個部分的驅(qū)動:
- I2C 主機驅(qū)動,這是處理器的 I2C 接口驅(qū)動,一旦編寫完成就不需要再做修改,其他的 I2C 設(shè)備直接調(diào)用主機驅(qū)動提供的 API 函數(shù)完成讀寫操作即可;
- I2C 設(shè)備驅(qū)動。也就是直接適配對應(yīng)設(shè)備的驅(qū)動,一個蘿卜一個坑,不能混用。
??Linux 內(nèi)核根據(jù)驅(qū)動分離與分層的思想,也將 I2C 驅(qū)動分為了類似的兩部分:
- I2C 總線驅(qū)動,就是 SOC 的 I2C 控制器驅(qū)動,也叫做 I2C 適配器驅(qū)動;
- I2C 設(shè)備驅(qū)動,與裸機開發(fā)的 I2C 設(shè)備驅(qū)動類似,就是針對具體的 I2C 設(shè)備而編寫的驅(qū)動。
??Linux 內(nèi)核代碼文件 i2c-dev.c(位置在源碼目錄 drivers/i2c/i2c-dev.c) 中實現(xiàn)了 I2C 適配器設(shè)備文件的功能,針對每個適配器生成一個主設(shè)備號為 89 的設(shè)備節(jié)點(定義在源碼目錄 include/linux/i2c-dev.h 中,次設(shè)備號為 0-255),i2c-dev.c 提供了通用的 read()、write() 和 ioctl() 等文件操作接口,因此在用戶空間的應(yīng)用層就可以借用這些接口訪問掛接在適配器上的 I2C 設(shè)備的存儲空間或寄存器,并控制 I2C 設(shè)備的工作方式。
??I2C 適配器的設(shè)備節(jié)點是 /dev/i2c-x,其中 x 是數(shù)字。由于適配器編號是動態(tài)分配的(和注冊次序有關(guān)),所以想了解哪一個適配器對應(yīng)什么編號,可以查看 /sys/class/i2c-dev/ 目錄下的文件內(nèi)容。
二、IT6801驅(qū)動實現(xiàn)
2.1 I2C 適配器驅(qū)動配置
??雖說可以在 dts 文件下檢查默認(rèn)的引腳復(fù)用配置,但為了保險起見,還是根據(jù)引腳復(fù)用 Excel 表,在 pinmux.sh(引腳復(fù)用的寄存器統(tǒng)一配置腳本)中增加了相關(guān)復(fù)用信息:
#pinmux.sh 增加內(nèi)容 #i2c0 himm 0x120f01cc 1 himm 0x120f01d0 12.2 HDMI 寄存器初始化配置
??首先是打開 I2C 適配器并完成基礎(chǔ)設(shè)置:
/** 打開 I2C 適配器* iic_name : i2c 適配器設(shè)備節(jié)點 /dev/i2c-x* flag : 操作權(quán)限 O_RDWR*/ static int open_iic(const char *iic_name, int flag) {int fd;fd = open(iic_name, flag);return fd; }/** 設(shè)置 I2C 適配器* reg_width : 寄存器和數(shù)據(jù)的寬度 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); // 強制設(shè)置從機地址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"); }- 根據(jù) IT6801 數(shù)據(jù)手冊中的編程相關(guān)引腳描述,IT6801 的器件地址取決于 PCADR 引腳是上拉(0x92)還是下拉(0x90),這里是下拉,因此 iic_addr 的值為 0x90:
- 寄存器位寬和數(shù)據(jù)位寬經(jīng)由手冊可以判斷出應(yīng)為 8 位,因此 regwidth 的值為 0:
- I2C_SLAVE_FORCE、I2C_16BIT_REG、I2C_16BIT_DATA 均為定義在內(nèi)核源碼目錄的 include/uapi/linux/i2c-dev.h 中的 IOCTL 宏:
??接下來就是根據(jù)編程手冊里的推薦順序來初始化寄存器了(總表長度占了一整頁,這里只截取了一部分):
??就結(jié)果來看,是能正常配置 IT6801 的寄存器的,而此時還沒有做其他的配置,PC 并未識別出 IT6801 芯片:
2.3 EDID 配置
2.3.1 啟用內(nèi)部 EDID
??根據(jù)編程手冊的說法,如果要啟用內(nèi)部 EDID,就需要斷開與外部 EDID ROM DDC 總線的連接,同時在 reg87 使能 EDID Block 的訪問權(quán)限并設(shè)置好 EDID 的 I2C 從機地址。在初始化代碼中增加如下部分:
??有了關(guān)于 EDID 和 HPD 的設(shè)置,現(xiàn)在已經(jīng)能被 PC 識別到:
2.3.2 更新 EDID(自定義 EDID)
??IT6801 內(nèi)部自帶的 EDID 已經(jīng)直接將 1080p 設(shè)置為了推薦分辨率,如無特殊要求可以直接使用(個人的需求是 4k,改肯定是要改的,但是本文就以 1080p 接著往下調(diào)了)。如果需要修改,就需要根據(jù)之前設(shè)置好的 EDID RAM 的 I2C 從機地址修改 I2C 接口設(shè)置,以查看和修改 EDID RAM 內(nèi)的數(shù)據(jù)。注意,RAM 已經(jīng)足夠說明這里的修改只是本次運行的設(shè)置修改,掉電就會失效。EDID RAM 的配置列表可以直接從 DEMO 里扒出來,在熟悉 EDID 結(jié)構(gòu)的基礎(chǔ)上可以自行修改配置,沒必要把 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開始標(biāo)志 /*----------------------------------- Vendor / Product Identification ----------------------------------*/ 0x26, 0x85, // 0x08 ~ 0x09:制造商名稱 0x02, 0x68, // 0x0A ~ 0x0B:產(chǎn)品代碼 0x01, 0x68, 0x00, 0x00, // 0x0C ~ 0x0F:產(chǎn)品序列號 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,數(shù)字信號) 0x73, 0x41, // 0x15 , 0x16:最大水平圖像尺寸(cm),最大垂直圖像尺寸(cm) 0x78, // 0x17:顯示傳輸特性(Gamma * 100 - 100)范圍[1,3.55] 0x2A, // 0x18:電源管理標(biāo)準(zhǔn) 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:紅綠、藍(lán)白場的 xy 坐標(biāo)信息 /*----------------------------------------- Established Timings ----------------------------------------*/ 0x00, 0x00, 0x00, // 0x23 ~ 0x25:提供基本固定的一些輸出時序,未使用時設(shè)為 0x00 /*----------------------------------- Standard Timing Identification -----------------------------------*/ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, // 0x26 ~ 0x35:提供最多 8 種分辨率的識別,兩兩一組,未使用時設(shè)為 0x01 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, /*---------------------------------- Detailed Timing Descriptions(DTD) ---------------------------------*/ // 推薦分辨率(單個 DTD 占 18 字節(jié),共可記錄 4 個 DTD,因此這一部分共占 72 字節(jié)) 0x02, 0x3A, // 0x36 , 0x37:十進(jìn)制像素時鐘/10000,先存儲低8位,這里存儲的時鐘頻率就是 148.5MHz(0x3A02) 0x80, 0x18, 0x71, // 0x38 ~ 0x3A:分別對應(yīng) 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 參數(shù)信息,與 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,數(shù)字分離信號 // 第二個 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字節(jié)加上此字節(jié)的總和為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 個數(shù)為2 /*------------------------------------------ Vedio Data Block ------------------------------------------*/ 0x46, // 0x84:bit[7:5]=010,對應(yīng) Tag 為 Vedio Data Block(0x02);bit[4:0]=00110,該字節(jié)后還有 6 個字節(jié)(SVD)屬于這個 VDB 0x90, 0x04, 0x13, 0x01, 0x02, 0x03, // 0x85 ~ 0x8A:每個字節(jié)表示支持的一種分辨率,代號與分辨率的關(guān)系由 HDMI 標(biāo)準(zhǔn)直接定義 /*------------------------------------------ Audio Data Block ------------------------------------------*/ 0x23, // 0x8B:bit[7:5]=001,對應(yīng) Tag 為 Audio Data Block(0x01);bit[4:0]=00011,該字節(jié)后還有 3 個字節(jié)屬于這個 ADB 0x09, 0x07, 0x07, // 0x8C ~ 0x8E:三個字節(jié)為一組,因此這里只有一組聲音相關(guān)的描述信息// 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,對應(yīng) Tag 為 Speaker Allocation Data Block;bit[4:0]=00011,該字節(jié)后還有 3 個字節(jié)屬于這個 SADB 0x01, 0x00, 0x00, // 0x90 ~ 0x92:三個字節(jié)為一組,因此這里只有一組關(guān)于喇叭位置的描述信息 /*-------------------------------------- Vendor Specific Data Block ------------------------------------*/ 0x65, // 0x93:bit[7:5]=011,對應(yīng) Tag 為 Vendor Specific Data Block(VSDB);bit[4:0]=00101,該字節(jié)后還有 5 個字節(jié)屬于這個 VSDB 0x03, 0x0C, 0x00, // 0x94 ~ 0x96:H14b VSDB 固定標(biāo)識,0x000C03 0x10, 0x00, // 0x97 ~ 0x98:CEC物理地址,此處為 1.0.0.0,同時也對應(yīng) 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:從該字節(jié)開始,之后沒有用到的位置均用 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字節(jié)加上此字節(jié)的總和為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 推薦顯示模式配置相同,但是從顯示器名還是能看出區(qū)別來的:
2.4 中斷處理
??數(shù)據(jù)手冊里已經(jīng)指明了軟件中斷處理的必要性。因此,簡單處理一下就是完成初始化以后就進(jìn)入輪詢的方式,持續(xù)檢測幾個中斷相關(guān)的寄存器,并根據(jù)中斷事件做出相應(yīng)的處理(DEMO 里后續(xù)的視頻輸出配置全部由中斷狀態(tài)決定,當(dāng)然也可以從一開始就設(shè)置好固定的輸出格式)。這也是可以從 DEMO 里挑著扒下來的。
2.5 視頻輸出配置
2.5.1 視頻輸入狀態(tài)監(jiān)測
??做完以上部分的工作,就可以通過寄存器 reg0A 持續(xù)監(jiān)測 IT6801 的 input port 狀態(tài)了:沒有數(shù)據(jù)輸入時讀出來的值就是 0x11,有數(shù)據(jù)輸入時就是 0xaf 或是 0xbf(如果出現(xiàn)了諸如 0x3f 等其他奇怪的值,則有可能是 硬件上的連接問題 QAQ 或是 信號的質(zhì)量問題 導(dǎo)致的),至此同時實現(xiàn)了 4 步中的前 2 步:
2.5.2 輸出格式配置
??之后的色彩空間配置就可以根據(jù)兩張基本表自行調(diào)整了:
PS:YUV 601 和 YUV 709 對應(yīng)兩種不同的標(biāo)準(zhǔn),601 是 BT601,SDTV 數(shù)據(jù)結(jié)構(gòu),BT656 是 SDTV 的接口定義;709 是 BT709,HDTV 數(shù)據(jù)結(jié)構(gòu),BT1120 是 HDTV 的接口定義。除此以外,YUV 還有 BT2020 標(biāo)準(zhǔn)(并不是 2020 年出的標(biāo)準(zhǔn)),不同標(biāo)準(zhǔn)下 YUV 和 RGB 之間的轉(zhuǎn)換參數(shù)矩陣也不相同,這就是轉(zhuǎn)換公式存在不同版本的原因。
??最后是設(shè)置輸出引腳。這一部分跟著編程手冊走也沒有問題:
2.5.3 色偏矯正(咕~)
??在配置好 IT6801 后與 Hi3531D 的 VI 對接,出現(xiàn)了下圖的顯示效果:
??隨后將掩碼 1 清零,掩碼 0 依次設(shè)置為 0xFF000000 和 0xFF0000測試效果如下:
- 0xFF000000,0x0。這個乍一看不知道該怎么解釋 Orz:
- 0xFF0000,0x0。這個看起來倒是靠譜很多,像是 Y 分量正常而 UV=0 的樣子:
??之后在易百納社區(qū)里找到了類似的問題帖:[hi3531/hi3535/hi3536] 求助,Hi3531DV100 接BT1120圖像顏色異常,現(xiàn)象高度相似,硬件連接基本一致,因此大致可以確定 Hi3531D 輸入處存在 Y/C 接反的問題。然而咱使用的 SDK 貌似不是新版的,沒找到軟件設(shè)置翻轉(zhuǎn)的接口,設(shè)置分量掩碼也改不過來。硬件修改的話,又不是有很多時間能花在這個比較雞肋的 HDMI 輸入方案(其實軟件也一樣)上,就著 Y 分量的顯示效果往下調(diào) 4k 似乎勉強也行(以調(diào)通為優(yōu)先,效果次之),所以本文記錄到此為止。
總結(jié)
以上是生活随笔為你收集整理的Hi3531D调试手记(六):IT6801实现HDMI转码BT1120输入VI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 以后遇见 visual studio的调
- 下一篇: extern 全局变量在不同的文件使用方