最近整理全志平台双屏显示相关问题,发现“同显”和“异显”经常被混在一起说,但实际排查时最好先把概念拆开,不然很容易在 dts、disp 配置和应用层之间来回绕。
双屏同显:两个输出口显示同一份画面。比如 LCD + HDMI 都显示 framebuffer0 的内容。这个更像 clone/mirror。
双屏异显:两个输出口显示不同画面。比如 LCD 显示主 UI,HDMI 显示副屏视频/广告/仪表。这个通常需要两个 layer/mixer/framebuffer,或者 DRM/KMS 下两个 CRTC/plane 组合。
这俩差别很大。同显主要看一路图像能不能复制到两个输出;异显则要看硬件显示引擎资源够不够、驱动有没有把两路暴露出来。
可以粗略按这个链路看:
应用 / framebuffer / DRM
↓
Display Engine / Mixer / Layer
↓
TCON0 / TCON1
↓
LCD / RGB / LVDS / MIPI-DSI / HDMI / TV所以双屏不只是打开两个屏节点,还要确认:
DE/mixer 是否支持两路输出;
TCON 是否分配正确;
LCD/HDMI 对应的输出类型和输出编号有没有配错;
framebuffer 或 DRM 设备有没有正常创建;
应用层是否真的往对应屏幕输出内容。
老 BSP/disp2 方案里,经常会看到类似 screen0/screen1、disp_init、lcd0/lcd1、hdmi 等配置。排查时建议先看:
screen0_output_type
screen0_output_mode
screen1_output_type
screen1_output_mode
lcd_used
hdmi_used
fb0_width/fb0_height
fb1_width/fb1_height
同显时,有些 BSP 可以通过配置 clone/mirror 或让两个输出绑定同一路 framebuffer;异显时,一般要确认 fb0/fb1 是否都创建出来。
如果系统里只有 /dev/fb0,那大概率只能先做一路显示;如果有 /dev/fb0 和 /dev/fb1,才比较适合继续看异显。
如果是主线内核或 DRM 方案,建议先用工具看资源:
modetest -M sun4i-drm重点看:
connector:LCD/HDMI 是否都存在;
encoder/CRTC:是否有两套可用;
plane:主图层/overlay 是否够用;
mode:HDMI EDID 是否读到,LCD timing 是否正确。
同显可以尝试两个 connector 使用同一 framebuffer;异显则要分别给不同 CRTC/plane 设置不同 buffer。这个阶段别急着跑 Qt/应用,先用 modetest 把链路点亮更省时间。
硬件资源不够
不是所有 SoC 都能随便两路独立输出。有的只有一个 mixer,能同显但异显受限。
TCON 分配错
LCD 和 HDMI 可能分别走不同 TCON。DTS 或 sys_config 里输出编号错了,现象就是一个屏正常、另一个黑。
HDMI EDID/HPD 问题
HDMI 读不到 EDID 时,副屏可能根本没 mode。先固定 720p60 测试,不要一上来自动模式。
应用层只画了一个 fb
底层 fb1 已经有了,但应用只往 fb0 画,自然看起来“第二屏没内容”。可以先用 cat /dev/urandom > /dev/fb1 或简单测试程序确认 fb1 是否有效。
内存带宽和像素格式
两路高分辨率同时输出时,带宽压力会上来。调试阶段建议先用较低分辨率和 RGB565/ARGB8888 中一种固定格式,别一次把变量拉满。
先单独点亮 LCD;
再单独点亮 HDMI;
确认两路分别都能工作后,再做同显;
同显稳定后,再看是否具备 fb1/第二 CRTC;
最后再做异显应用。
这样排查会比一开始就“双屏异显 + Qt + HDMI 自动模式 + 触摸”一起上省很多时间。
如果目标只是“主屏内容投到 HDMI”,优先走同显,简单很多。
如果目标是“LCD 操作界面,HDMI 播放另一个画面”,那就先确认 SoC/内核驱动是否真的支持两路独立 pipeline。别等应用写完才发现底层只有一路显示资源。
总之,全志双屏问题不要只盯一个 hdmi_used 或 lcd_used。按 DE/mixer、TCON、connector、framebuffer/DRM、应用输出这几层拆开看,基本就能定位是硬件资源、驱动配置,还是应用层没画到第二屏。
离线