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。这个文件可以从同平台其他相似驱动拷贝过来重点修改以下几个部分static struct LCM_setting_table lcm_init_setting_tl_inx[] { // 示例转换mipi.write 0x29 0x99 0x71 0x02 0xa2 {0x99, 3, {0x71, 0x02, 0xa2}}, {0x99, 3, {0x71, 0x02, 0xa3}}, {0x99, 3, {0x71, 0x02, 0xa4}}, // 电源配置 {0xB0, 7, {0x22, 0x61, 0x1E, 0x61, 0x2F, 0x2F, 0x2F}}, // 时序参数 {0xB2, 5, {0x15, 0x11, 0x05, 0x23, 0x19}}, // 结尾标志 {REGFLAG_END_OF_TABLE, 0x00, {}} };转换规则很简单第一个字段取mipi.write第二个参数寄存器地址第二个字段是后续参数的个数第三个字段用大括号包裹剩余参数注意delay语句要转换为{REGFLAG_DELAY, 120, {}}这样的结构体其中120表示延迟毫秒数2. 内核层驱动适配详解进入kernel阶段后事情变得更有趣了。在kernel-4.14/drivers/gpu/drm/panel/下创建panel驱动时需要特别注意以下几点2.1 DTS节点配置首先在设备树中添加panel节点panel30 { compatible tf,st7102_wvga_dsi_tl_kalaide_31in_incell; reg 2; reset-gpios pio 86 0; port { panel_in3: endpoint { remote-endpoint dsi_out; }; }; };2.2 驱动初始化代码将LK阶段的数组转换为内核驱动写法static void lcm_panel_init(struct lcm *ctx) { // 复位序列 gpiod_set_value(ctx-reset_gpio, 1); mdelay(10); gpiod_set_value(ctx-reset_gpio, 0); mdelay(10); // 转换后的初始化序列 lcm_dcs_write_seq_static(ctx, 0x99, 0x71, 0x02, 0xA2); lcm_dcs_write_seq_static(ctx, 0xB0, 0x22, 0x61, 0x1E, 0x61, 0x2F, 0x2F, 0x2F); // 更多初始化命令... // 点亮屏幕 lcm_dcs_write_seq_static(ctx, 0x11); // Sleep Out mdelay(120); lcm_dcs_write_seq_static(ctx, 0x29); // Display On }2.3 Makefile和Kconfig配置别忘了在drivers/gpu/drm/panel/Kconfig添加config DRM_PANEL_ST7102_WVGA_DSI_TL_KALAIDE_31IN_INCELL tristate ST7102_WVGA_DSI_TL_KALAIDE_31IN_INCELL panel depends on OF depends on DRM_MIPI_DSI3. 触摸驱动(sitronix_ts)移植技巧触摸驱动的移植往往比LCD更折腾特别是遇到I2C通信不稳定时。以下是关键步骤3.1 设备树配置sitronix55 { compatible sitronix_ts; reg 0x55; irq-gpio pio 14 0x0; rst-gpio pio 15 0x0; status okay; };3.2 驱动加载方式选择在Makefile中建议用obj-y直接编译进内核obj-y sitronix_ts.o obj-y sitronix_ts_i2c.o # 避免使用obj-m生成ko模块3.3 常见问题排查无中断响应先用示波器检查IRQ引脚波形I2C通信失败检查上拉电阻是否合适通常4.7K坐标偏移检查屏幕旋转配置CONFIG_TOUCHSCREEN_PHYSICAL_ROTATION_WITH_LCM4. 调试技巧与实战经验4.1 关键日志分析在内核日志中重点关注[ 2.456789] mtk-dsi 14000000.dsi: [DRM] Failed to set mode: ret-110 [ 2.567890] sitronix_ts i2c-ST7102-TP: probe failed -6常见错误码-110超时检查reset时序-6I2C通信问题检查线路和电压4.2 实用调试命令# 查看i2c设备是否识别 adb shell cat /sys/bus/i2c/devices/i2c-*/name # 强制重新探测触摸IC adb shell echo 1 /sys/bus/i2c/drivers/sitronix_ts/*/reset4.3 性能优化参数在lcm_get_params中调整这些参数可以改善显示效果params-dsi.PLL_CLOCK 200; // 提升时钟频率改善刷新率 params-dsi.vertical_frontporch 276; // 调整垂直前 porch params-dsi.horizontal_active_pixel 480; // 确保与分辨率匹配最后提醒每次修改驱动后建议先编译LK单独烧录验证再处理kernel部分。曾经有个项目因为没注意这点浪费了两天时间排查一个简单的时序问题。