1. 一个常见需求:RK3568工控板怎么点亮存量LVDS屏
上个月帮客户调一块RK3568工控主板,屏幕是老款10.1寸LVDS屏,接口还是双八的。板子画出去了,屏幕也定了,结果一查手册才发现,RK3568原生根本不出LVDS信号。最后只能走MIPI DSI挂一颗GM8775C转LVDS桥接芯片。这颗芯片在RK3568+LVDS这个组合里出镜率实在太高了,我见过的几款RK3568开发板,只要带LVDS接口,基本都是GM8775C或者同方案的桥接芯片。
先说结论:GM8775C是一颗国产MIPI DSI转LVDS桥接芯片,专门解决“主控只有MIPI DSI输出,但显示面板是LVDS接口”的问题。RK3568主控在工控、车载、自助终端、机器人领域很常见,这类设备往往要兼容工业现场存量的LVDS屏——不是不想换新屏,是结构件开模费、线束、老化测试都压在那里,屏不能随便换。这篇文章把选型对比、硬件设计注意点、设备树配置和调试排障顺序完整写出来,给同样要跑RK3568+LVDS方案的朋友做个参考。
1.1 工控现场的真实情况:LVDS屏为什么还没被淘汰
LVDS是低压差分信号,早期在笔记本、工控机、医疗设备里大量铺开。它的优势很明确:差分走线抗干扰能力强、线缆可以做得比较长、接口标准化程度高,30pin或20pin的座子在市面上非常成熟。
工业设备换屏的成本比消费电子高得多。一块LVDS屏已经过了高低温、振动、老化验证,不是因为主控不支持LVDS就要全盘推翻。更现实的是,很多项目的屏是甲方指定的,面板型号和连接器位置都固定了,选型时只能在主控侧想办法。所以RK3568这种新主控要去适配老屏,MIPI转LVDS就是一个绕不开的桥。
1.2 RK3568显示接口清单里,为什么偏偏没有原生LVDS
RK3568的显示输出接口包括HDMI/eDP/MIPI DSI/RGB并行接口,不同封装和型号略有差异。但你去翻芯片手册,很难找到原生LVDS PHY的选项。RK3566和RK3568的情况类似,都依赖外接桥接芯片来兼容LVDS。
很多人第一次做这个方案时会问:“既然要转,为什么不直接从RGB接口转LVDS?”答案是:如果屏的分辨率不高、颜色深度要求不高,确实有RGB转LVDS的专用芯片,成本也不高。但RK3568上很多项目需要走MIPI DSI,一是因为DSI lane数可以灵活配置,二是因为SoC内部从VOP到DSI controller的数据通路更成熟,标准DRM框架支持度好。所以主流方案就成了DSI转LVDS,GM8775C就是这个链路里的核心芯片。
1.3 桥接芯片的本质:给两种协议做“翻译”
MIPI DSI和LVDS虽然都是差分信号,但协议完全不同。MIPI DSI是包结构,有LP/HS状态切换,有command mode和video mode之分;LVDS是纯粹的并行数据串行化,靠DE/Hsync/Vsync信号驱动,数据被分配到多对差分线上。
GM8775C做的事就是把MIPI DSI的视频流“翻译”成LVDS输出的时序和电平。打个比方:MIPI DSI像一个说英语的人,LVDS屏像只懂中文的人,GM8775C就是那个同声传译员。翻译员得先被叫醒(供电)、拿到工作牌(复位)、知道翻译规则(寄存器配置),然后才能上岗。这个理解方式对后面排查问题特别有用——屏不亮时,先搞清楚是翻译员没醒、还是翻译规则配错了、还是翻译完但对方没听懂。
2. GM8775C在链路中的角色:输入侧看DSI,输出侧看LVDS
要把GM8775C用好,就得先弄明白它输入什么、输出什么,中间哪些参数可配。很多调试问题最后都归结到这几个变量上:lane数、色深、时钟频率、数据映射、极性。
2.1 输入侧:MIPI DSI的lane数与带宽计算
GM8775C的MIPI DSI输入支持常见的1-lane/2-lane/4-lane配置。决定用几lane,主要看分辨率和刷新率需要的总带宽,公式不复杂:
- 每lane数据速率 = 像素时钟 × 每像素位数 ÷ lane数
以1920x1080@60Hz为例,像素时钟约148.5MHz,RGB888是24bit,4条lane时每条lane数据速率约891Mbps。DSI controller和GM8775C都能承受这个速率。如果是1280x800@60Hz,像素时钟72MHz左右,每条lane只有400多Mbps,DSI链路余量很大。
这里要注意的是:设备树里配置的lane数和GM8775C寄存器里配置的lane数必须一致。我调试时就见过dts里写了4-lane,但GM8775C初始化为2-lane,结果画面像被压缩成条带状。这种问题示波器看不出来,多半要重新核对寄存器配置。
2.2 输出侧:单通道与双通道LVDS,以及色深的坑
LVDS输出有单通道和双通道之分。单通道一般是指4对数据线加1对时钟,双通道则是8对数据线加2对时钟。
怎么判断用单通道还是双通道?主要看屏的分辨率和色深。6bit面板(18bit色)在1080p以下通常单通道够用;8bit面板(24bit色)在高分辨率下往往会用双通道。很多屏规格书里直接写“Single LVDS”或“Dual LVDS”,这是最可靠的依据。
颜色深度这个坑特别容易踩。GM8775C支持注入的MIPI数据格式通常可以设置RGB888或RGB666。如果屏是6bit但主控按RGB888发数据,桥接芯片又按24bit映射输出,LVDS线数不够就会出现偏色或丢低位数据。反过来,屏是8bit但配置成18bit输出,颜色会断层,也就是常说的“色彩过渡有横纹”。
2.3 寄存器控制的核心逻辑:I2C配置与时序映射
GM8775C通过I2C接口配置,内部有若干寄存器控制输入输出参数,包括:
- 输入lane数、输出单双通道
- 输入数据格式(RGB888/RGB666)
- LVDS输出映射模式(VESA或JEIDA)
- DE/Hsync/Vsync极性
- 时钟极性与是否输出持续时钟
- 扩频时钟(SSC)开关
如果你想通过寄存器初始化,流程一般是:释放复位后,I2C写初始化序列,先配输入侧再配输出侧,最后开启输出。不同批次芯片的寄存器地址可能有差异,务必以手头这颗料的规格书为准。
有一些板卡默认不写GM8775C寄存器,靠芯片外围引脚配置成默认状态也能出图,这种情况我在第5章会详细说。
3. 三款主流MIPI转LVDS桥接芯片的取舍实录
选型阶段我对比过几颗常见芯片:GM8775C、TC358775XBG、SN65DSI84/86,还有偶尔会遇到的LT8918B。每颗都有各自脾气,最终选哪颗取决于项目的量、温度等级、价格和FAE支持力度。
3.1 核心差异一览表
| 维度 | GM8775C | TC358775 | SN65DSI84/86 | LT8918B |
|---|---|---|---|---|
| 输入接口 | MIPI DSI | MIPI DSI | MIPI DSI | MIPI DSI/LVDS/TTL |
| 输出接口 | LVDS | LVDS | LVDS | LVDS/DP等多协议 |
| 单双通道 | 支持单/双通道 | 支持单/双通道 | 单通道为主,86支持双通道 | 支持单/双通道 |
| 配置方式 | I2C寄存器 | I2C寄存器,寄存器多且复杂 | I2C+引脚strap | I2C寄存器 |
| 资料开放度 | 国产原厂/代理可拿到 | 文档少,晦涩 | TI官方文档齐全 | 需找原厂FAE |
| 价格区间 | 相对便宜 | 偏贵 | 偏贵 | 中等 |
| 常见问题 | 寄存器手册版本不一致 | 初始化序列繁琐 | 引脚配置多,容易漏 | 不同批次差异要注意 |
表格信息是我自己和同行交流时的大致感受,不是精确到分钱的采购报价,具体还要以代理实际价格为准。但方向能说明问题:GM8775C能成为开发板方案的主流选择,核心原因是资料相对容易拿、价格有优势、FAE普遍愿意给初始化代码。
3.2 便宜够用与稳定好调的博弈
如果你的项目是消费类或一般工业类,GM8775C配合RK3568,性价比很高。开发板上大量使用说明它已经过了大批量的应用验证,常见问题在网上能搜到解决方案,原厂也能给出参考电路。
至于TC358775,稳定性和电气性能确实没得说,很多车载项目指定用它。但它的寄存器太多,数据手册动辄几百页,配置的时候要非常小心,初始化序列写错一两个字节就花屏,而且文档里的推荐值有时候还要结合屏的参数二次计算。对小团队来说,学习成本偏高。
SN65DSI84好在Linux内核里有现成驱动,如果你用Mainline内核,它的集成度最高。但TI芯片价格不便宜,而且现在供货周期也不如以前稳定,除非项目预算充足或者客户指定,否则在RK3568上我一般不会优先选它。
3.3 什么情况下需要放弃GM8775C
不是所有项目都适合GM8775C。我遇到过的几种情况会直接换芯片:
- 分辨率过高,比如2560x1440以上,单颗桥接芯片带宽不够,需要评估双DSI+双LVDS方案,这时可能不止换桥接芯片,连主控和VOP通道都要重新规划。
- 客户明确要求车规级物料,GM8775C的规格书如果不能满足AEC-Q100等级要求,只能换TC358775这类有车规版本的选择。
- 需要在显示链路上做图像缩放、OSD叠加、字符旋转等功能,这已经不是普通桥接芯片能覆盖的,可以考虑FPGA方案。FPGA的灵活性强,但功耗、成本、研发周期都高出一截,纯粹为了点亮一块屏用FPGA是杀鸡用牛刀。
4. 硬件设计上容易翻车的五个细节
桥接芯片的画板难度其实不高,真正翻车的地方都集中在上电时序、I2C地址、差分阻抗和SSC这些容易被忽略的点上。每一条我都见过实物翻车案例。
4.1 电源、复位、使能脚的时序窗口
GM8775C一般需要多路电源,核心逻辑电压和IO电压要按规格书要求的顺序上电。特别是复位(RESET)和使能(PWRDN/EN)引脚:主控GPIO控制时,必须先等电源稳定,再释放复位,之后延时一段时间再开始I2C初始化。
有一个很典型的故障现象:系统复位后偶发性白屏,重新上电多试几次可能就好。查到最后是复位信号释放太早,芯片内部LDO还没稳定,寄存器写入失败但没有报错标志。解决办法很简单——复位释放后加至少10ms延时,再做I2C访问。
这个“延时大法”看似粗糙,但在实际量产中非常管用,能挡住一大批偶发启动失败的问题。
4.2 I2C地址与上下拉电阻的处理
GM8775C的I2C从机地址不是拍脑袋定的,有的版本由引脚电平决定,有的版本固定。调试时不要直接写在驱动里,先用i2cdetect扫描总线上存在的设备地址,确认后再固化进初始化代码。
电平匹配也要注意。有些RK3568板卡的I2C总线是1.8V,而GM8775C的IO电压是3.3V,中间需要电平转换或确认芯片IO电平兼容。直接硬接可能导致I2C读不到数据或损坏引脚。
上拉电阻一般接1kΩ到10kΩ,具体要看I2C总线速度和线缆长度。预留0欧电阻的位置,后期调I2C速率或上拉强度会方便很多。
4.3 100Ω差分阻抗、等长与过孔控制
LVDS和MIPI都是高速差分信号,走线阻抗按100Ω差分控制。PCB设计时,差分对要包地、避开其他时钟线,同一对线尽量在同一层走,过孔数量尽量一致,等长误差控制在5mil以内是比较稳妥的做法。
很多自制的转接板用飞线连接,短距离测试可以出图,但长时间工作容易出现花屏或信号漂移。LVDS屏本来是抗干扰很强的接口,结果前面桥接芯片输出质量不行,后端屏再抗干扰也没用。
连接器位置建议靠近桥接芯片,LVDS线与MIPI线不要平行走长距离。如果必须走长线,中间加共模电感或接插件单独屏蔽地,效果会好一些。
4.4 时钟展频(SSC)与EMI的取舍
SSC扩频时钟可以降低EMI峰值,对过EMC测试有帮助。但缺点是可能引入像素时钟抖动,部分对时钟敏感的LVDS屏会在开启SSC后出现轻微闪烁或水波纹。
建议调试阶段先关闭SSC,确认画面稳定后再打开。如果EMI测试过不了,再想办法在屏端加展频配置,并验证不同扩频比例下的显示效果。这个顺序能帮你分清问题是来自SSC还是来自其他地方。
4.5 周边元器件的参考取值
常规做法是每个电源引脚就近放0.1μF陶瓷电容,靠近芯片电源端再放10μF钽电容或大容量MLCC。LVDS输出端的电流设置电阻按规格书推荐值取值,不要随意改,否则会直接影响LVDS差分电压摆幅,导致远距离传输时屏端收不到信号。
复位引脚可以加一个10kΩ下拉电阻和0.1μF电容组成上电延时,防止复位信号被干扰。这些外围器件虽然不起眼,但在量产一致性和ESD测试中作用很大。
5. 软件侧两步走:RK3568设备树接入与GM8775C初始化
软件侧分为两块:RK3568的DRM设备树链路,以及GM8775C的寄存器初始化。这两块分开理解,调试时才能快速定位问题到底出在VOP到DSI这一段,还是桥接芯片到LVDS屏这一段。
5.1 在DRM框架下正确挂载DSI到LVDS链路
RK3568的显示框架是DRM/KMS,默认设备树里有一个DSI controller节点,下面挂panel或bridge。LVDS屏通过GM8775C接入后,最干净的做法是把GM8775C设计成一个DRM bridge设备,由内核在初始化时通过I2C配置芯片,再把DSI output端连接到bridge的input端。
但很多国产SDK并没有为GM8775C提供完善的DRM bridge驱动,更多是直接在DSI节点下挂一个panel-lvds或simple-panel节点,把所有初始化动作放在GPIO和显示timing里。这个方法能跑通,是因为GM8775C默认状态可能就是可用的,但灵活性差,一旦需要切换映射格式或lane数就只能改代码。
5.2 用panel-lvds直通点亮vs通过I2C初始化桥接
我在实际项目中用过两种方式:
方法A:不写GM8775C寄存器,只靠芯片默认配置点亮。优点是快速验证硬件链路,几分钟就能看到画面;缺点是无法配置JEIDA/VESA映射、单双通道等关键参数,如果屏规格和默认配置不匹配就会翻车。
方法B:把GM8775C挂到I2C,初始化时逐条写寄存器。这是最终量产应该采用的方案,因为所有参数明确可控。调试顺序建议先方法A验证硬件,再方法B做最终固化,可以省掉大量先排查硬件再排查软件的无效时间。
5.3 设备树配置示例
下面是一个基于Rockchip SDK常见结构的简化示例,不是某一款开发板的完整源码,重点看结构和思路:
&dsi0 { status = "okay"; rockchip,lane-rate = <434>; /* 每lane实际速率,单位Mbps,按像素时钟×24/lane数计算 */ panel@0 { compatible = "simple-panel"; reg = <0>; backlight = <&backlight>; enable-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>; reset-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <72500000>; /* 1280x800@60Hz典型值 */ hactive = <1280>; vactive = <800>; hback-porch = <40>; hfront-porch = <48>; hsync-len = <80>; vback-porch = <20>; vfront-porch = <3>; vsync-len = <10>; de-active = <1>; pixelclk-active = <0>; }; }; ports { port@0 { reg = <0>; panel_in_dsi0: endpoint { remote-endpoint = <&dsi0_out_panel>; }; }; }; }; }; &dsi0_out_panel { remote-endpoint = <&panel_in_dsi0>; };如果走I2C初始化GM8775C,则需要在I2C节点下增加GM8775C子节点:
&i2c0 { status = "okay"; gm8775c: gm8775c@39 { compatible = "gm8775c-lvds-bridge"; reg = <0x39>; reset-gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>; enable-gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_HIGH>; status = "okay"; }; };I2C地址以实际扫描结果为准,不要照抄0x39,我见过不同封装版本地址不一样的。
5.4 I2C寄存器初始化的常见写法
初始化序列在驱动里一般用regmap或i2c_transfer发送。下面这段只是演示结构,寄存器地址和值必须对照GM8775C规格书:
static const struct reg_sequence gm8775c_init_seq[] = { /* 这里不是真实寄存器数据,仅表示初始化顺序 */ // 复位 { 0x00, 0x01 }, // 配置MIPI输入lane数 { 0x01, 0x00 }, // 配置LVDS输出单双通道 { 0x02, 0x00 }, // 配置颜色深度与映射模式 { 0x03, 0x00 }, // 使能输出 { 0xFF, 0x01 }, }; int gm8775c_init(struct i2c_client *client) { /* 先复位,再延时 */ gpiod_set_value(reset_gpio, 0); usleep_range(10000, 20000); gpiod_set_value(reset_gpio, 1); usleep_range(10000, 20000); return regmap_register_patch(gm8775c_regmap, gm8775c_init_seq, ARRAY_SIZE(gm8775c_init_seq)); }5.5 uboot阶段也要同步修改设备树
RK3568的uboot和内核使用两套设备树,很多项目只改了kernel的dts,uboot阶段logo一直出不来。要在LVDS屏上看到uboot logo或开机动画,uboot的设备树里也要有对应的DSI和panel节点。
至于uboot后期加开机动画,那是另一个话题,但要注意:动画分辨率要匹配LVDS屏的timing,如果uboot阶段的显示timing和kernel不一致,切换时屏幕会闪一下甚至黑屏几秒。建议两边保持一致。
6. 联调排障顺序:先量波形,再对时序,最后翻极性
很多工程师遇到LVDS屏不亮就急着改代码,实际上排障顺序很重要。我的习惯是:示波器量输入输出波形,确认信号有没有到;再核对时序参数;最后查VESA/JEIDA映射和极性。这个顺序可以避免在错误方向上反复试。
6.1 示波器测MIPI时钟和LVDS数据的正确姿势
调试MIPI转LVDS链路时,有两个关键波形要看:
第一个是MIPI DSI上的时钟波形。MIPI在LP模式下是低功耗状态,只有进入HS模式才有高频差分摆幅。用示波器单次触发,在开机瞬间抓CLKP对地波形,能看到明显的HS脉冲包络。如果完全抓不到,问题可能出在RK3568的DSI配置或PHY没有使能。
第二个是LVDS输出端的差分波形。LVDS是电流源驱动,在终端100Ω电阻上产生约350mV差分电压。用差分探头直接测CLKP与CLKN之间的波形比较准;如果没有差分探头,可以通过测量单端对地电压辅助判断,但要注意探头接地线产生的噪声。
有些项目在MIPI接口处放了测试电阻和测试点,就是为了方便量产时抓波形。建议在设计阶段预留这些节点。
6.2 黑屏、白屏、花屏的典型故障定位链路
- 背光亮但完全黑屏:大概率是LVDS信号的DE/Hsync/Vsync极性配置错误,或者桥接芯片没有输出时钟。用示波器看LVDS连接器上有没有时钟对,没有就查桥接芯片初始化。
- 白屏:常见原因是DE信号没有正确到达屏端。LVDS屏没有DE时会显示白屏或黑屏,和屏厂设计有关。重点检查DE极性和GM8775C的DE映射寄存器。
- 花屏或条纹:优先怀疑像素时钟不匹配,blanKing参数不对,以及SSC在干扰。先关SSC,再核对display-timings和屏规格书。
- 偏色或颜色错乱:大概率是VESA/JEIDA映射选错了。LVDS有两种主流的色彩映射标准,屏规格书通常会写明采用哪种,GM8775C寄存器里也要对应调整。
6.3 分辨率与像素时钟对不上的计算实例
以1280x800@60Hz的屏为例,假设屏规格书给出的timing为:
- Hactive=1280,HfrontPorch=48,HBackPorch=40,HSync=80
- Vactive=800,VfrontPorch=3,VBackPorch=20,VSync=10
行周期=1280+48+40+80=1448,帧周期=800+3+20+10=833,像素时钟=1448×833×60≈72.4MHz。设备树里的clock-frequency应该填72.4MHz附近的值。
有些调试者把clock-frequency填成屏幕厂商标称的“133MHz”或者自己想当然填100MHz,结果屏明显闪动或直接不亮。这里的本质是:设备树的clock-frequency是给DRM计算显示时序用的,必须和屏的真实timing一致。
DSI lane rate也要跟着算:72.4MHz×24bit/4lane≈434Mbps。如果RK3568的DSI节点里配置了lane-rate或类似的属性,就填434左右。注意不同SDK的属性名不一样,要以实际SDK为准。
6.4 同时调试摄像头、EtherCAT等模块时的联动经验
RK3568板子往往不只是接一块LVDS屏,还可能接MIPI CSI摄像头,比如OV5695、OV8858,或者跑EtherCAT主站做实时控制。
我的经验是:MIPI DSI和MIPI CSI虽然都在MIPI接口体系里,但一个是显示输出一个是摄像头输入,设备树配置分开,没有权限冲突。但调试时要注意干扰问题。DSI的持续时钟和摄像头数据线如果靠得太近,辐射会把摄像头图像弄出横纹。这时可以通过降低DSI lane速率或开启SSC来改善。
如果板子同时跑EtherCAT主站和显示刷新,建议把EtherCAT实时任务绑核,避免被显示中断和其他进程打断。这个虽然和GM8775C没有直接关系,但在工控板联调时经常一起出现,提前规划会少很多麻烦。
7. 关于这颗芯片,再说几点个人经验
用GM8775C调完几个项目后,我最大的体会是:国产桥接芯片最大的风险不在芯片本身,而在资料的版本管理。
GM8775C的规格书和初始化代码在不同渠道拿到的版本可能不一样,里面的寄存器描述会有细微差异。我的做法是每次打样前都向原厂或代理商确认“这颗料的当前版本对应哪一版规格书”,然后把手头的初始化代码和规格书逐一核对,而不是直接沿用以前项目的代码。
另外,GM8775C的初始化序列在量产阶段要固化到生产测试工具中。产线上如果芯片贴错批次或I2C地址有变,测试工具能快速发现,不用等到整机组装完再返工。
最后分享一个小技巧:如果调试时屏幕能点亮但颜色明显不对,别急着怀疑GM8775C坏了,先查LVDS屏规格书里的映射标准是VESA还是JEIDA。我见过好几个项目卡在这个问题上,最后改一个寄存器就解决了。按“先量波形,再对时序,最后翻极性”的顺序排查,MIPI转LVDS的方案是很好收尾的。