第1篇:一张图看懂Android显示完整链路
摘要
做显示驱动,最怕只盯着Panel、DRM寄存器调,看不清上层到底怎么下来的。本文自上而下梳理Android图形栈→Linux内核DRM→硬件屏幕的完整数据流,帮你建立全局认知。
前言
很多刚接触显示驱动的同学,上手就去改dts、调panel时序,遇到花屏、闪屏、黑屏,只会在驱动层瞎找。 问题有可能根本不在内核驱动,而是上层合成、Buffer分配、HWC配置出了问题。
只有把整条链路跑通,出问题你才知道:该往上查,还是往下查。
本文范围:标准Android + Linux DRM显示子系统,不涉及老旧FB架构遗留路径。
整体链路总览
App应用层 → SurfaceFlinger → HWC硬件合成器 → Gralloc内存分配 → Linux DRM子系统 → DRM/KMS框架 → Panel驱动/MIPI‑DSI → 屏幕硬件
分层自上而下拆解:
- App 应用层
App 绘制UI、图片、视频,输出图形缓冲区。 App本身不直接往屏幕写数据,只是把绘制好的buffer提交给SurfaceFlinger。
关键点:
●每个窗口对应一个Surface
●App只负责绘制,不负责多图层叠加 - SurfaceFlinger(图形服务中枢)
Android图形的核心总管。 接收所有App的图层,拿到一堆独立Buffer,做图层合并。
两种合成方式:
1.GPU合成(CLient合成):把多个图层交给GPU渲染合成为一帧,输出一个最终buffer。
2.HWC硬件合成(Device合成):把多个图层直接交给硬件合成器,硬件完成叠加,CPU/GPU几乎不参与。
驱动开发经常遇到的现象:部分界面正常,特定界面花屏;切换应用闪屏,大多和合成路径切换相关。 - HWC 硬件合成器
介于安卓用户态和内核之间。 SurfaceFlinger会询问HWC:哪些图层你硬件可以合成,哪些我用GPU来画。 HWC把可硬件合成的图层交给DRM去送显。
坑点:
●HWC配置错误会出现图层丢失、叠加顺序错乱;
●很多黑屏、闪屏bug,是HWC和DRM状态不同步。 - Gralloc 图形内存分配器
负责图形Buffer内存申请、共享、缓冲区管理。 所有显示Buffer都出自Gralloc。 Buffer格式、内存对齐、缓存属性配置不对,会出现色块、花屏、颜色异常。
很多人调显示,完全忽略Gralloc,但大量诡异显示bug根源在这里。 - Linux内核:DRM子系统(KMS)
进入内核空间,这就是我们驱动工程师主要打交道的模块。 DRM‑KMS:Kernel Mode Setting,内核模式设置。 主要组件:
●CRTC:控制器,扫描输出图像数据
●Encoder:编码器,把图像数据流转为传输协议(MIPI‑DSI / HDMI)
●Connector:连接器,代表物理输出接口
●Plane:图层平面,支持多图层硬件叠加
●Panel驱动:屏幕时序、上电序列、MIPI指令
工作流程:上层传来buffer,DRM做framebuffer映射,CRTC驱动Encoder,按照panel时序把数据发给屏幕。 - Panel + MIPI‑DSI 硬件
屏幕上电、复位、发送初始化指令、视频流传输。 我们日常改的dtsi时序、上电序列、MIPI参数全部落在这一层。
黑屏、点不亮、花屏、色彩反转,这一层问题最多。
一帧画面完整流程极简总结
1.App绘制内容,产出buffer
2.SurfaceFlinger收集全部窗口图层
3.协商HWC/GPU合成方案
4.Gralloc提供图形内存
5.合成完成的Buffer下发到内核DRM
6.DRM‑KMS配置CRTC/Encoder/Panel
7.MIPI‑DSI发送图像数据,屏幕点亮显示画面
为什么这条链路对你排错很重要
1.如果所有界面都花屏:大概率偏向DRM、Panel、MIPI、时序底层问题
2.如果只有部分App/界面异常:优先怀疑SurfaceFlinger、HWC、图层合成、buffer格式
3.如果视频异常,UI正常:重点查HWC视频图层路径
4.如果休眠唤醒概率性黑屏:关注DRM状态机、电源管理、Panel上电下电时序
以后遇到bug,可以拿这条链路做二分排查:问题出在上层图形栈,还是内核DRM,,还是内核DRM,还是屏幕硬件。
读懂Android显示完整链路,多读几次,开始阶段甚至背诵都不为过,定位甩锅显示bug不再瞎猜。
更多详细笔记,WeChat公众号:素师良码
浙公网安备 33010602011771号