最近在展锐平台上调试一款MIPI接口的触摸屏,从点亮屏幕到触摸功能正常,整个过程遇到了不少坑。作为嵌入式开发的老兵,我决定把这次调试的完整过程记录下来,希望能帮到同样在展锐平台上奋斗的同行们。
这次调试的硬件平台是展锐UMS9620,屏幕型号是ICNL9951R,分辨率为1600x2176,采用MIPI接口。触摸屏是HIMAX的HX83102J方案。整个调试过程分为两大块:LCD屏幕驱动配置和触摸屏驱动配置。
LK(Little Kernel)是展锐平台的bootloader阶段,我们需要在这里完成屏幕的初始化和基本显示功能。
首先需要在LK中添加屏幕的驱动文件,主要修改以下几个文件:
code复制/platform/sprd_shared/driver/video/sprd/lcd/lcd_icnl9951r_tlcm_hjr127009d_mipi_fhd.c
/platform/sprd_shared/driver/video/sprd/lcd/panel_cfg.h
/platform/sprd_shared/driver/video/sprd/rules.mk
/project/ums9620_1h10.mk
驱动文件中最关键的是三个部分:
这里特别要注意的是上电时序,不同屏幕的复位时序、电源稳定时间要求可能不同。我们的屏幕需要:
在panel_info结构体中,需要配置以下关键参数:
c复制static struct panel_info icnl9951r_tlcm_hjr127009d_info = {
.width = 1600,
.height = 2176,
.pixel_clk = 246000000, /*Hz*/
.rgb_timing = {
.hfp = 60,
.hbp = 52,
.hsync = 20,
.vfp = 116,
.vbp = 32,
.vsync = 8,
},
.phy_freq = 1476000, // MIPI时钟频率
.lane_num = 4, // MIPI通道数
.dpi_clk_div = 6, // 六分频
// 其他参数...
};
这些参数必须与屏幕规格书完全一致,否则会出现显示异常、花屏等问题。
在kernel中需要为屏幕添加对应的DTS配置,主要参数要与LK中保持一致:
dts复制sprd,dsi-lane-number = <4>;
sprd,phy-bit-clock = <1476000>; /* kbps */
sprd,dpi-clk-div = <6>;
sprd,slice-width = <800>;
sprd,slice-height = <8>;
DTS中的initial-command需要与LK中的init_data完全一致,这是屏幕的初始化命令序列。
显示时序配置非常关键,配置错误会导致显示位置偏移、闪烁等问题:
dts复制display-timings {
native-mode = <&icnl9951r_tlcm_hjr127009d_timing0>;
icnl9951r_tlcm_hjr127009d_timing0: timing0 {
clock-frequency = <246000000>;
hactive = <1600>;
vactive = <2176>;
hback-porch = <52>;
hfront-porch = <60>;
vback-porch = <32>;
vfront-porch = <116>;
hsync-len = <20>;
vsync-len = <8>;
};
};
注意事项:
- 时钟频率计算要准确,必须与像素时钟匹配
- 前后porch和sync长度必须与屏幕规格书一致
- 不同分辨率的屏幕这些参数差异很大,不能简单复制
触摸屏的配置主要在设备树中完成,需要添加以下节点:
dts复制touchpanel@0 {
compatible = "himax,hxcommon";
reg = <0>;
spi-max-frequency = <8000000>;
himax,panel-coords = <0 1600 0 2176>;
himax,display-coords = <1600 2176>;
himax,irq-gpio = <&ap_gpio 13 GPIO_ACTIVE_HIGH>;
himax,rst-gpio = <&ap_gpio 14 GPIO_ACTIVE_HIGH>;
report_type = <1>;
};
关键点:
将触摸驱动代码集成到内核模块中,主要步骤:
code复制EXT_MODULES+=" ../modules/kernel5.15/touchscreen/himax_hx83102j"
触摸IC通常需要固件支持,需要:
makefile复制PRODUCT_COPY_FILES += \
$(VND_MPOOL)/module/vendor/ts/firmware/HJR_IVO12.7_102J_D00_C07_20251223_014849.bin:$(TARGET_COPY_OUT_ODM)/firmware/Himax_firmware_hjr_1217.bin
常见问题:
- 固件版本不匹配会导致触摸无反应或坐标错误
- 固件路径配置错误会导致加载失败
- 不同批次的触摸屏可能需要不同的固件
屏幕点不亮
显示花屏
显示位置偏移
触摸无反应
触摸坐标错误
触摸不灵敏
bash复制# 查看显示相关时钟
cat /d/clk/clk_summary | grep dsi
# 查看显示参数
cat /sys/class/graphics/fb0/modes
# 查看触摸设备信息
getevent -l
# 查看触摸驱动日志
dmesg | grep -i touch
文档是关键:屏幕和触摸IC的规格书必须仔细阅读,特别是时序要求和寄存器配置。
分步调试:先确保LCD显示正常,再调试触摸功能。不要同时修改多处配置。
工具准备:
日志分析:展锐平台有丰富的调试日志,善用printk和dmesg。
社区资源:展锐开发者社区和芯片原厂支持是解决问题的宝贵资源。
这次调试中最耗时的部分是屏幕初始化命令的调试,由于规格书提供的命令序列与实际要求有差异,我们通过与原厂工程师反复沟通才最终确定正确的序列。这也提醒我们,当遇到不符合预期的现象时,及时寻求原厂支持可以节省大量时间。
最后,对于展锐平台的显示和触摸调试,耐心和细致的记录是成功的关键。每次修改配置后都要做好记录,这样才能在出现问题时快速回溯和定位。