戰(zhàn)指南:HDMI轉(zhuǎn)MIPI初始化配置與調(diào)試避坑)
簡(jiǎn)介IT66021視頻處理芯片的完整技術(shù)資料包面向從事高清電視、監(jiān)視器、投影儀等顯示設(shè)備硬件設(shè)計(jì)及嵌入式驅(qū)動(dòng)開(kāi)發(fā)的工程師可用于芯片選型、電路原理圖設(shè)計(jì)、寄存器配置與底層軟件調(diào)試。壓縮包共15個(gè)文件大小約1.45MB包含2份PDF文檔數(shù)據(jù)手冊(cè)與編程指南、7個(gè)C語(yǔ)言源文件和7個(gè)頭文件覆蓋驅(qū)動(dòng)主體、寄存器映射、調(diào)試接口等代碼模塊。目前已有206人學(xué)習(xí)下載。資料詳細(xì)介紹了芯片的制造工藝、封裝形式、引腳定義及電氣特性并對(duì)每個(gè)寄存器的位寬、位定義、讀寫(xiě)屬性和默認(rèn)值進(jìn)行了說(shuō)明便于開(kāi)發(fā)者快速配置視頻處理功能。配套的SDK驅(qū)動(dòng)源碼提供了直接可用的接口函數(shù)和示例邏輯能夠幫助讀者理解HDMI輸入控制、圖像處理算法部署等流程減少重復(fù)開(kāi)發(fā)工作縮短產(chǎn)品落地周期。 做嵌入式這幾年凡是涉及HDMI輸入轉(zhuǎn)MIPI輸出的項(xiàng)目大概率繞不開(kāi)ITE聯(lián)陽(yáng)半導(dǎo)體的IT66021。這顆芯片在汽車(chē)環(huán)視、視頻采集、醫(yī)療顯示、工業(yè)相機(jī)這些場(chǎng)景里出現(xiàn)頻率非常高很多人第一次拿到它的芯片資料時(shí)面對(duì)幾百頁(yè)的英文手冊(cè)和密密麻麻的寄存器表格第一反應(yīng)就是懵。這篇文章就圍繞IT66021的芯片資料怎么讀、初始化配置怎么調(diào)、實(shí)際調(diào)試中會(huì)踩哪些坑把我自己的經(jīng)驗(yàn)整理出來(lái)。如果你是第一次用這顆芯片或者正卡在資料看了半天還是不出圖的階段這篇應(yīng)該能幫你省下不少時(shí)間。1. IT66021核心定位HDMI轉(zhuǎn)MIPI CSI-2的橋接芯片1.1 這顆芯片到底解決什么問(wèn)題IT66021是聯(lián)陽(yáng)半導(dǎo)體推出的一顆HDMI 2.0接收橋接芯片核心作用是把HDMI信號(hào)轉(zhuǎn)成MIPI CSI-2接口輸出。這么說(shuō)可能有點(diǎn)抽象我打個(gè)比方HDMI就像電視機(jī)的信號(hào)入口而MIPI CSI-2則是大多數(shù)應(yīng)用處理器SoC攝像頭接口的方言。你的主控芯片沒(méi)有HDMI輸入能力但有一顆現(xiàn)成的MIPI CSI-2控制器這時(shí)候就需要IT66021這樣的同聲傳譯在中間把兩種協(xié)議互相轉(zhuǎn)換。很多工程師拿到這顆芯片的第一反應(yīng)是這不就是個(gè)轉(zhuǎn)接芯片嘛接上就能用。實(shí)際上它內(nèi)部包含完整的HDMI接收前端、EDID管理、HDCP解密部分版本、視頻格式解析和MIPI發(fā)送端任何一個(gè)環(huán)節(jié)配置不對(duì)輸出端就是黑屏。這也是為什么初始化配置會(huì)成為芯片資料檢索的高頻關(guān)鍵詞——光有硬件連接是不夠的寄存器的配置順序和參數(shù)才是出圖的關(guān)鍵。1.2 關(guān)鍵參數(shù)速覽我在選型和方案評(píng)審時(shí)習(xí)慣先把核心參數(shù)列成一張表IT66021常見(jiàn)的關(guān)注點(diǎn)大致如下項(xiàng)目規(guī)格說(shuō)明HDMI輸入HDMI 2.0支持4K分辨率具體幀率與色深以手冊(cè)為準(zhǔn)輸出接口MIPI CSI-2最多4路數(shù)據(jù)lane加1路時(shí)鐘lane控制接口I2C用于寄存器讀寫(xiě)、EDID配置、狀態(tài)查詢視頻格式RGB/YUV支持常見(jiàn)色彩空間轉(zhuǎn)換封裝形式QFN類(lèi)具體引腳數(shù)以官方數(shù)據(jù)手冊(cè)為準(zhǔn)供電多路電源通常包含3.3V和1.2V等需按手冊(cè)設(shè)計(jì)工作溫度工業(yè)級(jí)/車(chē)規(guī)級(jí)不同尾綴對(duì)應(yīng)不同溫度等級(jí)注意一個(gè)容易被忽視的細(xì)節(jié)IT66021后面經(jīng)常帶不同尾綴比如IT66021E不同版本可能在HDCP、音頻提取、固件行為上有差異。采購(gòu)下單前一定要跟供應(yīng)商確認(rèn)尾綴否則畫(huà)好了板子才發(fā)現(xiàn)版本不對(duì)返工成本很高。1.3 選型時(shí)容易被忽略的幾個(gè)細(xì)節(jié)第一確認(rèn)你的主控MIPI CSI-2控制器是否支持足夠的lane數(shù)和數(shù)據(jù)速率。IT66021輸出4K信號(hào)時(shí)對(duì)MIPI帶寬要求很高如果SoC端的CSI-2控制器只有2 lane且速率上限不夠就只能在分辨率、刷新率或色彩深度上做妥協(xié)。第二確認(rèn)輸入信號(hào)的HDCP需求。如果你的應(yīng)用需要播放受保護(hù)內(nèi)容必須選擇支持對(duì)應(yīng)HDCP版本并完成相關(guān)認(rèn)證授權(quán)的型號(hào)。第三留意晶振。這類(lèi)橋接芯片通常需要外部晶振提供參考時(shí)鐘晶振頻率和精度會(huì)直接影響輸出抖動(dòng)選便宜的貼片晶振沒(méi)問(wèn)題但ppm參數(shù)別太隨意。2. 拿到芯片資料第一步先吃透這幾章再動(dòng)手2.1 功能框圖先建立整體數(shù)據(jù)流概念我自己讀芯片資料的習(xí)慣是不急著翻寄存器表先把功能框圖看明白。IT66021的數(shù)據(jù)手冊(cè)里通常會(huì)給一張內(nèi)部架構(gòu)圖從HDMI RX前端開(kāi)始經(jīng)過(guò)視頻處理核心再到MIPI TX輸出。你需要在腦子里建立這樣一條數(shù)據(jù)流HDMI信號(hào)進(jìn)來(lái)→接收前端做均衡和時(shí)鐘恢復(fù)→EDID和HDCP握手→視頻流解析和格式轉(zhuǎn)換→MIPI打包→通過(guò)lane輸出給SoC。建立這個(gè)整體概念之后再看寄存器表就不會(huì)暈。每一組寄存器其實(shí)都在控制這條流水線上的某一個(gè)環(huán)節(jié)比如時(shí)鐘相關(guān)寄存器、輸入源選擇寄存器、輸出lane配置寄存器。你先知道這步是干什么的再去看具體寄存器位域閱讀效率會(huì)高很多。2.2 引腳定義與硬件連接引腳定義這章是所有硬件問(wèn)題的根源。畫(huà)原理圖時(shí)最容易翻車(chē)的幾個(gè)點(diǎn)復(fù)位引腳的上拉/下拉電阻。有些設(shè)計(jì)里復(fù)位引腳內(nèi)部有弱上拉外部再掛一個(gè)大電容做延時(shí)上電復(fù)位但這樣會(huì)導(dǎo)致復(fù)位釋放時(shí)間不可控強(qiáng)烈建議還是用GPIO或復(fù)位IC控制。I2C引腳的上拉電阻。I2C總線必須要有上拉電阻阻值常見(jiàn)2.2kΩ到4.7kΩ具體看總線速率和走線長(zhǎng)度。布線太長(zhǎng)時(shí)上拉電阻太小會(huì)導(dǎo)致信號(hào)邊沿過(guò)沖太大則上升沿太慢。MIPI lane的差分走線阻抗。CSI-2信號(hào)是高速差分對(duì)走線必須按100Ω差分阻抗控制等長(zhǎng)處理也要做足。很多偶爾出圖、偶爾花屏的問(wèn)題最后查出來(lái)都是MIPI走線阻抗沒(méi)控制好。2.3 上電時(shí)序和復(fù)位最容易翻車(chē)的地方芯片資料里的Power Sequence章節(jié)看起來(lái)平平無(wú)奇卻是實(shí)際項(xiàng)目中最容易返工的地方。IT66021這類(lèi)多電源芯片通常有上電順序要求比如先給模擬電源再給數(shù)字核心電源或者要求電源穩(wěn)定后復(fù)位信號(hào)再釋放。不滿足時(shí)序要求時(shí)芯片可能進(jìn)入異常狀態(tài)表現(xiàn)為I2C能通信但不出圖或者干脆無(wú)響應(yīng)。我的做法是在原理圖階段就加上電源時(shí)序控制比如用帶時(shí)序控制的PMIC或者用RC延時(shí)配合復(fù)位IC。調(diào)試時(shí)用示波器同時(shí)抓電源和復(fù)位引腳確認(rèn)先后順序。很多同學(xué)遇到芯片不工作先懷疑芯片壞了其實(shí)十有八九是上電時(shí)序不對(duì)。2.4 寄存器地圖的閱讀方法芯片資料的寄存器章節(jié)通常按功能模塊分組IT66021的寄存器地圖一般會(huì)標(biāo)注寄存器地址、名稱(chēng)、讀寫(xiě)屬性、默認(rèn)值、位域說(shuō)明。我建議拿到資料后先做一個(gè)備份表格把默認(rèn)值單獨(dú)列出來(lái)方便以后調(diào)試時(shí)對(duì)比這個(gè)值被我改過(guò)沒(méi)有。另外特別留意標(biāo)記為Reserved的位這些位一般要求保持默認(rèn)值不要為了優(yōu)化隨意去寫(xiě)。芯片廠商測(cè)試時(shí)用的就是默認(rèn)配置你改了保留位輕則配置無(wú)效重則芯片行為異常且沒(méi)有任何報(bào)錯(cuò)。3. 初始化配置實(shí)戰(zhàn)讓IT66021正常出圖3.1 硬件檢查清單上電前先過(guò)一遍寫(xiě)代碼之前先花十分鐘檢查硬件能省掉后面一整天的調(diào)試時(shí)間。我的檢查清單固定這幾項(xiàng)量一下各路電源電壓是否在手冊(cè)規(guī)格范圍內(nèi)紋波是否過(guò)大。確認(rèn)晶振起振頻率是否準(zhǔn)確。晶振不振的情況下芯片I2C能通但HDMI信號(hào)沒(méi)法鎖住。檢查復(fù)位引腳電平狀態(tài)確認(rèn)沒(méi)有被異常拉低。確認(rèn)I2C地址引腳的電平設(shè)置。部分芯片的從機(jī)地址可以通過(guò)引腳拉高拉低來(lái)改變畫(huà)板時(shí)如果懸空實(shí)際地址可能與默認(rèn)值不同。MIPI輸出端不要接反lane順序。數(shù)據(jù)lane的順序在部分設(shè)計(jì)里可以寄存器重映射但默認(rèn)情況下必須按手冊(cè)對(duì)應(yīng)。3.2 I2C通信與芯片ID驗(yàn)證I2C是所有配置的基礎(chǔ)先確保I2C通路是通的再談初始化。IT66021的從機(jī)地址在數(shù)據(jù)手冊(cè)的I2C章節(jié)里寫(xiě)得清清楚楚不同版本可能不同不要憑經(jīng)驗(yàn)猜。通信基碼框架大概是這樣的#define IT66021_I2C_ADDR 0x70 /* 以具體手冊(cè)為準(zhǔn) */ static int it66021_write_reg(uint8_t reg, uint8_t val) { uint8_t buf[2] {reg, val}; return i2c_master_transmit(IT66021_I2C_ADDR, buf, 2); } static int it66021_read_reg(uint8_t reg, uint8_t *val) { return i2c_master_transmit_then_receive(IT66021_I2C_ADDR, reg, 1, val, 1); }初始化代碼第一步永遠(yuǎn)是讀取芯片ID寄存器確認(rèn)返回值匹配手冊(cè)給出的芯片ID。如果ID讀不對(duì)先別急著往下調(diào)大概率是I2C地址、上電時(shí)序或復(fù)位有問(wèn)題。這一步的意義是建立通信正常的信心后面所有寄存器的寫(xiě)入才有意義。3.3 初始化流程與配置項(xiàng)拆解IT66021的初始化配置沒(méi)有一個(gè)能覆蓋所有設(shè)計(jì)的萬(wàn)能序列因?yàn)榫д耦l率、目標(biāo)分辨率、MIPI lane數(shù)、輸入信號(hào)格式都會(huì)影響具體寄存器值。但整體流程是固定的void it66021_init(void) { /* 1. 復(fù)位與上電等待 */ gpio_set(IT66021_RST_PIN, 0); delay_ms(10); gpio_set(IT66021_RST_PIN, 1); delay_ms(50); /* 2. 讀取芯片ID確認(rèn)I2C通路 */ uint8_t id 0; it66021_read_reg(IT66021_REG_CHIP_ID, id); if (id ! IT66021_EXPECT_ID) { printf(IT66021 ID error: 0x%02X\n, id); return; } /* 3. 按實(shí)際硬件配置系統(tǒng)時(shí)鐘 */ it66021_write_reg(REG_SYS_CLK_CFG, CLK_CFG_27M); /* 以實(shí)際晶振為準(zhǔn) */ /* 4. 配置HDMI輸入路徑 */ it66021_write_reg(REG_HDMI_RX_CFG, HDMI_RX_ENABLE); /* 5. 配置MIPI TX輸出lane和速率 */ it66021_write_reg(REG_MIPI_LANE_NUM, MIPI_4LANE); it66021_write_reg(REG_MIPI_DATA_RATE, MIPI_RATE_1_5G); /* 6. 配置中斷使能等待HPD和信號(hào)鎖定 */ it66021_write_reg(REG_INT_MASK, INT_HPD | INT_VIDEO_STABLE); }這段代碼里我用寄存器名代替了具體地址因?yàn)椴煌姹臼謨?cè)的地址可能不同。實(shí)操時(shí)拿著手冊(cè)把每個(gè)宏定義對(duì)照填進(jìn)去就行。重點(diǎn)提醒配置順序很重要先配系統(tǒng)時(shí)鐘再配輸入路徑最后配輸出和中斷盡量不要顛倒。MIPI輸出如果先使能了可能在沒(méi)有有效視頻流時(shí)產(chǎn)生錯(cuò)誤狀態(tài)。3.4 EDID和HPDHDMI握手的關(guān)鍵HDMI源端比如機(jī)頂盒、電腦要輸出信號(hào)前提是它通過(guò)HPD引腳檢測(cè)到顯示設(shè)備接入然后通過(guò)DDC通道讀取EDID確認(rèn)顯示設(shè)備支持的分辨率。IT66021內(nèi)部有EDID RAM也可以外掛EEPROM。你要做的是把一段有效的EDID數(shù)據(jù)通過(guò)I2C寫(xiě)進(jìn)去并確保HPD引腳電平正確。EDID數(shù)據(jù)至少包含128字節(jié)的基礎(chǔ)塊里面聲明了顯示器名稱(chēng)、支持的分辨率、像素時(shí)鐘等。很多項(xiàng)目直接用公版EDID也能用但如果你的MIPI輸出能力有限建議在EDID里就限制源端只輸出你支持的格式免得源端輸出一個(gè)4K60你的MIPI帶寬卻扛不住。這個(gè)思路和調(diào)試其他顯示相關(guān)芯片時(shí)的初始化配置思路完全一致——先約束輸入再轉(zhuǎn)換輸出。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 I2C讀不到芯片ID這是最常見(jiàn)的首戰(zhàn)問(wèn)題。我的排查順序先量電源電壓確認(rèn)每路都正常再用示波器抓晶振引腳確認(rèn)起振接著檢查復(fù)位引腳確認(rèn)拉高釋放最后核對(duì)I2C地址和上拉電阻。還有一個(gè)容易忽略的點(diǎn)部分評(píng)估板上I2C地址引腳通過(guò)電阻選擇地址板子上的默認(rèn)跳線可能和你代碼里寫(xiě)的不一樣。用I2C掃描工具全地址掃一遍比盯著手冊(cè)猜地址高效得多。4.2 HDMI插上后SoC檢測(cè)不到信號(hào)軟件配置看起來(lái)都對(duì)但SoC的MIPI接收端就是收不到數(shù)據(jù)。這時(shí)候要分兩頭查一頭查HDMI前端看IT66021有沒(méi)有正確識(shí)別到HDMI信號(hào)插入中斷狀態(tài)寄存器里HPD和信號(hào)鎖定標(biāo)志有沒(méi)有置位另一頭查MIPI輸出看lane上有沒(méi)有實(shí)際波形數(shù)據(jù)速率是否在SoC支持范圍內(nèi)。如果HPD信號(hào)沒(méi)拉高源端根本不會(huì)輸出視頻流問(wèn)題大概率在EDID沒(méi)寫(xiě)對(duì)或者HPD引腳配置錯(cuò)誤。如果HPD和鎖定標(biāo)志都正常但沒(méi)有MIPI波形重點(diǎn)查lane數(shù)和時(shí)鐘配置。我遇到過(guò)最隱蔽的一次問(wèn)題是MIPI lane正負(fù)極性接反示波器量了半個(gè)小時(shí)才反應(yīng)過(guò)來(lái)。4.3 MIPI輸出花屏、閃屏花屏和閃屏這類(lèi)問(wèn)題優(yōu)先懷疑信號(hào)完整性和時(shí)鐘穩(wěn)定性。先用示波器看MIPI時(shí)鐘lane的波形質(zhì)量如果眼圖明顯惡化查差分走線阻抗、等長(zhǎng)、參考層是否連續(xù)。其次檢查數(shù)據(jù)lane的速率配置速率設(shè)置過(guò)高會(huì)導(dǎo)致接收端采樣錯(cuò)誤。還有一種情況是SoC端MIPI配置的lane數(shù)和IT66021實(shí)際輸出的lane數(shù)不一致。兩邊各配各的明明都正確但就是花屏。這種問(wèn)題在聯(lián)調(diào)時(shí)特別常見(jiàn)所以我在項(xiàng)目里會(huì)先把lane數(shù)和輸出分辨率寫(xiě)死在雙方代碼里聯(lián)調(diào)通過(guò)后再做動(dòng)態(tài)切換。4.4 4K不穩(wěn)定但1080p正常輸入4K時(shí)圖像時(shí)有時(shí)無(wú)切到1080p就一切正常。這種問(wèn)題十有八九是帶寬或散熱問(wèn)題。帶寬方面確認(rèn)MIPI總速率能否承載4K的像素時(shí)鐘必要時(shí)降低色彩深度或用YUV 4:2:0格式。散熱方面4K模式下數(shù)據(jù)量大芯片功耗上升如果散熱焊盤(pán)接地不良或者PCB銅皮面積不足芯片過(guò)熱會(huì)觸發(fā)內(nèi)部保護(hù)表現(xiàn)為跑一會(huì)兒就黑屏。4.5 常見(jiàn)問(wèn)題速查表現(xiàn)象優(yōu)先排查方向常見(jiàn)根因I2C無(wú)響應(yīng)電源、晶振、復(fù)位、地址上電時(shí)序不滿足I2C地址引腳配置錯(cuò)誤芯片ID錯(cuò)誤I2C波形、地址掃描總線地址錯(cuò)誤或從機(jī)地址被引腳改變無(wú)HDMI信號(hào)HPD、EDID、中斷狀態(tài)EDID未寫(xiě)入、HPD引腳未正確驅(qū)動(dòng)MIPI無(wú)輸出lane極性、速率、使能順序lane接反、速率超出SoC能力花屏閃屏信號(hào)完整性、時(shí)鐘精度走線阻抗不連續(xù)、速率配置失配4K不穩(wěn)定帶寬、散熱、格式Y(jié)UV格式未調(diào)整、芯片過(guò)溫5. 一起被搜的那些芯片資料一套通用的干活思路5.1 為什么總有人一起搜中文資料和初始化配置和IT66021經(jīng)常一起出現(xiàn)在搜索記錄里的還有EG2132、GC9307、MT3608、TC5020A這些芯片它們分別是電機(jī)驅(qū)動(dòng)、LCD屏驅(qū)動(dòng)、升壓電源、電源管理/驅(qū)動(dòng)類(lèi)的器件。表面看領(lǐng)域完全不搭但檢索的人都有一個(gè)共同訴求拿到芯片資料之后能快速把初始化配置跑通。LCD驅(qū)動(dòng)芯片要初始化序列才能點(diǎn)亮屏幕升壓芯片要配置反饋電阻和補(bǔ)償網(wǎng)絡(luò)才能輸出穩(wěn)定電壓橋接芯片要寄存器配置才能出圖——本質(zhì)上都是在解決芯片上電后怎么讓它按預(yù)期工作這件事。很多原廠資料只有英文版寄存器說(shuō)明又寫(xiě)得極簡(jiǎn)工程師只能去搜中文資料、搜初始化配置、搜例程。我的體會(huì)是中文資料能幫你快速建立概念但最終做設(shè)計(jì)必須以官方數(shù)據(jù)手冊(cè)和應(yīng)用筆記為準(zhǔn)。網(wǎng)上的初始化代碼只能當(dāng)參考因?yàn)榧拇嫫鞯刂房赡芤虬姹静煌淖冎苯訌?fù)制很容易踩坑。5.2 一套通用的找資料和初始化方法不管換到哪顆芯片我固定用這套方法先找官方數(shù)據(jù)手冊(cè)和應(yīng)用筆記確認(rèn)芯片ID和上電時(shí)序再找原廠或代理商要參考代碼對(duì)著硬件設(shè)計(jì)逐項(xiàng)核對(duì)而不是盲抄接著寫(xiě)一個(gè)最小的初始化流程——復(fù)位、讀ID、配時(shí)鐘、配核心功能、使能輸出最后用狀態(tài)寄存器驗(yàn)證每一級(jí)是否生效。IT66021的調(diào)試我用的是這個(gè)流程之前調(diào)試LCD驅(qū)動(dòng)和電源芯片也是這套。核心就是一條每一步都驗(yàn)證確認(rèn)通過(guò)了再進(jìn)下一步?;氐絀T66021我的建議是手里常備三樣?xùn)|西數(shù)據(jù)手冊(cè)的寄存器章節(jié)PDF、一個(gè)能掃I2C地址的邏輯分析儀、一塊帶示波器探頭的調(diào)試環(huán)境。芯片本身不算難用真正花時(shí)間的往往是對(duì)著資料找為什么我配置了沒(méi)生效。把硬件時(shí)序和寄存器關(guān)系理順之后這顆芯片其實(shí)相當(dāng)穩(wěn)定特別是在工業(yè)級(jí)和車(chē)載這種需要長(zhǎng)時(shí)間運(yùn)行的場(chǎng)景里它的表現(xiàn)值得信賴(lài)。最后再分享一個(gè)習(xí)慣每次調(diào)試出問(wèn)題先在手冊(cè)里找對(duì)應(yīng)的狀態(tài)寄存器而不是盲目改配置參數(shù)。芯片很多時(shí)候已經(jīng)把哪里不對(duì)告訴你了只是你沒(méi)去看它的狀態(tài)位。本文還有配套的精品資源點(diǎn)擊獲取