MTK MT6833平台LCD与TP驱动移植实战:从FAE伪代码到内核驱动集成
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中配置面板参数panel30 { 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配置要特别注意sitronix55 { 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.5VVSN通常-5.5VVDD/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);