1. 高通平台LCD与TP驱动移植概述
当你拿到一块全新的LCD和TP模组,准备将其集成到高通平台时,整个过程就像在组装一台精密的仪器。LCD(液晶显示器)负责图像显示,TP(触摸面板)负责用户交互,两者协同工作才能提供完整的用户体验。在高通平台上,驱动移植主要分为LK(Little Kernel)和Kernel两个阶段。
LK阶段是系统启动的早期阶段,主要负责硬件初始化和基本显示功能。这个阶段需要配置LCD的电源、GPIO、时序参数等基础设置。Kernel阶段则是系统正常运行时的驱动加载,需要处理更复杂的显示控制和触摸事件。两个阶段的配置必须严格匹配,否则可能导致显示异常或触摸失灵。
我曾遇到过一块HX8394D面板,在LK阶段点亮正常,但进入Kernel后却出现花屏。经过排查发现是LK和Kernel的DSI时钟配置不一致导致的。这种跨阶段的参数一致性检查,是驱动移植中最容易忽视的问题之一。
2. 硬件原理图分析
2.1 关键信号引脚识别
拿到原理图后,首先要确认几个关键信号:
- 电源引脚:通常包括2.8V和1.8V两种电压
- 复位引脚(RESET):控制LCD的硬件复位
- 背光控制:可能是PWM或简单的GPIO使能
- MIPI DSI通道:4 lane还是2 lane
- 触摸面板的中断和复位引脚
以一块720p的HX8394D面板为例,原理图可能显示:
- VDD 2.8V连接LDO17
- VDD 1.8V连接LDO6
- RESET连接GPIO61
- 背光使能连接GPIO137
- 使用4 lane MIPI DSI接口
2.2 电源需求分析
LCD模组通常需要多组电源供电,包括:
- 模拟电源(AVDD):2.8V左右,用于驱动液晶分子
- 数字电源(DVDD):1.8V左右,用于逻辑电路
- I/O电源(VDDIO):1.8V或3.3V,用于接口电平
电源时序也很关键。有些面板要求数字电源先于模拟电源上电,有些则相反。我曾遇到一块面板因为电源上电顺序错误导致初始化失败,调整LDO使能顺序后才解决问题。
3. LK阶段驱动配置
3.1 面板参数头文件配置
在LK中,首先要在bootable/bootloader/lk/dev/gcdb/display/include/目录下创建面板专用的头文件,例如panel_hx8394d_720p_video.h。这个文件包含所有显示参数,主要结构体包括:
struct panel_resolution { uint32_t width; // 水平分辨率 uint32_t height; // 垂直分辨率 // 前后肩参数 uint32_t h_front_porch; uint32_t h_back_porch; uint32_t h_pulse_width; uint32_t v_front_porch; uint32_t v_back_porch; uint32_t v_pulse_width; }; struct mipi_dsi_cmd { char payload[4]; // 命令和参数 uint32_t delay; // 命令间隔 };分辨率配置示例:
static struct panel_resolution hx8394d_720p_video_panel_res = { 720, 1280, // 分辨率 40, 40, // h_front_porch, h_back_porch 10, // h_pulse_width 10, 14, // v_front_porch, v_back_porch 2 // v_pulse_width };3.2 DSI时序参数计算
DSI时序参数需要通过高通提供的Excel工具计算。打开"80-NH713-1_Y_DSI_Timing_Parameters_User_Interactive_Spreadsheet.xlsm",输入:
- 面板分辨率
- 前后肩参数
- 帧率(通常60Hz)
- 色彩深度(18/24bit)
- lane数量
计算后会得到11个参数,需要转换为12位的数组:
const uint32_t hx8394d_720p_video_timings[] = { 0x88, 0x1e, 0x12, 0x00, 0x42, 0x46, 0x18, 0x20, 0x16, 0x03, 0x04, 0x00 };3.3 电源和GPIO配置
电源配置在regulator.c中:
static uint32_t ldo17[][11] = { { LDOA_RES_TYPE, 17, KEY_SOFTWARE_ENABLE, 4, GENERIC_ENABLE, KEY_MICRO_VOLT, 4, 2850000, KEY_CURRENT, 4, 40 } };GPIO配置在target_display.c中:
static struct gpio_pin reset_gpio = { "msmgpio", 61, // GPIO61 3, // 8mA驱动能力 1, // 输出模式 0, // 无上拉 1 // 初始状态高电平 };4. Kernel阶段驱动移植
4.1 DTSI设备树配置
在kernel/msm-3.18/arch/arm64/boot/dts/qcom/下创建面板专用的dtsi文件,例如dsi-panel-hx8394d-720p-video.dtsi。主要内容包括:
dsi_hx8394d_720_vid: qcom,mdss_dsi_hx8394d_720p_video { qcom,mdss-dsi-panel-width = <720>; qcom,mdss-dsi-panel-height = <1280>; qcom,mdss-dsi-h-front-porch = <40>; qcom,mdss-dsi-h-back-porch = <40>; qcom,mdss-dsi-h-pulse-width = <10>; qcom,mdss-dsi-h-sync-skew = <0>; qcom,mdss-dsi-v-back-porch = <14>; qcom,mdss-dsi-v-front-porch = <10>; qcom,mdss-dsi-v-pulse-width = <2>; qcom,mdss-dsi-bpp = <24>; qcom,mdss-dsi-lane-0-state; qcom,mdss-dsi-lane-1-state; qcom,mdss-dsi-lane-2-state; qcom,mdss-dsi-lane-3-state; };4.2 电源和GPIO配置
在DTSI中配置电源:
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;GPIO配置示例:
pmx_mdss { mdss_dsi_active: mdss_dsi_active { mux { pins = "gpio61"; function = "gpio"; }; config { pins = "gpio61"; drive-strength = <8>; bias-disable = <0>; output-high; }; }; };4.3 触摸面板配置
TP配置主要包括:
- 中断和复位GPIO
- I2C总线配置
- 电源管理
- 触摸坐标校正
示例配置:
&i2c_3 { gt9xx@5d { compatible = "goodix,gt9xx"; reg = <0x5d>; interrupt-parent = <&msm_gpio>; interrupts = <13 0x2008>; reset-gpios = <&msm_gpio 12 0x00>; vdd-supply = <&pm8953_l17>; vcc-i2c-supply = <&pm8953_l6>; goodix,panel-coords = <0 0 720 1280>; goodix,display-coords = <0 0 720 1280>; goodix,change-x2y; }; };5. 常见问题排查
5.1 LCD无法点亮
检查步骤:
- 确认电源电压和时序正确
- 检查复位信号波形
- 验证MIPI信号是否正常
- 检查LK和Kernel的参数一致性
常见问题:
- 电源未使能:测量各电源引脚电压
- 复位时序错误:用示波器检查复位信号
- MIPI时钟问题:确认lane数量和时钟频率
- 参数不匹配:比较LK和Kernel的配置
5.2 显示异常
显示异常可能表现为:
- 花屏:通常是时序参数错误
- 画面偏移:前后肩参数不正确
- 颜色异常:色彩深度或格式配置错误
调试方法:
- 重新计算DSI时序参数
- 检查像素格式(RGB888/RGB565)
- 验证VSYNC/HSYNC极性
5.3 触摸失灵
TP问题排查步骤:
- 确认I2C通信正常:
i2cdetect -y 3 - 检查中断信号:
cat /proc/interrupts - 验证电源和复位
- 检查坐标转换配置
我曾遇到一个案例,TP在横屏模式下坐标错误,通过添加goodix,change-x2y属性解决了问题。
6. Bring Up检查清单
6.1 硬件检查
- [ ] 确认电源电压和电流满足要求
- [ ] 检查所有信号线连接正确
- [ ] 验证复位和中断信号波形
- [ ] 测量MIPI信号质量
6.2 软件检查
- [ ] LK和Kernel参数一致
- [ ] 电源管理配置正确
- [ ] GPIO配置与原理图一致
- [ ] 设备树节点正确绑定
6.3 功能验证
- [ ] LCD能正常显示图像
- [ ] 背光亮度可调
- [ ] 触摸坐标准确
- [ ] 休眠唤醒功能正常
7. 调试技巧与工具
7.1 常用调试命令
查看显示相关信息:
cat /sys/class/graphics/fb0/modes cat /sys/class/graphics/fb0/mode dmesg | grep -i mdss触摸面板调试:
getevent -l /dev/input/event2 cat /proc/interrupts | grep -i touch7.2 内核调试接口
通过sysfs调试显示参数:
echo 1 > /sys/class/graphics/fb0/blank # 关闭显示 echo 0 > /sys/class/graphics/fb0/blank # 开启显示调整背光亮度:
echo 50 > /sys/class/backlight/backlight/brightness7.3 示波器测量要点
关键测量点:
- 电源上电时序
- 复位信号波形
- MIPI时钟和数据信号
- 背光PWM信号
测量时注意:
- 使用差分探头测量MIPI信号
- 捕获完整的复位序列
- 检查电源纹波是否在允许范围内
8. 性能优化建议
8.1 显示性能优化
- 启用面板自刷新功能:
qcom,mdss-dsi-pan-enable-dynamic-fps; qcom,mdss-dsi-pan-fps-update = "dfps_immediate_clk_mode";- 优化帧缓冲配置:
qcom,mdss-dsi-fbc-enable; qcom,mdss-dsi-fbc-bpp = <8>;8.2 触摸响应优化
- 调整中断触发方式:
interrupts = <13 0x2008>; /* IRQ_TYPE_EDGE_FALLING */- 优化滤波参数:
goodix,filter-level = <2>; goodix,noise-filter-enable;8.3 电源管理优化
- 配置低功耗模式:
qcom,mdss-dsi-lp11-init; qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";- 优化休眠唤醒时序:
qcom,mdss-dsi-reset-sequence = <1 10>, <0 10>, <1 50>;