ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

第1篇:一张图看懂Android显示完整链路

第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 → 屏幕硬件分层自上而下拆解1. App 应用层App 绘制UI、图片、视频输出图形缓冲区。 App本身不直接往屏幕写数据只是把绘制好的buffer提交给SurfaceFlinger。关键点每个窗口对应一个SurfaceApp只负责绘制不负责多图层叠加2. SurfaceFlinger图形服务中枢Android图形的核心总管。 接收所有App的图层拿到一堆独立Buffer做图层合并。两种合成方式GPU合成CLient合成把多个图层交给GPU渲染合成为一帧输出一个最终buffer。HWC硬件合成Device合成把多个图层直接交给硬件合成器硬件完成叠加CPU/GPU几乎不参与。驱动开发经常遇到的现象部分界面正常特定界面花屏切换应用闪屏大多和合成路径切换相关。3. HWC 硬件合成器介于安卓用户态和内核之间。 SurfaceFlinger会询问HWC哪些图层你硬件可以合成哪些我用GPU来画。 HWC把可硬件合成的图层交给DRM去送显。坑点HWC配置错误会出现图层丢失、叠加顺序错乱很多黑屏、闪屏bug是HWC和DRM状态不同步。4. Gralloc 图形内存分配器负责图形Buffer内存申请、共享、缓冲区管理。 所有显示Buffer都出自Gralloc。 Buffer格式、内存对齐、缓存属性配置不对会出现色块、花屏、颜色异常。很多人调显示完全忽略Gralloc但大量诡异显示bug根源在这里。5. Linux内核DRM子系统(KMS)进入内核空间这就是我们驱动工程师主要打交道的模块。 DRM‑KMSKernel Mode Setting内核模式设置。 主要组件CRTC控制器扫描输出图像数据Encoder编码器把图像数据流转为传输协议MIPI‑DSI / HDMIConnector连接器代表物理输出接口Plane图层平面支持多图层硬件叠加Panel驱动屏幕时序、上电序列、MIPI指令工作流程上层传来bufferDRM做framebuffer映射CRTC驱动Encoder按照panel时序把数据发给屏幕。6. Panel MIPI‑DSI 硬件屏幕上电、复位、发送初始化指令、视频流传输。 我们日常改的dtsi时序、上电序列、MIPI参数全部落在这一层。黑屏、点不亮、花屏、色彩反转这一层问题最多。一帧画面完整流程极简总结App绘制内容产出bufferSurfaceFlinger收集全部窗口图层协商HWC/GPU合成方案Gralloc提供图形内存合成完成的Buffer下发到内核DRMDRM‑KMS配置CRTC/Encoder/PanelMIPI‑DSI发送图像数据屏幕点亮显示画面为什么这条链路对你排错很重要如果所有界面都花屏大概率偏向DRM、Panel、MIPI、时序底层问题如果只有部分App/界面异常优先怀疑SurfaceFlinger、HWC、图层合成、buffer格式如果视频异常UI正常重点查HWC视频图层路径如果休眠唤醒概率性黑屏关注DRM状态机、电源管理、Panel上电下电时序以后遇到bug可以拿这条链路做二分排查问题出在上层图形栈还是内核DRM还是屏幕硬件。很多公司各个模块分工很细先定位问题方向可以方便甩锅~ 大家手头问题都多快速给到对应owner分析很关键。读懂Android显示完整链路多读几次开始阶段甚至背诵都不为过定位甩锅显示bug不再瞎猜。嵌入式 Linux / Android 显示驱动开发笔记聚焦底层原理、工程实战与疑难问题复盘。技术内容为主偶尔聊聊代码与工程思考。更多详细笔记WeChat搜索素师良码
返回列表