ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LT9611 MIPI转HDMI移植实战:设备树配置与调试全解析

LT9611 MIPI转HDMI移植实战:设备树配置与调试全解析 上个月调完这块RK3568的板子感觉最花时间的不是MIPI转HDMI这个点本身而是所有人都觉得很简单之后浮现出的一连串硬细节。需求不复杂板子上只有MIPI DSI接口客户要接HDMI显示器硬件在板上放了一颗LT9611。最初我想得很乐观——内核里有现成DRM bridge驱动设备树抄一段开机就能出画面。实际从I2C地址对不上到HPD检测不到再到开机概率性黑屏前前后后花了一个多星期。这篇就把整个移植过程中涉及的选型、设备树写法、驱动调试和信号验证一次性讲清楚给后面要碰LT9611或者同类MIPI转HDMI芯片的朋友少走点弯路。1. MIPI DSI和HDMI之间为什么非要一颗桥接芯片1.1 DSI是拿来怼面板的TMDS是拿来怼电视的在写设备树之前建议先搞清楚一个问题为什么MIPI DSI不能直接接到HDMI座子上。MIPI DSI是一种包传输协议主机端把像素数据组织成short packet和long packet通过差分数据lane发出去另有一对clock lane负责同步。它面向的是几十厘米内的面板连接链路短、功耗低、协议简单一个DSI controller直接驱动LCD Panel非常自然。而HDMI这边走的是TMDS编码每个像素时钟周期三个数据通道各把8bit数据做直流平衡编码后串行发出去同时还要处理热插拔检测、EDID读取、CEC、ARC、音频回传等一堆客厅设备才需要的能力。两种接口从电气特性到协议语义都不是一回事SoC内部的DSI PHY自然不能直接变成HDMI PHY必须用一颗桥接芯片在中间做协议转换。LT9611就是把DSI侧收到的视频流重新按HDMI 1.4的TMDS要求编码后送出去同时完成EDID读取、HPD检测、音频嵌入这些脏活。1.2 LT9611、LT9611A、LT9611UXC怎么分市面上类似芯片不少LT9611是我在RK平台、全志平台、NXP i.MX平台上出镜率最高的一颗原因有两个一是驱动早就进了主线内核二是资料相对好找。先看家族区分免得选型拿错型号DSI输入HDMI输出典型定位LT9611MIPI DSI 4-lane最高1080p60HDMI 1.4入门主力款资料最多LT9611A与LT9611大体一致细节优化HDMI 1.4替代LT9611的改进款LT9611UXCMIPI DSI 4-lane带宽更高HDMI 2.0支持4K60需要4K输出时选它有一类芯片也经常被搜到LT9211是MIPI转LVDS方向的LT9611是MIPI转HDMI方向的名字像但方向完全不同别拿错料。1.3 带宽上限不是能跑4K而是跑满1080p60都紧LT9611这个档位的芯片DSI侧4-lane、单lane在1Gbps左右总带宽大约4Gbps。按1080p60、24bpp颜色格式计算像素时钟pixel clock1920×108060Hz标准CTA时序下约148.5MHz每lane数据率148.5MHz × 24bit ÷ 4lane 891Mbps/laneDSI clock lane频率DDR891 ÷ 2 ≈ 445.5MHz这还没算DSI协议本身的包开销、blanking开销。所以刚刚好用满和留余量是两回事很多方案在1080p60时会把颜色格式压到18bpp或者改走1080p50。如果产品明确要上4K直接跳过LT9611选UXC级别的芯片别后面再返工。2. 原理图阶段就决定成败的四个细节2.1 电源和reset的时序不能只管能上电LT9611一般需要1.8V核心、3.3V IOHDMI部分还需要5V供电这三路要按合理的先后顺序上电。调试时最常见的问题不是电压不对而是reset释放太早。如果reset引脚在电源还在爬坡的时候就拉高芯片会启动到不稳定状态表现出来就是I2C时而能读、时而超时。手动调试的正确顺序先确认三路电源都稳了再把reset拉低至少10ms拉高之后再等3到5ms再访问I2C。用Linux驱动时reset时序基本由设备树里的reset-gpios控制但GPIO的active level一旦配反芯片会一直停在复位状态I2C自然什么也读不到。提示遇到I2C偶发超时用示波器抓reset释放瞬间和I2C时钟的先后关系比对着数据手册猜地址快得多。我试过在驱动probe里临时加一个20ms延时来验证延时加大后问题消失基本就能锁定是reset后访问太快。2.2 I2C地址0x3B只是开始LT9611主I2C地址典型值是0x3B7-bit地址但实际取地址还受ADR引脚电平影响。我见过一块板子因为ADR脚接法不同地址落在0x38~0x3B附近内核驱动默认0x3B读不到整个链路直接不工作。另外要注意LT9611读取HDMI对端显示器的EDID时可能通过内部I2C mux访问第二个从地址。如果这条I2C总线上这个地址恰好被别的器件占了比如同一个I2C上还挂了eeprom或触摸屏EDID读取就会失败。现象是probe成功、connector的status是connected但画面黑屏。排查时用i2cdetect -a把整条总线扫一遍看有没有地址冲突。i2cdetect扫总线i2cdetect -y 2如果看到3b说明访问到了LT9611如果地址是别的值先别急着改设备树回去看ADR引脚和原理图连线。2.3 HPD接法直接决定驱动行为HPD是HDMI热插拔检测引脚。LT9611一般有HPD相关的引脚设备树里hpd-gpios接的是SoC侧GPIO还是LT9611的HPD状态输出脚两种接法含义完全不同。如果hpd-gpios接的是SoC的普通GPIO驱动靠读取这个GPIO来向DRM connector反馈插拔状态如果接的是LT9611内部HPD状态驱动则从I2C寄存器里读。很多板子为了省事没把HPD接回SoC此时设备树里干脆不写hpd-gpios驱动在多数实现里会强制认为HPD一直有效。遇到HDMI status一直是disconnected第一步不要怀疑EDID先按HPD这条线查用万用表或GPIO调试接口量一下HPD引脚电平确认到底是硬件没接对还是驱动读错了来源。2.4 MIPI与HDMI布线等长和ESD寄生电容MIPI DSI差分对要按100Ω差分阻抗控制HDMI的TMDS也是100Ω差分。HDMI连接器附近若加ESD保护器件务必选寄生电容小于0.5pF的型号否则信号眼图质量明显下降低分辨率可能没事一旦跑到1080p60就会出现偶发花屏。MIPI时钟lane布线时习惯放在中间数据lane分列两侧换层处过孔要成对别让参考地平面断裂。热词里hdmi接口电路设计被搜得多说明大家在这里踩坑不少。这类问题在单板调试阶段往往不显现等到产线偶尔有一两台点不亮时才会被翻出来。3. 设备树配置从i2c节点到DSI endpoint的一整套写法3.1 桥接器节点reg、GPIO、供电下面这段设备树基于RK3568平台常见的5.10内核结构节点挂在i2c2上。不同平台的节点名可能有差异但整体结构是相通的i2c2 { status okay; lt9611: lt96113b { compatible lontium,lt9611; reg 0x3b; reset-gpios gpio3 RK_PB6 GPIO_ACTIVE_LOW; hpd-gpios gpio3 RK_PB7 GPIO_ACTIVE_HIGH; vdd-supply vcc3v3_sys; vcc-supply vcc1v8_sys; ports { #address-cells 1; #size-cells 0; port0 { reg 0; lt9611_in: endpoint { remote-endpoint dsi_out_lt9611; }; }; }; }; };几个字段逐个解释reg 0x3b7-bit I2C地址和i2cdetect扫出来的值对应reset-gpios低电平有效驱动会在初始化时拉低复位再释放hpd-gpios如果板子把HPD接回到了SoC的GPIO就在这里配没接就不用写vdd-supply/vcc-supply电源域需要和板子实际电源网络名一致。写错不会报错但芯片可能一直处于欠压状态这段配置完成后内核驱动通过compatible找到drivers/gpu/drm/bridge/lontium-lt9611.cprobe成功后就能在dmesg里看到类似lt9611 2-003b的日志。3.2 与mipi_dsi的端口对接LT9611要拿到数据必须让SoC的DSI controller把输出endpoint指向它。在Rockchip平台的设备树里mipi_dsi节点一般这样写mipi_dsi { status okay; #address-cells 1; #size-cells 0; ports { #address-cells 1; #size-cells 0; port1 { reg 1; dsi_out_lt9611: endpoint { remote-endpoint lt9611_in; >mipi_dsi { status okay; panel0 { compatible lontium,lt9611; reg 0; reset-gpios gpio3 RK_PB6 GPIO_ACTIVE_LOW; hpd-gpios gpio3 RK_PB7 GPIO_ACTIVE_HIGH; }; };这是把LT9611伪装成一个DSI panel来驱动的做法在老SDK里能跑但5.10之后的内核更推荐走DRM bridge chain也就是前面那种i2c节点加ports的结构。判断自己的内核该用哪种直接看内核源码目录里有没有drivers/gpu/drm/bridge/lontium-lt9611.c有这个文件就按新结构写没有就按的老结构来。3.4 lane rate和像素时钟怎么算附一张速查表很多黑屏问题其实就是时钟算错了。DSI侧看的是lane rate而不是简单像素时钟公式像素时钟 H_total × V_total × 刷新率Hz每lane数据率 像素时钟 × bpp ÷ lane数DSI clock lane频率DDR 每lane数据率 ÷ 2以标准CTA时序估算几个常用分辨率如下分辨率刷新率像素时钟MHzbpplane数DSI clock频率MHz1920x108060148.5244约445.51920x10803074.25244约222.751280x7206074.25242约445.51280x7206074.25244约222.75如果设备树里配置的DSI频率和这里算出来的差太远会出现能出画面但闪烁、或者高分辨率下花屏的现象。用示波器实测clock lane的频率是对照配置是否生效最快的方式。4. 驱动移植的完整链路从内核config到画面真正点亮4.1 内核开哪些选项在内核目录下搜索LT9611的驱动配置grep -r LT9611 drivers/gpu/drm/bridge/Kconfig正常情况下能看到CONFIG_DRM_LONTIUM_LT9611。menuconfig路径大致是Device Drivers → Graphics support → Display Interface Bridges → Lontium LT9611 MIPI DSI to HDMI bridge编成模块还是编进内核都可以但建议早期调试编成模块方便modprobe/rmmod单独加载不用整个内核重新烧。如果做量产镜像再编进内核也不迟。4.2 判断probe是否成功看这几个信号内核起来后最先做三件事dmesg | grep -i lt9611 i2cdetect -y 2 cat /sys/class/drm/card0-HDMI-A-1/statusdmesg里有lt9611相关probe日志说明设备和驱动对上了i2cdetect能看到0x3b说明I2C链路正常status显示connected/disconnected能判断HPD和DRM链路状态有的情况是i2cdetect能看到地址但dmesg没有任何lt9611日志。这种通常是compatible字符串和驱动不匹配或者设备树节点没有正确挂到I2C总线上。对照内核源码of_device_id表里写的字符串一字不差地对着改。4.3 让HDMI输出指定分辨率的几种手段画面能出来后第一件事是验证输出分辨率是否正确。DRM平台下最常用的是modetestmodetest -M rockchip -p列出所有connector、encoder、crtc和mode。看到HDMI-A-1对应的模式列表后强制输出一个标准模式modetest -M rockchip -s 36:1920x108060其中36是connector id以实际列出来的为准。桌面环境可以用xrandr纯DRM终端环境用modetest更直接。如果强制模式后画面正常说明硬件链路、驱动链路都没问题剩下的就是EDID协商出来的默认模式可能不合适。可以在驱动里设置默认mode或者修改DSI侧空闲时序让EDID协商结果落在标准模式上。4.4 声音也走LT9611时I2S配置别漏很多板子只关心图像结果客户插上HDMI显示器画面有了却没有声音。LT9611支持从I2S输入音频再嵌入HDMI但如果SoC的I2S根本没接到LT9611的音频输入引脚软件怎么配都不会响。调试步骤一般是aplay -l tinymix先看系统有没有对应的HDMI声卡再看mixer里音频路由是否把I2S送进了LT9611。硬件上没有接I2S的话只能改板子软件绕不过去。这正好解释了热词里插上hdmi线后就没媒体声音这类问题不是HDMI音量的锅很可能是桥接芯片音频输入链路压根没通。5. 黑屏、花屏、概率性无输出的真实排查顺序5.1 status一直是disconnected先查HPD而不是EDID遇到cat /sys/class/drm/card0-HDMI-A-1/status一直返回disconnected我第一次也会怀疑是EDID问题实际上最常出问题的反而是HPD。排查链路确认显示器电源和HDMI线正常换一台显示器交叉验证查看HPD引脚对应的GPIO状态cat /sys/kernel/debug/gpio确认是否高电平如果GPIO电平正常但status仍然disconnected检查设备树里hpd-gpios的active level是否写反如果GPIO压根没电平查原理图确认HPD是接到了SoC的GPIO还是LT9611内部再查驱动用的是哪个来源产品固定接显示器且不需要热插拔时可以去掉设备树里的hpd-gpios让驱动强制认为HPD有效这个场景我实测遇到的频率最高而且多数是硬件上HPD没接对或者设备树active level配反。5.2 connected却黑屏按这个顺序定位status是connected说明HPD没问题EDID已经读到了但画面还是黑的。此时按这个顺序查modetest -M rockchip -p看connector使用的是什么分辨率如果EDID协商出的模式分辨率很高、刷新率很高先强制降到1080p30或720p60试试把显示器拔掉再插上看是否触发重新协商用示波器量LT9611的HDMI输出端TMDS信号有没有差分波形没有波形就说明bridge没有真正进入输出状态量DSI侧的clock lane如果DSI没有输出时钟问题在SoC侧DSI配置和LT9611关系不大检查EDID读取是否稳定必要时用edid-decode工具解码读回的EDID黑屏问题的关键是定位是哪一侧没在干活LT9611本身是协议转换如果两侧都不给信号它自身很难凭空造出画面。5.3 花屏闪屏先算带宽再测信号花屏和闪屏比纯黑屏难查但套路固定。第一件事不是碰硬件而是把当前模式的带宽算一遍用modetest看当前输出模式确认pixel clock按前面公式算DSI lane rate看是不是超出LT9611的输入带宽能力如果超了强制降分辨率或降刷新率验证如果没超用示波器看DSI clock lane的波形稳定性排除信号质量问题硬件层面的干扰源主要是HDMI连接器附近ESD器件寄生电容过大、MIPI差分走线没有等长、换层过孔太多、地平面不完整。换一根短的高质量HDMI线也是排除干扰的常用手法。5.4 开机概率性黑屏时序竞态怎么捉最烦的一种十次开机有七八次好偶尔黑屏把HDMI线拔插一下又好了。这类问题大多指向启动阶段的时序竞态。重点排查几个时间点reset释放和DSI出流之间的先后关系如果DSI先出流、LT9611后完成复位首帧就会丢电源轨上电顺序1.8V和3.3V哪一路先到差距太大可能导致芯片内部逻辑不确定驱动probe过程中的延时有的SDK驱动在probe阶段没有等LT9611准备好就开始配置寄存器偶发超时修复时可以先在设备树里把reset-gpios的延时加大或者在驱动里把probe后的延时从1ms换成10ms测试。如果延时加大后问题消失基本确定是时序竞态而不是硬件故障再回头找驱动里的关键delay放在哪里最合适。6. 用示波器验证MIPI和HDMI信号时我到底在看什么6.1 DSI clock lane正常波形长什么样热词里mipi时钟信号示波器波形搜的人很多说明大家调MIPI链路时第一个想到的验证手段就是示波器。DSI clock lane是一对差分信号正常工作时应该看到接近正弦波的时钟。以1080p60、4 lane为例DSI clock频率约为445.5MHz峰峰值通常在200mV到600mV之间取决于驱动强度和走线长度。如果测到的频率和配置的lane rate对不上说明时钟配置没有生效如果幅值低于100mV、上升沿还有明显振铃多半是走线阻抗不匹配或参考层有问题。6.2 没有差分探头时的替代测法差分探头并不是每个实验室都有。没有差分探头时可以用单端探头分别测CLKP对地和CLKN对地然后对比两路波形。DSI是差分信号CLKP和CLKN应该是相位相反、幅值接近的两条波形。单端测法能判断有没有时钟频率对不对但无法准确评估差分幅值和共模噪声。调信号完整性时还是要找一支有源差分探头带宽至少1GHz。普通200MHz的探头测445MHz时钟量出来的幅值会严重失真只能当参考不能当判决依据。6.3 HDMI的TMDS与DSI的本质区别量clock频率就够了HDMI输出端有两类信号值得看一是TMDS clock lane二是三对数据lane。TMDS clock lane的频率就是当前输出模式的pixel clock。1080p60时是148.5MHz720p60时是74.25MHz。所以验证LT9611是否真的在输出时最简单的办法就是量TMDS clock lane的频率看看是不是和modetest里配置的pixel clock一致。如果clock lane有波形、频率对但画面仍异常再去看数据lane的信号质量和眼图如果clock lane压根没波形说明DSI输入就没有有效的视频流进来。HDMI接口有几种常见的座子规格A型全尺寸、C型mini、D型micro信号定义都是TMDS那几对只是物理尺寸不同。布线时注意HDMI的HPD、5V、CEC这些控制信号和TMDS线路要隔开别让控制信号干扰高速差分对。最后再说句实在话LT9611这颗芯片在市面上方案太成熟了单纯把驱动跑起来的难度并不高真正的门槛在硬件、整机、系统的交叉点。我习惯在投板之前就和硬件工程师把HPD接法、I2C实际地址、MIPI lane顺序这几件事逐项对齐能省下整整一周的调试时间。如果你正在调这颗芯片先把本文第二节的四个细节在实物上核对一遍再动手改设备树速度会快很多。
返回列表