☰
LCD与TP驱动移植全流程:时序、坐标与联调排查
2026/11/3 11:36:53 网站建设 项目流程

上个月帮一个朋友看项目,屏幕点亮了,开机 logo 正常,桌面也进得去,可手指按在屏幕上像按在一块玻璃上——一点反应都没有。这种场景我在做 TP和LCD 驱动移植(Porting)的头几年遇到过不止一次,而且每次的表象都不一样:有时候是屏亮但花屏,有时候是 TP 能报点但坐标飞到屏幕外面,还有一次是待机唤醒之后触摸直接躺平。所以只要有人问我 Porting 到底难在哪,我一般不会说"难在写代码",而是说难在这条链路上每一环都得对上,任何一环错位,现象都会以另一种形式出现在你面前。

这篇东西我打算把 LCD 和 TP 两条线的移植流程拆开揉碎讲一遍。适合谁看?刚接手新平台、拿到一块新屏和一颗新触控 IC,需要从零把显示和触摸跑通的人;也适合已经能点亮但总在细节上翻车的朋友——比如色偏、闪屏、报点抖动、休眠唤醒失效这些"能亮但不完美"的问题。下面这些内容里,平台相关的部分我会用通用写法描述,具体的节点名和寄存器名请对照自己手上的平台文档替换,逻辑是通用的。

1. 先搞清楚 Porting 到底在移植什么

1.1 一条从像素到手指的完整链路

很多人一上来就扎进设备树里改参数,改了半天不知道自己在改哪一层。我的习惯是先画一遍链路,把每一层的职责划清楚,出问题的时候才能快速定位是哪一层在捣乱。

显示这条链路从上往下大致是:应用层通过 SurfaceFlinger 合成图层,交给显示 HAL,HAL 再通过内核的 DRM 框架下发到显示控制器,控制器把并行数据打包成 MIPI DSI 的差分信号,经过连接器送到屏幕的驱动 IC,驱动 IC 再驱动玻璃上的像素阵列。触摸这条链路方向相反:手指改变电容,触控 IC 采样并做坐标解算,通过 I2C 或 SPI 把报文送到主控,内核 input 子系统把报文翻译成标准事件,HAL 和框架层消费这些事件,最终变成应用里的点击。

看明白这两条链路你会发现一个有意思的地方:LCD 和 TP 在物理上是贴在一起的两块东西,在软件上却几乎完全独立。屏幕的 DSI 走的是高速差分,触摸的 I2C 走的是低速总线,它们的驱动分属两个子系统,连编译出来的 ko 都不是同一个。但它们又强耦合:TP 的坐标原点、有效区域、旋转方向,全部由屏幕的分辨率和装配方向决定。这就是为什么很多人屏参改完,触摸坐标就跟着歪了。

还有一个容易被忽略的点:引导阶段和内核阶段是两套显示驱动。开机 logo 是引导程序里那套精简显示代码点亮的,进内核之后会重新初始化一遍。如果只在设备树里改对了内核参数,引导阶段没同步,你会看到 logo 阶段花屏或者黑屏,然后内核起来一瞬间恢复正常。这种"闪一下"的现象百分之八十是这个原因。

1.2 文件到底散落在哪些位置

我整理过一份自己的清单,每次接手新项目先按这个表把文件找齐,找不到的先别急着写代码,多半是资料没给全。

环节典型位置作用常见坑
面板设备树平台 dtsi 目录下的 panel 节点分辨率、时序、初始化序列、电源节点名和引用名不一致导致静默失效
面板驱动显示驱动目录的 panel 子目录解析设备树、下发初始化序列老平台用私有实现,新平台走 DRM panel
触摸设备树对应 I2C 控制器节点下地址、中断、复位、供电中断触发沿写错,probe 直接失败
触摸驱动input/touchscreen 目录上电时序、报文解析、事件上报上电时序少一步就读不到 ID
固件与校准厂商固件分区、持久化分区触控 IC 固件、出厂校准数据校准数据丢了只能返厂重校
引导阶段屏参引导程序配置区开机 logo 显示和内核不同步
显示 HAL 配置vendor 配置目录分辨率、密度、刷新率声明密度算错导致 UI 整体偏大偏小

这张表我建议你打印出来贴显示器边上。我见过太多人只改了内核设备树,忘了 HAL 里的分辨率声明,结果屏幕显示正常但是截图尺寸不对、状态栏错位——查半天以为是驱动问题,其实是配置没同步。

1.3 动手之前必须拿到的五份资料

这一条是我用血换来的:资料不全就别开干,硬着头皮干只会把时间花在猜参数上。

第一份是屏的规格书,重点看三张表——时序参数表(前后肩、同步宽度、有效区)、上电掉电时序图、初始化代码序列。时序表里的单位经常是"时钟周期"而不是毫秒,换算的时候要格外小心。第二份是触控 IC 的规格书,重点是 I2C 地址(7 位还是 8 位要分清)、上电复位时序、寄存器手册、报文格式。第三份是原理图,用来确认复位脚和中断脚接到了哪个 GPIO、供电是哪一路、I2C 上拉电阻有没有贴。第四份是屏和 TP 的初始化代码,通常厂家会给一个文本文件或者一段 C 数组。第五份是平台的显示与输入配置说明,主要用来对照节点名和必填属性。

我踩过最深的坑是原理图和实际板子不一致——原理图上中断脚接的是 65 号 GPIO,实际打样改成了 66 号,驱动里按原理图配,probe 的时候一直等不到中断。后来拿万用表一个个量才发现的。所以拿到原理图之后,第一件事是用万用表把关键引脚确认一遍,别偷这个懒。

2. LCD 驱动移植:时序和电源是命门

2.1 把 DSI 链路的三个层次分清楚

MIPI DSI 这条链路我习惯分三层理解:物理层、协议层、应用层。物理层是差分对,一对时钟加一到四对数据,跑在高速模式的时候差分摆幅很小,用示波器测的时候探头电容都会影响波形,所以一般不在高速模式抓波形,而是看 LP 模式下的电平跳变判断链路是否建立。协议层负责包格式,短包用来传命令,长包用来传参数和像素数据。应用层就是屏幕厂商定义的 DCS 命令集,比如 0x11 是退出睡眠、0x29 是打开显示、0x51 是写亮度。

理解这三层的好处是排查的时候能快速分层。如果开机连背光都没亮,那大概率是电源或者复位没到位,还在物理层;如果背光亮了但屏幕全白,可能是初始化序列没下发成功,问题在协议层;如果初始化都成功但画面偏色,那就是像素格式或者数据通道数配错了,属于应用层。

设备树里最核心的一段大概长这样,节点名按自己项目替换:

&mdss_dsi0 { status = "ok"; qcom,dsi-pref-prim-pan = <&dsi_panel_alpha_video>; pinctrl-names = "mdss_default", "mdss_sleep"; pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; }; &dsi_panel_alpha_video { qcom,mdss-dsi-panel-name = "alpha 1080p video mode"; qcom,mdss-dsi-panel-type = "dsi_video_mode"; qcom,mdss-dsi-panel-width = <1080>; qcom,mdss-dsi-panel-height = <2400>; qcom,mdss-dsi-h-front-porch = <24>; qcom,mdss-dsi-h-back-porch = <12>; qcom,mdss-dsi-h-pulse-width = <4>; qcom,mdss-dsi-v-front-porch = <20>; qcom,mdss-dsi-v-back-porch = <16>; qcom,mdss-dsi-v-pulse-width = <4>; qcom,mdss-dsi-panel-framerate = <60>; qcom,mdss-dsi-panel-clockrate = <1100000000>; };

这里有个细节值得多说两句:panel-type分 video mode 和 command mode 两种。video mode 是控制器持续不断地刷数据,屏上不带帧缓存,成本低、时序简单,手机屏绝大多数是这种。command mode 是屏自带帧缓存,控制器只在有更新的时候推数据,省电但要求屏支持 TE 信号同步。选错类型最典型的症状是画面撕裂或者干脆不显示,因为控制器以为自己在推流,屏却在等命令。

2.2 时序参数怎么算,别抄别人的

时序参数这块我见过最多的错误就是抄参考设计。参考设计的屏和你手上的屏不是一个型号,porch 参数差几个像素,轻则帧率不对,重则屏直接不认。

计算的起点是屏规格书给的有效区和消隐区。以 1080×2400、60 帧、四通道、RGB888 为例,先把行总数和场总数算出来:

  • 行总数 h_total = 1080 + 24(前肩)+ 12(后肩)+ 4(同步宽)= 1120
  • 场总数 v_total = 2400 + 20 + 16 + 4 = 2440

然后算每通道需要的数据率。RGB888 每像素 24 比特,一帧的比特数是 1120 × 2440 × 24 ≈ 6557 万比特,60 帧就是约 3.935 Gbps。四通道均摊,每通道约 983.8 Mbps。实际填的时候留 8% 到 12% 的裕量,取 1080 到 1100 Mbps 之间,我一般填 1100。

# 用调试节点反推实际帧率,验证参数是否合理 cat /sys/kernel/debug/dri/0/dsi0/clk_rate cat /sys/kernel/debug/dri/0/dsi0/status # 有些平台会直接给出实际 fps,没有的话用帧计数差值算

注意:不同平台对这个时钟字段的定义不一样,有的填单通道比特率,有的填四通道合计,有的填字节时钟。填之前一定先翻平台的显示配置文档,或者拿一份能跑起来的参考配置做比例换算,别想当然。

算完之后一定要验证。最土但最有效的办法是让界面滚动起来看有没有撕裂,再用一段时间统计帧数,反推实际刷新率。如果算出来是 58 帧或者 62 帧,说明参数有偏差,虽然不至于不能用,但久了会有细微的卡顿感。

2.3 初始化序列的字节含义

厂家给的初始化代码通常是一坨十六进制,比如:

/* 0x05 0x01 0x29 —— 短写无参数,发送 DCS 0x29(打开显示)*/ /* 0x39 0x01 0x00 0x04 0xB0 0x00 0x00 0x00 —— 长写,4 字节载荷 */

在高通系平台的写法里,这几个字节分别是:数据类型、通道号和应答位、长度高位、长度低位,之后才是真正的载荷。短写不带参数只有三个字节,带参数是四个字节,长写需要长度字段。第一次接触的时候我是把类型码表打印出来贴在屏幕上的,用几次就记住了:

类型码含义典型用途
0x05DCS 短写,无参数开显示、退睡眠、软复位
0x15DCS 短写,一个参数写单个寄存器
0x39DCS 长写批量写初始化寄存器
0x04DCS 读,无参数读状态、读 ID
0x06DCS 读,带参数读特定寄存器

初始化序列里有个顺序问题必须遵守:先退出睡眠,延时 120 毫秒,再下发寄存器配置,最后开显示,再延时一帧时间。这个 120 毫秒是屏规格书里写的,我试过砍到 80 毫秒,个别批次的屏就起不来,后来干脆不优化这部分,省下的时间还不够排查的。

2.4 引导阶段和内核阶段的同步

开机 logo 花屏这个问题,我遇到的原因几乎都是两套参数不同步。引导阶段那套显示代码是独立的一份,不会读内核设备树,需要单独改。改的方法各平台不一样,有的在引导程序配置区里填参数表,有的在源码里改结构体数组。

判断是不是这个问题很简单:如果花屏只出现在开机头一两秒,进系统后恢复正常,那就是两套参数不一致;如果进系统后依然花屏,那问题在内核侧。我一般会引导阶段先按最保守的参数配(用厂家给的默认值,不做任何优化),确认能点亮,再逐项对齐到内核参数。

还有一个相关的坑:引导阶段不开 DSI 高速模式的话,功耗会高一些,但点亮更稳。有些项目为了省电在引导阶段也开高速,结果低温启动的时候偶尔点不亮。这种边缘场景很难复现,一旦出现在量产环节就是灾难。

2.5 背光和电源时序

背光控制方式有三种常见做法:用屏内部的 DCS 寄存器调亮度、用外置的背光升压芯片通过 PWM 调、直接用一个 GPIO 做开关。选哪种取决于硬件设计,移植前先看原理图确认。

DCS 调亮度最简单,一条长写命令搞定,缺点是低亮度下容易闪,因为屏内部调光的分辨率有限。PWM 调光可以做到很暗,但 PWM 频率选不好会有可听噪声或者和相机快门打架。我一般把 PWM 频率设在 20 kHz 以上,避开人耳敏感区,同时保证占空比下限不低于 5%,再低会有肉眼可见的抖动。

电源时序这块,屏一般需要三路电:逻辑电源(1.8V 或 3.3V)、模拟电源、正负压。正确的顺序是先上逻辑电源,延时后再上模拟,最后放开复位。掉电顺序反过来。这个顺序写在屏规格书的时序图里,偏差超过规格给的容差就可能损伤屏或者出现残影。

实测心得:上电时序不对导致的"偶发不亮",最难查。因为它和温度、批次、上电速度都有关。我的做法是在驱动里把每一路电源的开关都打上时间戳,出问题的时候直接看 log 里两路电之间隔了多少毫秒,和规格书一对就清楚了。

3. TP 驱动移植:时序、坐标和休眠

3.1 上电时序和 ID 读取

触摸驱动 probe 的第一件事是上电读 ID,这一步过不去,后面全是空谈。触控 IC 的上电时序比屏更娇气,常见的要求是:供电稳定后拉低复位至少 10 毫秒,然后释放复位,再等 50 到 100 毫秒才能开始 I2C 通信。少了任何一个延时,读回来的 ID 就是 0xFF 或者直接超时。

设备树节点大概长这样,注意中断触发沿和 GPIO 的有效电平:

&qupv3_se1_i2c { status = "okay"; touch@38 { compatible = "vendor,alpha-touch"; reg = <0x38>; interrupt-parent = <&tlmm>; interrupts = <65 IRQ_TYPE_EDGE_FALLING>; reset-gpios = <&tlmm 66 GPIO_ACTIVE_LOW>; irq-gpios = <&tlmm 65 GPIO_ACTIVE_LOW>; vdd-supply = <&pm_l5>; vcc-supply = <&pm_l2>; pinctrl-names = "pmx_ts_active", "pmx_ts_suspend"; pinctrl-0 = <&ts_int_active &ts_reset_active>; pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; wakeup-source; touchscreen-max-points = <10>; }; };

两个容易翻车的点:一是reg填的是 7 位地址,但有些规格书给的是 8 位写法(左移一位),照抄进去就通不了;二是interrupts的第二个参数别写成 0x2002 这种十六进制混写,用宏最保险。我见过有人把IRQ_TYPE_EDGE_FALLING写成IRQ_TYPE_LEVEL_LOW,结果中断线一直被拉低,CPU 被中断风暴打满,开机就卡死。

3.2 坐标映射和方向校准

TP 能读出 ID 之后,下一个坎是坐标。这时候最容易出现的现象是:能点,但点 A 处响应 B 处,或者上下左右镜像。

根本原因是触摸屏的物理坐标系和显示坐标系不一致。触控 IC 上报的是它自己的原始坐标,范围是 0 到 X 最大值、0 到 Y 最大值,而显示是 1080×2400。驱动的任务是把原始坐标线性映射到显示坐标,并处理旋转。

驱动里的关键代码大概是这样:

input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->max_x, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->max_y, 0, 0); input_mt_init_slots(ts->input_dev, ts->max_points, INPUT_MT_DIRECT); /* 单点上报 */ input_mt_slot(ts->input_dev, id); input_mt_report_slot_state(ts->input_dev, MT_TOOL_FINGER, true); input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); input_sync(ts->input_dev);

四个方向问题对应四种处理:X 镜像、Y 镜像、XY 交换、整体旋转 180 度。判断方法很简单,在屏幕四个角点一下,看事件上报的坐标落在哪个象限。我的经验是先把max_x和max_y按 TP 的实际分辨率填对,再决定要不要交换,顺序反了会导致后面的调试全乱。

有些平台提供touchscreen-swapped-x-y、touchscreen-inverted-x这类标准属性,有些平台用自己的私有属性。用标准属性的话兼容性好,换平台的时候不用改驱动代码。我一般优先用标准属性,实在满足不了再动驱动。

3.3 固件加载和产线校准数据

触控 IC 里面跑的是固件,固件版本不对会出现各种莫名其妙的问题:报点漂移、大压力下丢点、边缘区域不灵。驱动里通常要在 probe 时读固件版本,和打包进去的版本比对,不一致就触发升级。

升级流程是标准的:从固件分区读文件,校验头部魔数,擦除,分块写入,校验回读,复位。整个过程要保证不断电,所以一般在开机阶段做,而且要做失败重试。

ret = request_firmware(&fw, "alpha_touch_fw.bin", dev); if (ret) { dev_err(dev, "firmware load failed: %d\n", ret); return ret; } if (le32_to_cpup((__le32 *)fw->data) != FW_MAGIC) { dev_err(dev, "bad firmware magic\n"); goto out; }

比固件更容易丢的是校准数据。触控 IC 出厂时会对每一片屏做一次校准,把基准电容值写进持久化分区。这个数据丢了之后,轻则边缘灵敏度下降,重则整片屏报点混乱。所以移植的时候一定要确认:持久化分区有没有挂载、读写权限对不对、恢复出厂设置会不会清掉它。我见过一次,恢复出厂把整个 persist 分区格式化了,结果触摸全废,只能返厂重校,损失惨重。

3.4 休眠唤醒和手势功能

待机唤醒后触摸失效,这是我被问得最多的问题之一。原因通常是休眠的时候把 TP 的电源全关了,唤醒之后驱动没重新走一遍上电初始化。

正确的做法分两种。一种是让 TP 在休眠时保持供电,进入低功耗扫描模式,靠中断唤醒。这样双击亮屏、抬手亮屏这些功能才能用。另一种是彻底断电,唤醒时重新初始化,功能简单但响应慢半拍。手机项目基本都是第一种。

需要做三件事:第一,在设备树里标wakeup-source;第二,驱动 suspend 的时候调用enable_irq_wake(),让这个中断能唤醒系统;第三,suspend 里把 TP 切到低功耗模式而不是断电,配置寄存器把扫描频率降下来。

static int ts_suspend(struct device *dev) { struct ts_data *ts = dev_get_drvdata(dev); if (device_may_wakeup(dev)) enable_irq_wake(ts->irq); ts_write_reg(ts, REG_POWER_MODE, MODE_LOW_POWER); ts_write_reg(ts, REG_GESTURE, GESTURE_DOUBLE_TAP); return 0; }

一个细节:低功耗模式的电流通常在几十微安到几百微安之间,具体看扫描频率。如果项目对 standby 功耗有硬指标,这块要单独测,别等整机测试的时候才发现超标。

4. 联调实录:从黑屏到能用的完整过程

4.1 抓 log 的顺序和关键字

真出事的时候,最忌讳的就是乱抓 log。我的顺序固定:先看内核启动日志里显示控制器有没有起来,再看面板有没有被 probe 到,最后看初始化序列下发的返回值。

# 显示控制器初始化 dmesg | grep -iE "mdss|dsi|drm" | head -50 # 面板绑定 dmesg | grep -iE "panel|backlight|regulator" # 触摸 dmesg | grep -iE "touch|input|i2c" # 实时跟踪触摸事件 getevent -l /dev/input/event2

mdss和dsi这两个关键字在我待过的平台上是通用的,其他平台换个前缀就行。如果这几条 log 里连控制器初始化都没打印,那问题在设备树节点没使能,或者依赖的电源节点没就绪。

还有一类问题是 log 里一切正常但屏幕就是不亮,这时候我会去看调节器状态:

cat /sys/kernel/debug/regulator/regulator_summary

看屏的几路电有没有真的被打开、电压值对不对。有一次查了半天时序,最后发现是设备树里写错了调节器名字,驱动拿到的是一路一直开着的电,屏的逻辑电根本没上。

4.2 显示异常现象与对应的排查层

我把常见的显示异常和对应层整理成一张表,出问题的时候直接对号入座,省掉瞎猜的时间:

现象大概率原因排查动作
完全黑屏,背光也不亮供电或者复位没到位量电压、看调节器状态、查复位 GPIO
背光亮但屏幕全白初始化序列没下发成功检查序列字节、通道号、应答位
画面花屏、有条纹通道数或像素格式配错核对 lane 数和 RGB 格式
颜色偏红或偏绿像素格式不匹配确认是 RGB888 还是 RGB565
画面上下抖动场同步参数错误重算 v_total 和帧率
亮度调节时闪PWM 频率低或屏内调光分辨率不足提高 PWM 频率、改调光方式
低温下点不亮上电时序裕量不足加大各路之间的延时

这张表不是万能的,但它能帮你把排查范围从"整个显示子系统"缩到"大概哪一层",效率提升非常明显。我一般排查前先花两分钟对一遍表,比直接埋头看代码快得多。

4.3 触摸问题的分层排查法

触摸问题的排查我固定分五层,从下往上走,一层层排除。

物理层:量供电电压、复位电平、中断电平。示波器看中断脚在没有触摸的时候是不是稳定的高电平,如果有毛刺或者一直低,说明硬件有问题。

总线层:用i2cdetect扫一下地址,看设备在不在。这一步能直接区分是驱动问题还是硬件问题。

i2cdetect -y 1 # 输出里对应地址位置有数字,说明设备应答了

驱动层:看 probe 有没有成功、固件有没有加载、中断有没有申请到。这一步看 dmesg 里有没有报错。

协议层:用getevent看原始事件,判断坐标范围是不是和max_x、max_y一致,有没有越界值。

系统层:看 input 设备有没有被正确注册、上层有没有权限读取。有时候驱动一切正常,但 SELinux 策略拦住了上层读事件,表现就是"驱动说有点,界面没反应"。

这五层逐层排除,基本不会漏。我遇到过最诡异的一次是 TP 能报点但只有屏幕下半部分有效,最后查到是屏的装配方向搞错了,坐标映射的时候 Y 轴只映射了一半的范围。

5. 常见问题速查与踩坑经验

5.1 一个必须强调的上电时序细节

前面说过上电时序,但我想单独拎出来再讲一次,因为它太容易被忽略而且后果严重。

屏的三路电如果顺序错了,可能不会立刻出问题,但会在长时间使用后出现残影、亮度衰减。触控 IC 如果复位释放得太早,I2C 读回来的 ID 会是乱码,而有些批次的 IC 恰好在那个时间点能读通,导致"有的板子好有的板子坏"这种最难查的批次性问题。

我的做法是:时序里每一个延时都留 20% 以上裕量,并且把这些延时常量化写成宏,方便后期统一调整。别嫌浪费那几毫秒,开机多 20 毫秒没人感知,但排查一个批次性问题可能要几周。

5.2 中断风暴和电源纹波

中断风暴这个坑我要专门说一下。现象是设备正常用一段时间后突然卡顿,看 CPU 占用发现有一个核被内核线程占满。原因通常是 TP 的中断脚配置成了电平触发,而 IC 的中断信号是脉冲式的,脉冲结束后电平没有恢复,中断线一直被拉着,内核就一直在处理同一个中断。

改成边沿触发就解决了。这个问题在设备树里改一个枚举值的事,但排查起来特别费劲,因为现象是"卡顿",第一时间不会想到触摸。

电源纹波是另一个隐形杀手。充电的时候触摸漂移、屏幕边缘报点不准,八成是电源纹波太大。触控 IC 的模拟电源对纹波很敏感,纹波超过 50 毫伏就可能影响采样精度。解决办法是加大滤波电容、把触控电源和充电电路分开供电、或者提高充电器的开关频率避开敏感频段。

5.3 那些文档里不会写的经验

做了这么多个项目,有几条经验是我觉得比任何文档都管用的:

先跑通再优化,别反过来。拿到新屏新 TP,第一版配置一律用厂家给的默认值,不做任何改动。跑通之后再一项项优化,改一项测一项。我见过有人一上来就把时序改得很激进想省电,结果调试卡了两周。

每个改动都留日志。改了什么、为什么改、改完什么现象,哪怕只是设备树里一个数字。出问题回退的时候,这份日志能救命。

别信"这个参数和那个没关系"。显示子系统和触摸子系统看似独立,实际上共享电源、共享时钟、共享 GPIO 控制器。改了显示的上电时序,可能影响到触摸的复位能不能按时完成。

保留一份能跑的配置。每次跑通一版就打一个配置快照,出问题的时候先回退到快照,确认是改动引入的还是环境变化,再往前查。这个习惯让我少走了很多弯路。

测试要覆盖边界条件。低温启动、低电量唤醒、充电时触摸、快速滑动、多指同时按、边缘区域点击,这些场景单独测都不难,但漏掉任何一个都可能在实际使用中变成投诉。

最后分享一个小习惯:我会在设备树的关键节点上留一行注释,写清楚这个参数的来源(取自哪份规格书的第几页、按什么公式算的)。半年后回头看自己写的配置,没有这行注释基本等于重新研究一遍。这个东西不花什么成本,但省下的时间很可观。

说实话,LCD 和 TP 的移植流程本身并不复杂,复杂度全在细节里。每一个参数背后都有它的来历,每一个现象背后都有它的层次。把链路分清楚,把资料备齐,把改动记录下来,剩下的就是耐心的重复和验证。我第一次独立完成一整套移植花了将近三周,现在同样的工作两三天就能跑通,靠的不是记住了所有参数,而是形成了一套从现象倒推层次的思路。这个思路比任何一份参考配置都值钱。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询