MIPI & HDMI & SCRCPY

210 阅读5分钟

我们使用的主机都需要配置一个显示器,开发板也不例外,需要配置一个屏幕外设。屏幕的选型需要注意,并非随意购买一块屏幕接上线就能正常点亮。我们先来了解两个概念 MIPI 和 HDMI,一般的开发板都支持这两种视频信号的输出(DP 不在此文说明)。

MIPI & HDMI 概念

可概括为一句核心:MIPI 是芯片到屏幕 / 摄像头的板内内部接口;HDMI 是设备与设备之间对外的音视频接口。二者协议、PHY 完全不同,不能直接转接,必须经过芯片转换。

MIPI(Mobile Industry Processor Interface,移动产业处理器接口)

MIPI 是一整套协议家族,不是单一接口:

  • DSI:Display Serial Interface,AP → 显示屏(手机 / 嵌入式屏)
  • CSI:Camera Serial Interface,摄像头 → AP
  • PHY:D-PHY(最常用,HS 高速 / LP 低功耗双模式)、C-PHY(更高带宽,高端手机)

特点:

  1. 低压差分,低功耗,手机、平板、车机、开发板内部排线(FPC)
  2. 短距离:PCB/FPC,一般 <30cm,不适合外部长线
  3. 只传图像 + 控制指令,原生不带音频
  4. Lane 通道:1/2/4 Lane,叠加提升带宽;嵌入式时钟,无单独时钟差分对
  5. 无热插拔,无 HDCP 版权保护,没有 EDID 握手(DSI 有读取 DCS 屏寄存器)

HDMI(High Definition Multimedia Interface,高清多媒体接口)

特点:

  1. 设备对外接口:主机 / 盒子 / 电脑 ↔ 显示器 / 电视,音视频同传
  2. TMDS 差分信号(HDMI 2.1 为 FRL),独立时钟通道,支持长线,可达数米~10 米
  3. 内置 EDID 握手、HDCP 版权加密、CEC 设备控制、ARC/eARC 音频回传
  4. 版本带宽:HDMI1.4 (10.2Gbps) / HDMI2.0 (18Gbps) / HDMI2.1 (48Gbps),支持 4K/8K、HDR、VRR
  5. 支持热插拔,标准外部连接器(A/C/D 型)

两者对比

维度MIPIHDMI
定位板内内部接口设备对外接口
传输图像 + 控制指令,原生不带音频音视频同传
距离一般 <30cm可达数米~10 米
供电排线直接供电一般需要额外供电
热插拔不支持支持
版权无 HDCP、无 EDID有 HDCP、EDID、CEC

遇到的显示问题

为什么要了解这几个概念呢?本文在实践中遇到了相关问题:购置了开发板,但未额外购买显示器,实验室恰好有一个闲置的 7 寸 HDMI 屏幕,而板子也刚好支持 HDMI 输出:

HDMI 屏幕

可以看到屏幕没有正常展示视频信号。起初并未怀疑是这台 7 英寸设备的问题,因为此前已进行验证:将 Windows 的输出接到这台 7 英寸屏幕上可以正常展示:

Windows 输出到 HDMI 屏幕

这样就以为是板子的问题了。初步怀疑是因为板子默认支持 MIPI 的输出,所以 HDMI 的屏幕没有收到视频信号。随后尝试刷入了一个默认仅支持 HDMI 输出的固件,刷写后仍然不行,便排除了这一可能,接下来通过抓取日志来排查。

显示问题的排查手段

我们排查显示问题一般有以下手段:

  • cat /sys/class/drm/*HDMI*/status

  • cat /sys/class/drm/*HDMI*/modes

    用来查询物理屏幕的连接状态和模式。

  • dmesg | grep -iE 'hdmi|edid|hpd'

    打印内核环形缓冲区日志(内核启动、硬件驱动、中断、硬件热插拔事件都会在这里输出)。DRM 显示驱动(HDMI/DP)的硬件事件全部会由内核打印在这里。

  • dumpsys display

    打印 Android Framework 层 DisplayManagerService(显示管理服务) 的全部状态,属于用户态 Framework 的显示信息,不是内核 DRM 硬件日志。

更换显示器代替 7英寸显示

Windows 输出到 HDMI 屏幕

在仅支持 HDMI 输出的镜像上,7 英寸显示屏无法正常展示视频信号,但随意更换一台显示器即能正常显示,说明问题并不在镜像本身,而是这块 7 英寸 HDMI 屏存在显示问题。

在《设备树 dts & MIPI 屏幕视频输出信号问题排查》一文中,本文将讲解如何解决 MIPI 屏幕与板子无法点亮的问题,并扩展一些 dts / dtsi 设备树相关知识。

Scrcpy 投屏

如果没有连接物理屏,但又需要查看桌面显示,此时即可使用 scrcpy 将画面投屏到桌面:

Scrcpy 投屏

这里需要特别说明的是:Scrcpy 的画面来源并非 DP/HDMI 输出,它有两种主流的采集方式:

  • Android 屏幕录制接口(MediaProjection):从 Android SurfaceFlinger 获取帧缓冲区,是软件截屏通路,完全绕开物理显示输出,无需外接显示器。
  • 较旧版本也支持 adb shell screencap,同样是软件读帧,不经过 HDMI/DP 硬件编码器。

视频输出方式总结

综上,可归纳为三种视频输出方式:

方式说明备注
MIPI直接排线供电,不需要单独供电需要刷对应固件的设备树,否则不一定能正常显示;排线一般较短
HDMI更通用,线束可以比较长一般需要额外供电
虚拟屏创建//

MIPI 排线相关:MIPI 显示文档

如果在镜像层面需要指定默认支持 MIPI / DP / HDMI 的输出,需要修改 设备树,然后重新烧录新的镜像。