当前位置: 首页 > news >正文

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, {}} };

转换规则很简单:

  1. 第一个字段取mipi.write第二个参数(寄存器地址)
  2. 第二个字段是后续参数的个数
  3. 第三个字段用大括号包裹剩余参数

注意:delay语句要转换为{REGFLAG_DELAY, 120, {}}这样的结构体,其中120表示延迟毫秒数

2. 内核层驱动适配详解

进入kernel阶段后,事情变得更有趣了。在kernel-4.14/drivers/gpu/drm/panel/下创建panel驱动时,需要特别注意以下几点:

2.1 DTS节点配置

首先在设备树中添加panel节点:

panel3@0 { 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_DSI

3. 触摸驱动(sitronix_ts)移植技巧

触摸驱动的移植往往比LCD更折腾,特别是遇到I2C通信不稳定时。以下是关键步骤:

3.1 设备树配置

sitronix@55 { 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 常见问题排查

  1. 无中断响应:先用示波器检查IRQ引脚波形
  2. I2C通信失败:检查上拉电阻是否合适(通常4.7K)
  3. 坐标偏移:检查屏幕旋转配置CONFIG_TOUCHSCREEN_PHYSICAL_ROTATION_WITH_LCM

4. 调试技巧与实战经验

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时序)
  • -6:I2C通信问题(检查线路和电压)

4.2 实用调试命令

# 查看i2c设备是否识别 adb shell cat /sys/bus/i2c/devices/i2c-*/name # 强制重新探测触摸IC adb shell "echo 1 > /sys/bus/i2c/drivers/sitronix_ts/*/reset"

4.3 性能优化参数

lcm_get_params中调整这些参数可以改善显示效果:

params->dsi.PLL_CLOCK = 200; // 提升时钟频率改善刷新率 params->dsi.vertical_frontporch = 276; // 调整垂直前 porch params->dsi.horizontal_active_pixel = 480; // 确保与分辨率匹配

最后提醒:每次修改驱动后,建议先编译LK单独烧录验证,再处理kernel部分。曾经有个项目因为没注意这点,浪费了两天时间排查一个简单的时序问题。

http://www.jsqmd.com/news/644903/

相关文章:

  • 如何快速上手Tesseract .NET:5分钟实现图片文字识别
  • 终极免费指南:3分钟解锁QQ音乐加密文件,实现跨平台自由播放
  • 告别KV Studio!用C#和HSL库5分钟搞定基恩士PLC数据采集(附完整代码)
  • 三步实现闲鱼数据自动化采集:从零开始构建市场分析工具
  • 2026年3月优质的铝型材工作台生产厂家推荐,铝型材安全围栏/欧标铝型材/生产线铝型材,铝型材工作台实力厂家哪家好 - 品牌推荐师
  • 告别网络卡顿!5步打造你的专属离线漫画图书馆
  • Tesseract .NET错误处理与调试:常见问题解决方案
  • 终极指南:VisualCppRedist AIO一站式解决Windows运行库问题
  • 如何用百元硬件搭建专业级开源无人机?ESP-Drone完整指南
  • 2026年全新java面试题,查漏补缺,直通大厂
  • 2025终极网盘直链提取指南:LinkSwift八大网盘高速下载解决方案
  • 三步搞定Windows多语言软件兼容性:Locale Emulator终极指南
  • 如何快速集成Jcrop与Vue框架:构建现代化图像裁剪应用的完整指南
  • 终极指南:如何用magic-trace快速诊断异步运行时和垃圾回收器性能问题
  • 第13篇:学习AUTOSAR的高效路径:理论与实践交叉学习指南
  • 别再手动拼接音频了!用Python的WOLA方法5分钟搞定信号完美重建
  • Umi-CUT:批量图片去黑边与裁剪的终极免费工具
  • 告别卡顿!手把手教你将TUM RGBD的tgz包转成30Hz流畅bag文件(附Python脚本)
  • pycodestyle 批量检查终极指南:如何一次扫描整个Python项目代码
  • Hunyuan-MT-7B部署实战:16GB显存跑通33种语言互译
  • FPGA新手避坑指南:手把手教你用Vivado MIG IP核配置DDR3(以MT41K256M16为例)
  • GaussDB索引优化实战:从基础创建到联合索引性能对比
  • 从原理到实践:手把手教你优化Navigation2的AMCL定位性能
  • VBA生鲜商品损耗自动核销宏,打破老会计手动折算生鲜亏损传统,录入折价比例代码,一键核销库存成本,动态算损耗,机器实时核算碾压隔日人工统算模式。
  • Log4j高级配置实战:从基础属性到自定义Appender的完整指南
  • 如何用Fan Control彻底告别电脑噪音:Windows风扇控制终极指南
  • Fantasy-Map-Generator终极指南:为DD游戏创建完美幻想地图的10个技巧
  • Rider 2024.2 + GitHub Copilot 保姆级配置指南:从安装到写出第一行AI代码
  • OmenSuperHub终极指南:3步深度优化惠普OMEN游戏本性能
  • JavaScript 比较 和 逻辑运算符