1. MTK MT6833平台LCD驱动移植实战
刚拿到FAE提供的屏幕初始化伪代码时,我第一反应是"这堆mipi.write指令怎么变成C代码?" 其实MTK平台的LCD驱动移植有固定套路,主要分为LK和Kernel两部分。先说说LK部分,这是开机第一屏的关键。
在vendor/mediatek/proprietary/bootable/bootloader/lk/dev/lcm目录下,我们需要新建一个驱动文件,比如st7102_wvga_dsi_tl_kalaide_31in_incell.c。这个文件可以从同平台其他相似驱动拷贝过来,重点修改初始化序列。FAE给的伪代码长这样:
mipi.write 0x29 0x99 0x71 0x02 0xa2 mipi.write 0x39 0xB0 0x22 0x61 0x1E 0x61 0x2F 0x2F 0x2F转换规则很简单:
- 第一个0x29或0x39是数据类型,可以忽略
- 第二个字节是寄存器地址
- 后续字节都是参数
转换后的C数组应该是这样的结构体:
static struct LCM_setting_table lcm_init_setting[] = { {0x99, 3, {0x71, 0x02, 0xa2}}, {0xB0, 7, {0x22, 0x61, 0x1E, 0x61, 0x2F, 0x2F, 0x2F}}, // 其他初始化命令... };记得在mt65xx_lcm_list.c中添加你的驱动声明,并在项目mk文件中加入编译配置:
CUSTOM_LK_LCM += st7102_wvga_dsi_tl_kalaide_31in_incell2. Kernel部分驱动集成技巧
进入Kernel部分后,事情变得更有趣了。首先要在DTS中配置面板参数:
panel3@0 { compatible = "tf,st7102_wvga_dsi_tl_kalaide_31in_incell"; reg = <2>; reset-gpios = <&pio 86 0>; // 其他参数... };关键是要在drivers/gpu/drm/panel/下新增驱动文件。我常用的方法是复制相似驱动然后修改,重点注意这几个部分:
初始化序列转换:把LK部分的数组转换成kernel的写法
lcm_dcs_write_seq_static(ctx, 0x99, 0x71, 0x02, 0xA2); lcm_dcs_write_seq_static(ctx, 0xB0, 0x22, 0x61, 0x1E, 0x61, 0x2F, 0x2F, 0x2F);时序参数配置:根据FAE给的参数设置
.hdisplay = 480, .hsync_start = 480 + 80, .hsync_end = 480 + 80 + 10, .htotal = 480 + 80 + 10 + 60,电源控制:确保上电时序正确
gpiod_set_value(ctx->reset_gpio, 0); mdelay(10); gpiod_set_value(ctx->reset_gpio, 1);
记得在Kconfig和Makefile中添加新驱动的配置选项,否则编译时不会包含你的驱动。
3. TP驱动移植的坑点
触摸驱动sitronix_ts的移植让我踩了不少坑。首先DTS配置要特别注意:
sitronix@55 { compatible = "sitronix_ts"; reg = <0x55>; irq-gpio = <&pio 14 0x0>; // 根据原理图修改 rst-gpio = <&pio 15 0x0>; // 必须正确 };驱动代码通常由FAE提供,需要注意:
检查Makefile编译选项,建议用obj-y直接编译进内核
obj-y += sitronix_ts.o obj-y += sitronix_ts_i2c.o确认中断触发方式,一般用上升沿或下降沿
ts->irq_flags = IRQF_TRIGGER_FALLING;电源管理要处理好
regulator_enable(tpd->reg); mdelay(50); // 必须的延时
调试时最常遇到的问题是中断不触发,这时候要:
- 用万用表测量中断脚电压
- 检查GPIO配置是否正确
- 确认驱动中的I2C地址与硬件一致
4. 调试技巧与常见问题
第一次点亮屏幕时,我遇到了背光亮但无图像的问题。通过以下步骤解决了:
检查MIPI信号:
adb shell cat /proc/lcm_driver确认初始化序列是否正确发送:
// 在驱动中添加调试打印 printk("Send init sequence\n");测量各电压是否正常:
- VSP通常5.5V
- VSN通常-5.5V
- VDD/VIO根据规格书
触摸屏不响应时,我的排查清单是:
- 确认I2C通信正常
i2cdetect -y 0 - 检查中断是否注册成功
cat /proc/interrupts - 查看驱动打印信息
dmesg | grep sitronix
记得在驱动probe函数中添加足够的调试信息,这会大大节省排查时间:
dev_info(dev, "TP probe success, irq=%d\n", ts->irq);5. 性能优化与稳定性
驱动基本工作后,还需要优化:
降低功耗:
// 在suspend函数中 lcm_dcs_write_seq_static(ctx, 0x28); // 关闭显示 mdelay(120); lcm_dcs_write_seq_static(ctx, 0x10); // 进入睡眠提升触摸响应:
- 调整中断触发阈值
- 优化报点频率
#define REPORT_RATE 120 // HzESD保护:
params->dsi.esd_check_enable = 1; params->dsi.lcm_esd_check_table[0].cmd = 0x0A; params->dsi.lcm_esd_check_table[0].count = 1; params->dsi.lcm_esd_check_table[0].para_list[0] = 0x9C;
稳定性测试时,我通常会:
- 连续开关屏幕100次
- 快速滑动触摸屏检测丢点
- 高温/低温环境测试
- 长时间待机唤醒测试
6. 与FAE协作经验
和FAE打交道是门艺术。我的经验是:
提供完整的问题描述:
- 现象(屏幕闪烁/触摸不灵)
- 复现步骤
- 测试环境
- 相关日志
有效沟通初始化问题:
// 错误示例:FAE给的初始化序列 {0xB0, 7, {0x22,0x61,0x1E,0x61,0x2F,0x2F,0x2F}}, // 实际效果:屏幕偏色固件升级注意事项:
- 确认版本号
- 备份原始固件
- 记录升级过程
要资料的技巧:
- 明确要什么(规格书/初始化代码/调试工具)
- 说明用途(调试/量产)
- 提供设备信息(硬件版本/软件版本)
7. 量产前的最后检查
进入量产阶段前,必须检查:
驱动配置:
- [ ] 所有宏开关正确
- [ ] 电源管理完善
- [ ] 错误处理健全
版本控制:
DRIVER_VERSION = "1.0.2_20230815"兼容性测试:
- 不同温度环境
- 不同电压波动
- 长时间运行
文档整理:
- 驱动配置说明
- 常见问题排查
- 参数调整指南
最后给个小技巧:在驱动中加入版本信息,方便后续维护:
MODULE_VERSION("1.0.3"); MODULE_DESCRIPTION("ST7102 LCD Driver for MT6833");