项目:
2023年11月。客户有个板子更换mipi屏幕,之前已经调试好了,可以正常显示。后面发现屏幕有点暗,需要改动初始化参数。为啥之前不用写也可以做正常显示:因为出厂时候屏幕厂商已经写好一次。但是有一个问题,只能写一次,后面不能再写。所以现在需要初始化屏幕时候,写入屏幕初始化参数。
问题描述
屏幕初始化参数
验证时候 屏幕是可以正常显示的。但是没有看到想要的变化,这组参数在别的板子(非rk)上是正常的。怀疑是没有正常写入。
原因分析:
出现了问题 我先看看代码。我分析这个函数static int panel_simple_prepare(struct drm_panel *panel) 因为这个函数是下发屏幕初始化参数开始。
查看代码
ssize_t mipi_dsi_dcs_write_buffer(struct mipi_dsi_device *dsi,
const void *data, size_t len)
{
struct mipi_dsi_msg msg = {
.channel = dsi->channel,
.tx_buf = data,
.tx_len = len
};
switch (len) {
case 0:
return -EINVAL;
case 1:
msg.type = MIPI_DSI_DCS_SHORT_WRITE;
break;
case 2:
msg.type = MIPI_DSI_DCS_SHORT_WRITE_PARAM;
break;
default:
msg.type = MIPI_DSI_DCS_LONG_WRITE;
break;
}
return mipi_dsi_device_transfer(dsi, &msg);
}
加入debug打印 mipi_dsi_device_transfer函数是有执行写入。但是就是不能看到变化。
上电时序分析
启动时序问题 供电脚、enable脚、reset脚 电位是否正常,是否满足datasheet上的时序要求?
gpiod_direction_output(p->reset_gpio, 0);
if (p->desc->delay.reset)
msleep(p->desc->delay.reset);
gpiod_direction_output(p->reset_gpio, 1);
用万用表量reset引脚也可以看到正常变化,供电也有。
继续看到代码 发现一处地方我是没有进行msleep(p->desc->delay.init)
if (p->desc->delay.init)
msleep(p->desc->delay.init);
复位完成后,马上写入参数,可能会造成写入不成功。
解决方案:
在dts文件里面加入init-delay-ms = <50>;
添加后的样子
dsi0_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
backlight = <&backlight_mipi>;
power-supply = <&vcc3v3_mipi_lcd>;
reset-gpios = <&gpio2 RK_PA1 GPIO_ACTIVE_HIGH>;
enable-gpios = <&gpio2 RK_PB0 GPIO_ACTIVE_HIGH>;
reset-delay-ms = <100>;
enable-delay-ms = <10>;
init-delay-ms = <50>;
prepare-delay-ms = <50>;
unprepare-delay-ms = <10>;
disable-delay-ms = <60>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
panel-init-sequence =
..............
也不知道是什么时候少了init-delay-ms 配置。添加后烧录,发现屏幕有明显变化了。说明写入成功。