- 博客(130)
- 资源 (1)
- 收藏
- 关注
原创 第13篇:VSync/VBlank搞懂屏幕刷新,告别撕裂卡顿
预备缓存:BufferC 当GPU绘制慢、错过一次VBlank时,GPU可以直接往第三个buffer继续画,不需要阻塞等待swap,SurfaceFlinger可以灵活选择可用buffer在后续VBlank提交。,二者强绑定,但不是同一个东西。本篇从硬件时序、内核DRM代码、信号上报链路、缓冲策略、调试手段完整拆解,打通Panel、DRM、HWC、SurfaceFlinger、App这整条时序链路。问题:如果GPU绘制慢了,错过了本次VBlank窗口,只能等下一个VBlank,直接丢一帧,肉眼可见卡顿。
2026-11-07 11:35:16
236
原创 第12篇:HWC硬件合成深度解析:DRM Atomic是怎么和HWC配合送画面的
这是驱动工程师最关心的一段:HWC拿到HWC2_Layer数组,怎么变成DRM的state、plane、property。HWC Layer的Z序、alpha、裁剪、旋转、buffer,会一一映射到DRM Plane的property,每一个DEVICE图层占用一个Overlay Plane,受硬件通道上限约束。prepare只评估,不提交;HWC是Atomic DRM最主要的上层消费者,HWC的一帧,对应DRM一次Atomic Commit,要么全部生效,要么全部回滚,保证画面无撕裂、无半帧刷新。
2026-11-01 11:24:34
273
原创 第11篇:Atomic DRM 原理与 Commit 完整流程解析
本文详解AtomicDRM机制,解析其取代LegacyDRM的必要性:通过drm_atomic_state统一管理显示配置,实现批量校验、原子提交与回滚,保障多图层、DSI/DP同步等复杂场景的稳定性。核心流程分为prepare(软件校验、资源预留)与commit(硬件生效),驱动需正确实现atomic_check、atomic_prepare、atomic_commit回调。
2026-10-25 15:28:45
292
原创 第10篇:屏ESD Check内核逻辑驱动代码完整拆解
本文深入解析Android/Linux显示驱动中MIPI屏ESDCheck机制的底层原理与实现。通过定期读取面板只读寄存器(如ID寄存器),判断DSI通信是否异常,从而触发软/硬复位恢复屏幕。基于DRM框架,采用kthread线程实现周期性检测,结合mutex锁、状态标志与重试限制,解决并发、死循环等关键问题。代码示例涵盖线程启停、寄存器读取、复位流程及日志分级,强调轮询间隔设置、寄存器选择等实践要点,提供调试手段与防坑指南,确保屏幕在静电干扰后可自动恢复,提升系统可靠性。
2026-10-18 12:56:21
299
原创 第9篇:Android驱动踩坑实录:DSI RX FIFO前置脏0、数据错位复盘
观测到固定前置8字节无效脏数据,采用「冗余多读、截断丢弃」方案:上层需要N字节,底层实际读取N+8字节,丢弃前8字节脏数据,返回后端有效数据。彻底消除前置脏0、数据错位、丢包问题,每次读取均可一次性获取完整、正确的Payload数据,无任何冗余读取、无数据污染。既然前置读出的都是0,直接在软件层过滤:读到4字节全0数据,不写入缓存、不交付上层,仅保留非0有效数据。:只读,每次读取返回4字节FIFO数据,消耗FIFO节点,是标准FIFO数据出口。正常机制:硬件收到数据后,自动锁存到输出寄存器,等待软件读取。
2026-10-11 13:04:49
144
原创 第8篇:Android显示驱动从0到1学习路线
只会抄 DTS、抄 Panel 驱动、改延时、瞎试参数 → 能点亮屏幕,但遇到。设备树 DTS 基本语法:compatible、reg、gpio、pinctrl。能通过 debugfs 看屏幕状态、CRTC状态、atomic状态。能独立查询 DRM 驱动名、connectorID、mode时序。阶段目标:看得懂 DTS、看得懂时序图、不畏惧硬件约束。:SurfaceFlinger、HWC、图层合成、掉帧。可以从零成长为:独立移植屏幕、独立排查黑/花/闪屏、MIPI 是什么、差分信号、HS/LP 模式。
2026-10-07 10:58:22
337
原创 第7篇:驱动工程师必修课-如何高效读懂芯片与Panel规格书,拒绝盲写代码
大部分新手调试慢、踩坑多、写代码没底气,根本不是不会写代码,而是——看不懂规格书。只看和驱动代码、上电时序、寄存器、电气约束相关的内容,其余全部跳过。大部分闪屏、唤醒黑屏,都是休眠阶段电源/复位时序不满足 Spec。,以后拿到手不用逐字啃,直接精准抓取关键信息,告别盲写代码。从今天开始,调试不再靠猜、不靠试,全部以规格书为唯一依据。真正的硬件约束、时序底线、极限参数,只藏在 Spec 里。区分:电压配置、Gamma 配置、色彩配置、省电配置。屏规格书是「屏幕要求」,芯片规格书是「主控能力」。
2026-10-06 11:40:55
291
原创 第6篇:屏幕黑屏、花屏、闪屏通用定位方法论:80%显示问题,靠这套流程搞定
概率闪烁/瞬黑 → 查看 atomic 状态 & vblank 日志 → 核查休眠唤醒时序 → 核查 LP/HS 切换 → 核查电源域开关时序。本质:电源/复位时序竞争、LP/HS 切换异常、VBlank 同步异常、atomic 提交超时。Panel 未正常上电、复位失败、初始化序列未下发、DRM 未启动、MIPI 未建链。本质:像素时序不对、MIPI 速率不匹配、缓冲区对齐异常、图层叠加错误、信号干扰。结论:内核DRM、MIPI、Panel、上电时序、硬件全部正常。
2026-10-05 10:44:02
326
原创 第5篇:显示驱动必备调试工具浅析
本文面向嵌入式Linux/Android显示驱动工程师,系统梳理显示问题分层调试方法:从内核日志(dmesg)、sysfs状态、DRM工具modetest入手,快速定位黑屏、花屏等故障。重点介绍modetest的使用技巧,通过绕过上层框架直接测试输出,精准判断问题在内核还是Android图形栈。辅以i2c-tools验证寄存器通信,结合perfetto抓取时序事件,最终借助示波器与协议分析仪排查硬件信号完整性问题,实现高效、可复现的工程化调试。
2026-10-04 13:06:23
342
原创 第4篇:移植 Panel 驱动-点亮一块屏幕流程浅浅浅析
本篇完整梳理从屏幕手册阅读、上电时序、DTS编写、驱动适配,到内核调试、屏幕点亮的全流程,附带主线内核标准drm_panel驱动示例代码,同时标注高频踩坑点。MIPI-DSI参数:lane数量、传输速率、Video/Command模式、像素时序(HSA/HBP/ACTIVE/HFP,VSA/VBP/ACTIVE/VFP)DTS的作用:向内核描述硬件资源,不需要修改内核C代码,描述电源、复位引脚、DSI通道、屏幕时序。上手时,直接上手改驱动代码,最后卡在黑屏、上电时序错乱、DTS配置错误,反复排查几天。
2026-10-03 11:56:14
246
1
原创 第3篇:MIPI-DSI 基础:屏幕点亮最常打交道的硬件接口
MIPI-DSI是连接显示控制器与屏幕面板的高速串行协议,贯穿协议、驱动与硬件层,负责传输图像数据、控制命令及显示时序。它在显示链路中承上启下,支持VideoMode(持续流式输出)与CommandMode(指令驱动)两种模式,对时序、速率、数据格式及初始化顺序敏感。调试时需重点关注时钟同步、链路速率、复位流程与面板初始化序列。其稳定性直接决定屏幕能否正常显示,是排查花屏、闪屏、分辨率异常等问题的关键环节。
2026-10-02 14:23:21
320
原创 第2篇:DRM 是什么?为什么显示驱动绕不开它?
Android/Linux 显示体系里,DRM 不是某个单点模块,DRM 是 Linux 显示体系的核心框架。它统一管理 CRTC、Encoder、Connector、Plane、内存与同步,把上层图层安全提交给显示硬件;是在内核中负责显示资源管理、模式设置、图层提交和同步调度的核心框架。理解 DRM,是从“会调屏”走向“能定位黑屏、花屏、闪屏和图层异常问题”的关键一步。
2026-10-01 14:57:43
313
原创 第1篇:一张图看懂Android显示完整链路
Android显示驱动开发笔记,聚焦底层原理、工程实战与疑难问题复盘。技术内容为主,偶尔聊聊代码与工程思考。
2026-09-30 17:10:47
215
原创 Visual Studio code下载、安装、汉化教程
https://code.visualstudio.com/Download ,下载与你自己电脑系统匹配的安装包。点击左侧的小方块(拓展)搜索框输入“Chinese”,点击“Install”稍等一会,软件右下角会弹出如图所示的内容,点击“Yes”软件会自动重启,重启后的软件即为汉语版【安装后,在 locale.json 中添加 "locale": "zh-cn",即可载入中文(简体...
2020-11-10 23:00:00
368
原创 Source Insight 4.0中文注释乱码解决办法
1、【临时解决办法】:只针对当前文件解决中文乱码。菜单栏中【File】->【Reload As Encoding...】->【Chinese Simplified (GB18030)】->选择后,点击load,问题解决。2、【彻底解决办法】:对所有文件乱码解决办法: 我的做法是,在做下面操作的时候,先设置,然后关闭所有打开的文件,然后再打开文件即可 。 菜...
2020-09-19 15:00:00
133
原创 STM32中ADC的计算概述
adc电压计算 Vread =(Adc(readx)/4096(根据ADC位数不同,此处值不同))* Vref。读取通道17,因为是个定值,所以可以计算出Vref = 1.2*4096/Adc(read17)); 任意通道的电压值 Vread = (Adc(readx)/4096)*(1.2*4096/adc(read17))) = 1.2*Adc(readx)/Adc(read17)其中参照...
2019-12-06 21:23:00
620
原创 Keil5代码自动补全设置
1、点击Edit -> 选择Configuration。2、选择Text Complation,将Symbols after 2 Characters打勾。3、重启Keil软件,就可以看到代码自动补全效果了。
2019-12-06 21:21:00
213
原创 C语言:级联if-else if-else多分支语句
在程序设计中,经常使用级联的 if-else-if 实现多路分支结构。其基本结构如下。 if (条件表达式1) 语句1; else if (条件表达式2)、 语句2; ... else if (条件表达式n) 语句n; else 语句n+1; 该级联的 if-else-if 多分支结构的执行流程是:从前往后计算各个表达式的值,如果某个...
2019-11-07 10:58:00
589
原创 C语言:getchar() & putchar()
getchar()和putchar()个函数是用来获取和显示字符的,并且每次只能处理一个字符。 getchar()是怎么获取字符的??(见下图) 当输入“seantest”这一串字符时,这字符会被自动存储在“缓冲区”,当按下“Enter”键,getchar()再从缓冲区读取一个字符,每次都只能处理一个字符。过程如下图所示: 文件结尾 当计算机读取文件时,需要知道文件的结尾...
2019-11-06 20:39:00
111
原创 1.1.30 文档标题自动编号
【问:】如何让标题自动编号,复制编完号的标题后,编号自动增加且让2级标题的编号自动匹配1级标题。【答:】 1.新建空白文档,输入各级标题。 2.将光标定位到文字“标题1”前,选择【开始】>【段落】>【多级列表】,将当前列表选为【数字分级模式】,如图所示。(注意观察【样式】栏中标题的格式变化,和设置后做个对比) 3.选为【数字分级模式】后,在下方选择【定义新的多级列...
2019-08-15 15:31:00
124
原创 嵌入式Linux开发学习过程
回首往昔!!!学习嵌入式Linux开发已经1年多了,从入门就花费了大半年的时间,一个人慢慢摸索查资料……真是费时费事…… 我认为做好以下几点,学好嵌入式Linux开发指日可待! 1.明确学习顺序 2.找到好的学习资料 3.准备一款开发板,进行实践 4.一颗持之以恒的心 (P.S:最后一点是最重要的,做不到坚持其他都是扯~) 细思总结学习顺序如下...
2019-08-09 20:27:00
127
原创 18.29 僵尸进程的处理
僵尸进程(zombie): 一个已经终止但是其父进程尚未对其进行善后处理(获取终止子进程的有关信息,释放它仍占用的资源)的进程。 僵尸进程的产生: 一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。...
2019-07-22 15:22:00
121
原创 18.28 getchar()函数与缓冲区问题
一个关于使用链表增加删除人名的小程序,在使用getchar()函数,得到输入的菜单选项时,出现了问题,现记录如下:【菜单部分代码如下:】#include <stdio.h>int main(int argc, char * argv [ ]){ char cOpt; while(1) { ...
2019-07-19 11:26:00
84
原创 17.5 快速查找变量引用
1.在内核某个文件打出该变量,右键选择【look reference】,速度灰常快~ 2.我的习惯是设置下图的格式进行查找,各位可根据需求进行设置。
2019-07-18 15:49:00
87
原创 17.4 回车后缩进过多问题
1.Source Insight软件在编写代码时,回车换行缩进过多字符 2.打开工具栏上的Options>File Type Options选项,选择Auto Indenting 3.参考下图根据自己需求设置即可。...
2019-07-18 15:48:00
96
原创 18.27 查找头文件方法
【问:】用到的变量或者函数不知道包含哪个头文件怎么办法1.到工具链里cd /usr/local/arm/4.3.2/grep "FBIOGET_VSCREENINFO" * -nR/* 即可找到 */#include <linux/fb.h>法2.在linux服务器使用man如:man mmset...
2019-07-15 10:46:00
87
原创 18.26 freetype2字库移植
在S3C2440A开发板上,交叉编译,步骤:tar xjf freetype-2.4.10.tar.bz2 进入解压的目录vi docs/INSTALL.CROSS/* 查看配置过程 */./configure --host=arm-linuxmakemkdir tmp/*新建安装文件夹//默认安装在/usr/local/目录下*/make DESTDIR=$PWD/tmp ...
2019-07-10 10:37:00
138
原创 14.1 CuteFTP中如何删除历史连接记录
法1:选择:【工具】>【全局选项】>【安全】,将选项【程序退出时删除快速链接和链接url的历史】勾选,然后确定,关闭软件,重新打开软件,一切所有的记录就被清除掉了。法2:删除c盘的日志文件sm.datC:\Users\XXX\AppData\Roaming\Globalscape\CuteFTP\9.0\sm.dat...
2019-07-10 10:31:00
175
原创 1.1.29 加入项目符号后换行文字未对齐
【问:】Word文档加入【项目符号】,换行后文字不能与第一行对齐,大概差了大概“半个空格”。【答:】将光标放到换行后的文字前,选择【段落】>【悬挂缩进】>1.5字符(根据情况定数值)>【确定】,即可解决。...
2019-07-07 09:57:00
262
原创 Microsoft Project 2010基础使用方法
5.1 项目管理与Microsoft Project2010 Microsoft Project2010深受广大项目管理工程师的青睐。5.1.1 项目管理的概念 项目管理是项目管理者在有限的资源约束下,运用系统的观点、方法和理论,对项目涉及的全部工作进行有效的管理,即对项目的投资决策开始到项目的全过程进行计划、组织、指挥、协调、控制和评价,以达到项目的目标。项目范围管理项目时间管...
2019-06-25 17:07:00
437
原创 16.3 将Win7文档的内容到复制Linux的vi中
【问:】 如何将Win7文档的内容到复制Linux的vi中?【答:】 先复制Win7文档的内容,然后在SecureCRT中用vi打开Linux的文档,进入编辑模式后,选择要粘贴的位置,然后【点击鼠标右键】即可完成内容到vi的粘贴。...
2019-06-01 01:16:00
68
原创 3.4 在Word中的公式和序号之间填充连续的点
在发表论文时,有的杂志社要求公式的格式如下:在公式后和序号之间要有连续的点(这些点不是英文的句号也不是一个个分散的,而是一个整体)。 步骤: 1.在3.3 MathType自动公式编号和对齐这篇博客中已经介绍了如何添加右对齐的公式编号: 2.在【编号】前右击选择【段落】>【制表位】 3.选择位置叫小的【制表位位置】的【前导符】为【1无(1)】 4.选择位...
2019-05-28 13:56:00
5767
2
原创 18.25 JLink调试程序步骤
S3C2440开发板启动时候选择NandFlash启动,然后输入如下命令: r /*复位cpu*/ h /*暂停CPU*/ loadbin e:/les.bin 0 /*下载e目录下的leds.bin到0地址*/ setpc 0...
2019-04-21 08:08:00
205
原创 18.24 Ubuntu修改静态IP
1.查询系统当前的ip地址配置信息,输入ifconfig命令进行查看2.打开文件设置静态IPsudo vi /etc/network/interfaces3.设置address ip、gateway、netmask。auto loiface lo inet loopbackauto eth4iface eth4 inet staticaddress 10.3.10.232...
2019-04-03 20:15:00
59
原创 18.23 inline函数功能
GUN的C关键字,在函数定义中函数返回类型前加上关键字inline,可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。 在C&C++中,inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定...
2019-03-25 18:09:00
94
原创 18.22 sprintf函数功能
函数功能:把格式化的数据写入某个字符串函数原型:int sprintf( char *buffer, const char *format [, argument] … );返回值:字符串长度(strlen)例子:char* who = "I";char* whom = "优快云";sprintf(s, "%s love %s.", who, whom); //产生:"I lov...
2019-03-18 08:55:00
69
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅