2. 全志显示子系统概述

在全志(Allwinner)SoC 上移植 DRM 驱动,第一步不是写代码,而是建立一张清晰的“显示地图”:从内存中的 framebuffer,到屏幕上的像素,中间经过了哪些硬件模块、哪些总线、哪些时钟与中断。只有把显示管线的组成和职责边界弄清楚,后续的显示缓存管理、DMA-BUF 导入导出、以及花屏/撕裂类问题的排查才有依据。

一、全志显示管线的整体组成

全志 SoC 的显示通路可以抽象为一条“数据自内存流向屏幕”的流水线,典型组成如下:

  • DE(Display Engine,显示引擎):显示管线的核心,负责图层合成。它从内存读取多个图层的像素数据(DMA 方式),完成缩放、格式转换、Alpha 混合、色彩空间转换,最终合成一路或多路显示输出。
  • TCON(Timing Controller,时序控制器):接收 DE 输出的合成画面,产生行同步、场同步、数据使能、像素时钟等时序信号,是“把画面按屏幕节奏送出去”的模块。
  • DSI(MIPI DSI):面向 MIPI 屏幕的串行显示接口,把 TCON 的并行像素流打包成 DSI 数据包,通过差分线发送给屏幕模组。
  • HDMI:面向显示器和电视的接口,内部包含 TMDS 编码与音频嵌入,通常由 TCON 或独立显示通路驱动。
  • 时钟与复位(CCU):为 DE、TCON、DSI、HDMI 提供像素时钟、模块时钟和复位信号,是显示能否点亮的先决条件。
  • 中断与状态寄存器:DE 的 vsync/line 中断、TCON 的时序状态、DSI 的传输完成与错误中断,是驱动同步和调试的关键观测点。

不同代际的全志 SoC 在模块命名上有差异,例如 DE 可能分为 DE2.0、DE3.0、Display Engine Top 等,TCON 也可能拆分为 TCON_LCD、TCON_TV、TCON_HDMI。但“DE 合成 + TCON 定时 + 接口输出”的主干结构基本一致。

全志 SoC 显示管线与 DRM 驱动定位 用户空间 应用 / Wayland GEM / DMA-BUF DRM 驱动 CRTC / Plane Encoder / Connector Framebuffer 管理 内存 DDR / CMA 图层缓冲 DE 显示引擎 图层读取 (DMA) 缩放 / 格式转换 Alpha 混合 色彩空间转换 多图层合成 TCON 时序控制器 HSYNC / VSYNC DE / PCLK 行场时序生成 接口时序适配 DSI MIPI 串行打包 差分发送 → 屏幕 HDMI TMDS 编码 音频嵌入 → 显示器 CCU 时钟与复位 PLL / 模块时钟 / 复位 中断与状态寄存器 ioctl 合成画面 像素流 像素流 DMA 读 图层缓冲

二、DE、TCON、DSI、HDMI 的职责边界

理解模块分工,能避免“问题定位错模块”。可以用一句话概括:DE 决定“画面长什么样”,TCON 决定“画面按什么节奏走”,DSI/HDMI 决定“画面以什么电气形式送出去”。

模块 核心职责 典型寄存器/资源 常见问题
DE 图层 DMA 读取、缩放、混合、合成 图层地址、格式、尺寸、Alpha 花屏、图层错位、颜色异常
TCON 行场时序、像素时钟、接口时序 HT/VT、HBP/HFP、VBP/VFP 无显示、偏移、抖动、闪屏
DSI MIPI 打包、差分发送、命令传输 Lane 数、速率、时序参数 黑屏、初始化失败、传输错误
HDMI TMDS 编码、音频嵌入、EDID 像素时钟、色彩深度、音频 无信号、分辨率不匹配
CCU 时钟分频、门控、复位 PLL、模块时钟、复位位 模块不工作、时钟偏差

三、DRM 驱动架构与显示缓存管理的基本定位

在 Linux 侧,全志显示子系统通过 DRM/KMS 框架暴露给用户空间。DRM 驱动把硬件模块抽象成一组标准对象:

  • CRTC:对应一条扫描输出通路,通常绑定一个 TCON 通道,负责时序与扫描。
  • Plane:对应 DE 的一个图层,负责把 framebuffer 合成到 CRTC 上。
  • Encoder:对应 DSI 或 HDMI 等输出接口的编码逻辑。
  • Connector:对应物理连接器,负责 EDID 读取、热插拔检测和显示模式枚举。
  • Framebuffer / GEM:对应显示缓存对象,管理内存分配、映射与生命周期。

显示缓存管理是 DRM 驱动中最容易出问题、也最需要与 DMA-BUF 打交道的一层。它的基本定位是:为 Plane 提供可被 DE 直接 DMA 读取的物理连续或 IOMMU 映射的缓冲区,并保证在扫描期间缓冲区不被释放或改写。

在全志平台上,显示缓存通常来自 CMA(Contiguous Memory Allocator)或 DMA-BUF 导入。DE 需要的是物理地址或 IOMMU 映射后的设备地址,因此驱动必须在 framebuffer 创建时完成地址映射,并在页面翻转(page flip)时正确切换图层地址寄存器。

四、典型场景:从应用送显到屏幕点亮

假设一个 Wayland 应用要显示一帧画面,典型路径如下:

  1. 应用通过 GBM 或 DRM API 申请一个 buffer,得到 DMA-BUF 文件描述符。
  2. DRM 驱动把该 DMA-BUF 导入为 GEM 对象,并创建对应的 framebuffer。
  3. 合成器把 framebuffer 绑定到某个 Plane,提交 atomic commit。
  4. 驱动在 commit 中配置 DE 图层地址、格式、尺寸和混合参数。
  5. DE 从内存读取图层数据,合成后送给 TCON。
  6. TCON 按 DSI 或 HDMI 的时序输出,最终在屏幕上显示。
# 查看 DRM 设备与连接器状态
ls /dev/dri/
cat /sys/class/drm/card0-DSI-1/status
cat /sys/kernel/debug/dri/0/summary

# 典型调试信息:确认 CRTC / Plane / Encoder 绑定关系
modetest -M sun4i-drm -c
modetest -M sun4i-drm -p

五、常见误区与复盘要点

误区一:把“无显示”直接归因于 DRM 驱动。实际上,时钟未使能、TCON 时序参数错误、DSI 初始化命令失败、背光未打开,都会表现为黑屏。应按“CCU → DE → TCON → 接口 → 屏幕”的顺序逐级确认。

误区二:忽视显示缓存的物理连续性。DE 的 DMA 能力对缓冲区地址有要求,若使用非连续内存或未正确建立 IOMMU 映射,会出现花屏、错行甚至总线错误。

误区三:页面翻转时未同步。在 vsync 之前切换图层地址,容易造成撕裂;在扫描期间释放旧 buffer,则可能触发 IOMMU fault 或显示异常。

复盘时建议固定一套观测顺序:先看时钟与复位是否就绪,再看 DE 是否产生中断,接着确认 TCON 时序是否匹配屏幕规格,最后检查 DSI/HDMI 链路与缓存地址。把这条链路和 DRM 对象模型对应起来,后续的 DMA-BUF 调试与显示缓存管理就有了稳定的分析框架。