練與EDID調(diào)試)
DisplayPort 這套協(xié)議里大家平時(shí)盯得最多的往往是主鏈路的帶寬——HBR2、HBR3、UHBR 這些名詞一出來(lái)討論就熱鬧了。但真正讓一根 DP 線插上就能用、拔了還能重連、顯示器型號(hào)自動(dòng)識(shí)別、固件還能在線升級(jí)的其實(shí)是那條不起眼的邊帶通道AUX Channel。它只有 1Mbps 左右的速率一根線里就一對(duì)差分對(duì)卻承擔(dān)了鏈路訓(xùn)練、EDID 讀取、DPCD 寄存器訪問(wèn)、熱插拔事件上報(bào)這些關(guān)鍵活兒??梢哉f(shuō)主鏈路負(fù)責(zé)搬像素AUX Channel 負(fù)責(zé)談條件沒(méi)有它主鏈路連該用幾個(gè) lane、跑多快都定不下來(lái)。這篇內(nèi)容我打算把 AUX Channel 從物理層到協(xié)議層、從寄存器到實(shí)際抓包調(diào)試完整地捋一遍。適合正在做 DP 驅(qū)動(dòng)開(kāi)發(fā)、顯示器固件、Type-C/DP 轉(zhuǎn)接方案或者單純想搞明白為什么我的顯示器偶爾識(shí)別不出來(lái)的硬件和嵌入式工程師。文中會(huì)涉及 EDID 解析、DPCD 地址空間、鏈路訓(xùn)練流程、以及用 Linux 側(cè)工具提取 EDID 的實(shí)操盡量做到看完能上手、能排錯(cuò)。1. 為什么一條 1Mbps 的邊帶通道能決定整條鏈路的成敗1.1 AUX Channel 到底在 DP 協(xié)議棧里扮演什么角色先把概念擺正。DisplayPort 的物理連接里其實(shí)有兩套獨(dú)立的通道一套是主鏈路Main Link負(fù)責(zé)高速視頻數(shù)據(jù)傳輸速率從 RBR 的 1.62Gbps 一路到 UHBR20 的 20Gbps per lane另一套就是AUX Channel輔助通道是一對(duì)雙向、半雙工的差分線速率標(biāo)稱 1Mbps實(shí)際工作在 Manchester 編碼下有效載荷速率大約 720kbps 左右。很多人第一次接觸會(huì)以為 AUX 只是讀個(gè) EDID 用的這個(gè)理解太窄了。AUX 承擔(dān)的事情至少包括這幾類鏈路訓(xùn)練與維護(hù)Source 和 Sink 通過(guò) AUX 讀寫(xiě) DPCD 寄存器協(xié)商 lane 數(shù)量、電壓擺幅、預(yù)加重、速率等級(jí)訓(xùn)練失敗還要重試。EDID/E-EDID 讀取顯示器能力描述包括支持的分辨率、刷新率、色深、音頻格式等全部通過(guò) AUX 從 Sink 的 EDID 存儲(chǔ)里讀出來(lái)。DPCD 寄存器訪問(wèn)這是 DP 的控制面板鏈路狀態(tài)、錯(cuò)誤計(jì)數(shù)、電源管理、音頻配置、PSR 狀態(tài)都在這里。熱插拔檢測(cè)HPD配合HPD 是獨(dú)立的一根信號(hào)線但事件發(fā)生后具體發(fā)生了什么還是要靠 AUX 去讀狀態(tài)。固件升級(jí)與擴(kuò)展功能比如 NVIDIA 那個(gè) DisplayPort 固件更新工具本質(zhì)上就是通過(guò) AUX 訪問(wèn) Sink 或 Source 側(cè)的固件更新寄存器來(lái)完成。所以 AUX 更像是 DP 鏈路的控制平面主鏈路是數(shù)據(jù)平面??刂破矫鎾炝藬?shù)據(jù)平面再寬也沒(méi)用。1.2 從一次插拔看 AUX 的完整工作鏈路我拿一次典型的顯示器插入過(guò)程來(lái)串一遍這樣比干講協(xié)議清楚得多。物理插入HPD 拉高顯示器檢測(cè)到線纜接入把 HPD 信號(hào)拉高Source 側(cè)收到中斷。Source 讀取 DPCD 0x00000-0x0000F這是 Receiver Capability 字段包含 DPCD 版本、最大鏈路速率、最大 lane 數(shù)、是否支持增強(qiáng)幀模式等。這一步全靠 AUX 的 native read。讀取 EDID從 Sink 的 EDID 地址通常映射到 I2C over AUX 的 0x50讀取 128 字節(jié)基礎(chǔ)塊如果支持?jǐn)U展還要讀 extension block。這里用的是I2C-over-AUX事務(wù)不是 native AUX。鏈路訓(xùn)練Source 寫(xiě) DPCD 的 Link Configuration 字段0x00100 起設(shè)置 lane 數(shù)、速率、擺幅然后啟動(dòng) TPS1/TPS2/TPS3 訓(xùn)練序列通過(guò) AUX 讀 Lane Status 判斷是否 CR/EQ 完成。進(jìn)入正常傳輸訓(xùn)練成功后主鏈路開(kāi)始送視頻流AUX 轉(zhuǎn)入低頻維護(hù)監(jiān)控錯(cuò)誤計(jì)數(shù)和 PSR 狀態(tài)。整個(gè)流程里只要 AUX 有一次事務(wù)失敗鏈路就可能停在某個(gè)中間狀態(tài)表現(xiàn)出來(lái)就是黑屏閃屏分辨率不對(duì)。1.3 為什么 AUX 的可靠性設(shè)計(jì)比速率更重要AUX 速率低是刻意的。它要的是確定性而不是吞吐。協(xié)議里給 AUX 設(shè)計(jì)了一套相當(dāng)嚴(yán)謹(jǐn)?shù)氖聞?wù)機(jī)制每個(gè)事務(wù)有Command地址 讀寫(xiě) 長(zhǎng)度和Data兩個(gè)階段。支持Native AUX直接訪問(wèn) DPCD和I2C-over-AUX訪問(wèn) EDID 等 I2C 設(shè)備兩種模式。有ACK/NACK/Defer三種響應(yīng)Defer 表示 Sink 暫時(shí)忙Source 需要重試。有超時(shí)和重試計(jì)數(shù)通常 Source 側(cè)會(huì)重試 3 次以上。提示很多顯示器偶發(fā)識(shí)別失敗的問(wèn)題根因不是主鏈路而是 AUX 事務(wù)在某個(gè)環(huán)節(jié)被 Defer 或超時(shí)Source 重試次數(shù)不夠就放棄了。調(diào)這類問(wèn)題一定要抓 AUX 波形或看內(nèi)核日志里的 AUX 事務(wù)記錄。2. DPCD 寄存器空間AUX 真正操作的那張地圖2.1 DPCD 地址空間的整體布局DPCDDisplayPort Configuration Data是一塊標(biāo)準(zhǔn)化的寄存器空間地址從 0x00000 開(kāi)始通過(guò) AUX native 事務(wù)訪問(wèn)。它的布局大致是這樣地址范圍名稱作用0x00000-0x0000FReceiver CapabilityDPCD 版本、鏈路速率、lane 數(shù)等能力0x00010-0x000FF保留/擴(kuò)展能力部分版本用于擴(kuò)展字段0x00100-0x0010FLink Configurationlane 數(shù)、速率、擺幅、預(yù)加重設(shè)置0x00110-0x0011FLink/Sink StatusCR/EQ 完成狀態(tài)、lane 狀態(tài)0x00200-0x002FF錯(cuò)誤計(jì)數(shù)與狀態(tài)CRC 錯(cuò)誤、lane 錯(cuò)誤計(jì)數(shù)0x00300-0x003FF音頻相關(guān)音頻配置與狀態(tài)0x00600-0x006FFPSR 相關(guān)面板自刷新?tīng)顟B(tài)0x00700-0x007FF擴(kuò)展與固件固件更新、擴(kuò)展功能這張表是排錯(cuò)的核心。你遇到任何鏈路問(wèn)題第一步基本都是讀 DPCD 看狀態(tài)。2.2 Receiver Capability 字段的逐字節(jié)解讀0x00000 開(kāi)始的 16 個(gè)字節(jié)是每次插拔后 Source 必讀的。挑幾個(gè)關(guān)鍵字節(jié)說(shuō)0x00000DPCD 版本號(hào)比如 0x14 表示 1.40x13 表示 1.3。0x00001最大鏈路速率。0x06RBR0x0AHBR0x14HBR20x1EHBR3。0x00002最大 lane 數(shù)0x01/0x02/0x04 分別對(duì)應(yīng) 1/2/4 lane。0x00003是否支持增強(qiáng)幀模式、是否支持 TPS3 等能力位。0x00004是否支持下行端口、是否支持 MS 訓(xùn)練等。讀這幾個(gè)字節(jié)就能判斷這條鏈路理論上能跑多快。比如讀到 0x14 0x04說(shuō)明 Sink 支持 HBR2 四 lane理論帶寬 21.6Gbps夠跑 4K60 8bit。2.3 Link Configuration 與訓(xùn)練狀態(tài)寄存器0x00100 開(kāi)始的字段是 Source 寫(xiě)、Sink 讀的配置區(qū)0x00100lane 數(shù)設(shè)置。0x00101鏈路速率設(shè)置。0x00102-0x00103電壓擺幅和預(yù)加重每個(gè) lane 4 bit。0x00104-0x00105訓(xùn)練模式TPS1/TPS2/TPS3。對(duì)應(yīng)的狀態(tài)在 0x00110 起0x00102的鏡像狀態(tài)在0x00202Lane 0-1 狀態(tài)和0x00203Lane 2-3 狀態(tài)。0x00110-0x00111CRClock Recovery和 EQEqualization完成標(biāo)志每個(gè) lane 2 bit。訓(xùn)練流程就是寫(xiě)配置 → 讀狀態(tài) → 判斷是否完成 → 不完成就調(diào)整擺幅/預(yù)加重重試。2.4 用 AUX 讀 DPCD 的實(shí)際操作示例在 Linux 側(cè)如果驅(qū)動(dòng)暴露了 debugfs可以直接讀 DPCD。以常見(jiàn)的 i915 驅(qū)動(dòng)為例# 查看 DP 連接器狀態(tài) cat /sys/kernel/debug/dri/0/DP-1/dpcd # 或者用 drm 工具 modetest -c如果沒(méi)有 debugfs 接口可以用 I2C 工具通過(guò) AUX 橋接讀但更通用的做法是寫(xiě)個(gè)小程序調(diào)用drmModeGetConnector拿 EDIDDPCD 則依賴驅(qū)動(dòng)日志。內(nèi)核日志里搜dp_aux或aux能看到事務(wù)記錄dmesg | grep -i aux dmesg | grep -i dp link注意不同 SoC 和 GPU 廠商的 AUX 控制器實(shí)現(xiàn)差異很大有的把 AUX 事務(wù)抽象成 I2C 控制器有的直接暴露 native 接口。排錯(cuò)前先確認(rèn)你手上的平臺(tái)走的是哪條路徑。3. EDID 與 I2C-over-AUX顯示器自我介紹的完整機(jī)制3.1 EDID 為什么必須走 I2C-over-AUXEDID 本質(zhì)上是顯示器里的一顆 I2C EEPROM地址 0x50。DP 協(xié)議沒(méi)有為 EDID 單獨(dú)設(shè)計(jì) native 事務(wù)而是定義了I2C-over-AUX把 I2C 的讀寫(xiě)時(shí)序封裝進(jìn) AUX 事務(wù)里。一個(gè) I2C-over-AUX 事務(wù)的結(jié)構(gòu)是Command 階段地址字段填 I2C 設(shè)備地址0x50 左移一位命令類型標(biāo)記為 I2C 讀寫(xiě)。Data 階段傳輸實(shí)際數(shù)據(jù)長(zhǎng)度受 AUX 事務(wù)最大長(zhǎng)度限制通常 16 字節(jié)。讀 128 字節(jié) EDID 需要拆成 8 次 16 字節(jié)事務(wù)或者用 offset 遞增的方式連續(xù)讀。3.2 EDID 基礎(chǔ)塊的字段結(jié)構(gòu)128 字節(jié)的 EDID 基礎(chǔ)塊關(guān)鍵字段分布偏移長(zhǎng)度內(nèi)容0x00-0x078頭信息固定 00 FF FF FF FF FF FF 000x08-0x1110廠商 ID、產(chǎn)品代碼、序列號(hào)0x12-0x132生產(chǎn)周/年0x14-0x185EDID 版本與修訂0x19-0x2210基本顯示參數(shù)尺寸、gamma、特性0x23-0x3519色度坐標(biāo)0x36-0x4718已建立時(shí)序Established Timings0x48-0x5918標(biāo)準(zhǔn)時(shí)序Standard Timings0x5A-0x7D36詳細(xì)時(shí)序描述符DTD0x7E1擴(kuò)展塊數(shù)量0x7F1校驗(yàn)和校驗(yàn)和算法很簡(jiǎn)單前 127 字節(jié)求和取低 8 位加上第 128 字節(jié)應(yīng)該等于 0模 256。3.3 在 Linux 上提取并解析 EDID 的實(shí)操最直接的方式是從 sysfs 讀# 找到連接器對(duì)應(yīng)的 edid 文件 ls /sys/class/drm/ # 例如 card0-DP-1 cat /sys/class/drm/card0-DP-1/edid edid.bin # 用 edid-decode 解析 edid-decode edid.binedid-decode會(huì)輸出廠商、型號(hào)、支持的分辨率、色深、音頻能力等。如果 edid.bin 是空的或者全 0說(shuō)明 AUX 讀 EDID 失敗了問(wèn)題在 AUX 鏈路或 HPD。也可以用parse-edidread-edid 包sudo apt install read-edid parse-edid edid.bin3.4 EDID 解析中的常見(jiàn)坑擴(kuò)展塊沒(méi)讀全4K 高刷顯示器通常有 CTA-861 擴(kuò)展塊只讀基礎(chǔ)塊會(huì)漏掉 HDR、音頻、高刷時(shí)序。要讀 0x7E 指示的擴(kuò)展塊數(shù)量。校驗(yàn)和錯(cuò)誤有些廉價(jià)顯示器 EDID 校驗(yàn)和是錯(cuò)的Source 側(cè)嚴(yán)格校驗(yàn)就會(huì)拒絕表現(xiàn)是識(shí)別成默認(rèn)分辨率。DTD 解析錯(cuò)誤詳細(xì)時(shí)序描述符里的像素時(shí)鐘、水平/垂直消隱參數(shù)如果算錯(cuò)會(huì)導(dǎo)致模式設(shè)置失敗。AUX Defer 導(dǎo)致讀中斷讀 EDID 過(guò)程中 Sink 返回 Defer如果驅(qū)動(dòng)沒(méi)重試EDID 就是殘缺的。提示遇到顯示器型號(hào)識(shí)別不對(duì)或者支持的分辨率列表不全先 dump 原始 EDID 二進(jìn)制手動(dòng)核對(duì)校驗(yàn)和和擴(kuò)展塊比盲目換線有效得多。4. 鏈路訓(xùn)練AUX 事務(wù)最密集、最容易出問(wèn)題的階段4.1 鏈路訓(xùn)練的三個(gè)階段DP 鏈路訓(xùn)練分三步TPS1 - Clock RecoverySource 發(fā)送 TPS1 訓(xùn)練圖案Sink 調(diào)整 CDR 鎖定時(shí)鐘通過(guò) AUX 寫(xiě) Lane Status 反饋 CR 是否完成。TPS2 - Channel Equalization發(fā)送 TPS2Sink 調(diào)整均衡器反饋 EQ 完成狀態(tài)。TPS3 - 可選部分版本用于進(jìn)一步優(yōu)化HBR3 及以上常用。每個(gè)階段 Source 都要反復(fù)寫(xiě)配置 → 等一段時(shí)間 → 讀狀態(tài)直到所有 lane 都報(bào)告完成或者達(dá)到重試上限。4.2 訓(xùn)練失敗的典型表現(xiàn)與 AUX 側(cè)線索訓(xùn)練失敗在用戶側(cè)的表現(xiàn)是黑屏、閃屏、降分辨率。在 AUX 側(cè)能看到的是Lane Status 一直不報(bào) CR 完成。錯(cuò)誤計(jì)數(shù)寄存器0x00200 起持續(xù)增長(zhǎng)。AUX 事務(wù)本身超時(shí)或 NACK。排查順序建議是先確認(rèn) AUX 事務(wù)本身是否正常能讀到 DPCD 就說(shuō)明 AUX 物理層 OK。讀 Receiver Capability確認(rèn)協(xié)商的速率和 lane 數(shù)沒(méi)超過(guò) Sink 能力。讀 Lane Status看是哪幾個(gè) lane 沒(méi)完成。調(diào)整擺幅和預(yù)加重重試訓(xùn)練。如果都不行降速率或降 lane 數(shù)看是否能穩(wěn)定。4.3 擺幅與預(yù)加重的調(diào)整邏輯0x00102 和 0x00103 每個(gè) lane 占 4 bit高 2 bit 是電壓擺幅低 2 bit 是預(yù)加重。調(diào)整邏輯是CR 階段失敗優(yōu)先加擺幅。EQ 階段失敗優(yōu)先加預(yù)加重。都失敗降速率。這套邏輯在 DP 規(guī)范里有推薦表格不同速率等級(jí)對(duì)應(yīng)的擺幅/預(yù)加重組合是有限的不能隨便填。4.4 用日志定位訓(xùn)練卡在哪一步Linux 內(nèi)核里 i915 和 amdgpu 都會(huì)打印鏈路訓(xùn)練日志dmesg | grep -iE link training|clock recovery|equalization|CR|EQ典型輸出會(huì)顯示每個(gè) lane 的 CR/EQ 狀態(tài)和重試次數(shù)??吹侥硞€(gè) lane 一直 EQ 失敗基本可以判斷是線纜或連接器的問(wèn)題而不是 Sink 芯片。5. 從固件更新到 PSRAUX 在進(jìn)階場(chǎng)景里的延伸用法5.1 DisplayPort 固件更新的 AUX 路徑NVIDIA 那個(gè) DisplayPort 固件更新工具做的事情本質(zhì)上是通過(guò) AUX 訪問(wèn)特定 DPCD 地址把新固件寫(xiě)入 Sink 或 Source 側(cè)的更新寄存器然后觸發(fā)校驗(yàn)和重啟。流程大致是讀固件版本寄存器確認(rèn)當(dāng)前版本。進(jìn)入更新模式寫(xiě)特定 magic 值。分塊寫(xiě)入固件數(shù)據(jù)。觸發(fā)校驗(yàn)。重啟鏈路。這類操作對(duì) AUX 事務(wù)的穩(wěn)定性要求極高中途一次失敗就可能導(dǎo)致固件損壞。所以工具通常會(huì)先做一輪 AUX 壓力測(cè)試。5.2 PSR 與 AUX 的低頻交互PSRPanel Self Refresh是省電特性讓面板在畫(huà)面不變時(shí)自己刷新Source 側(cè)關(guān)閉主鏈路。PSR 的狀態(tài)切換全靠 AUXSource 寫(xiě) DPCD 0x00600 進(jìn)入 PSR。Sink 在需要更新時(shí)通過(guò) HPD 或 AUX 通知 Source 退出 PSR。錯(cuò)誤計(jì)數(shù)和狀態(tài)都在 0x00600 區(qū)間。PSR 出問(wèn)題的典型表現(xiàn)是畫(huà)面卡住不更新或閃一下排查同樣從 AUX 事務(wù)和 DPCD 狀態(tài)入手。5.3 Type-C 場(chǎng)景下 AUX 的復(fù)用與切換在 Type-C 上DP 的 AUX 會(huì)復(fù)用到 CC 或 SBU 線上具體走哪對(duì)線由 Type-C 的 Alt Mode 協(xié)商決定。這里容易出現(xiàn)的問(wèn)題是Alt Mode 協(xié)商失敗AUX 根本沒(méi)接通。線纜只支持 USB 2.0沒(méi)有 SBU 線AUX 走不了。轉(zhuǎn)接芯片的 AUX 方向控制錯(cuò)誤。排查 Type-C DP 問(wèn)題時(shí)先確認(rèn) Alt Mode 進(jìn)入成功再確認(rèn) AUX 物理通路最后才看協(xié)議層。6. 實(shí)戰(zhàn)排錯(cuò)AUX 相關(guān)問(wèn)題的完整排查鏈路6.1 第一步永遠(yuǎn)是確認(rèn) AUX 物理層是否通不管問(wèn)題表現(xiàn)是什么先確認(rèn) AUX 能不能讀到 DPCD。讀不到后面全是空談。方法看內(nèi)核日志有沒(méi)有 AUX 事務(wù)超時(shí)。用示波器抓 AUX 差分對(duì)看有沒(méi)有 Manchester 編碼的波形。檢查 HPD 是否正常拉高。6.2 區(qū)分是 EDID 問(wèn)題還是鏈路訓(xùn)練問(wèn)題能讀到 EDID 但顯示異常問(wèn)題在鏈路訓(xùn)練讀不到 EDID問(wèn)題在 AUX 或 HPD。這個(gè)二分法能省很多時(shí)間。6.3 常見(jiàn)問(wèn)題與對(duì)應(yīng)線索對(duì)照表現(xiàn)象可能原因排查線索完全無(wú)顯示AUX 不通或 HPD 異常讀不到 DPCD無(wú) AUX 波形識(shí)別成默認(rèn)分辨率EDID 讀取失敗或校驗(yàn)錯(cuò)edid.bin 為空或校驗(yàn)和錯(cuò)閃屏/黑屏間歇鏈路訓(xùn)練不穩(wěn)定Lane Status 反復(fù)失敗錯(cuò)誤計(jì)數(shù)增長(zhǎng)高刷模式不可用帶寬協(xié)商不足Receiver Capability 讀到的速率偏低PSR 下畫(huà)面卡住PSR 狀態(tài)機(jī)異常DPCD 0x00600 狀態(tài)不對(duì)6.4 幾個(gè)我踩過(guò)的坑線纜質(zhì)量對(duì) AUX 的影響被嚴(yán)重低估AUX 雖然慢但對(duì)差分阻抗和屏蔽很敏感劣質(zhì)線纜經(jīng)常表現(xiàn)為 EDID 能讀但訓(xùn)練失敗。某些 Sink 的 AUX Defer 處理很激進(jìn)讀 EDID 時(shí)頻繁 Defer驅(qū)動(dòng)重試次數(shù)不夠就會(huì)讀到殘缺 EDID。轉(zhuǎn)接芯片的 AUX 時(shí)序一些 DP 轉(zhuǎn) HDMI 芯片在 AUX 事務(wù)上加了額外延遲導(dǎo)致 Source 側(cè)超時(shí)需要調(diào)大超時(shí)閾值。固件更新后 AUX 行為變化個(gè)別顯示器固件更新后會(huì)改變 AUX 響應(yīng)時(shí)序需要重新驗(yàn)證鏈路訓(xùn)練。AUX Channel 這條 1Mbps 的邊帶通道看起來(lái)是配角實(shí)際上握著整條 DP 鏈路的控制權(quán)。把 DPCD 地圖、EDID 解析、鏈路訓(xùn)練流程這三塊吃透再配合日志和波形絕大多數(shù) DP 顯示問(wèn)題都能定位到具體環(huán)節(jié)。我個(gè)人的經(jīng)驗(yàn)是遇到 DP 問(wèn)題先別急著換線換顯示器先把 AUX 事務(wù)和 DPCD 狀態(tài)讀出來(lái)答案往往就在那幾個(gè)寄存器里。