调试一个mipi 屏,在背光上遇到了问题,调背光的时候屏在闪,确实能把背光调暗。
调试方法是用的mipi 写寄存器。log上没有相关的东西。软件上的用法是
void rk_mipi_adjust_bl(u8 value)
{
+ u8 cmds4;
+
cmds0 = LPDT;
+ cmds1 = 0x15;
+ cmds2 = 0x51;
+ cmds3 = value;
+ dsi_send_packet(0, cmds, 4);
+ printk("++++++++++++++++%s:%d\n", func, value);
}
+EXPORT_SYMBOL_GPL(rk_mipi_adjust_bl);
看mipi datasheet ,调背光的寄存器确实是 0x51 ,用的ic 是 R69429
继续测试,发现只要在系统已经跑起来后写任何一个寄存器都会导致屏闪,颜色乱,于是在 写命令之前把这个加上
dsi_enable_video_mode(0, 0);
dsi_enable_command_mode(0, 1);
,写完后再
dsi_enable_command_mode(0, 0);
dsi_enable_video_mode(0, 1);
。
这样写后会稳定颜色错,位置有偏移。
把 mipi 的 dsi_hs_clk 和 clock-frequency 改低后还是一样。
在网上找了资料,发现在 mtk 平台有这样写过。但是其代码来看,没什么特殊的,
如 {"lcd-backlight", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK,{0}}, 这些配置,跟踪代码如下。也没什么特殊。
static void lcm_setbacklight(unsigned int level)
{
if(level > 255) level = 255;
send_ctrl_cmd(0x51);
send_data_cmd(level);
}
最后在瑞芯微原厂的支持下,加了一句 rk_fb_poll_wait_frame_complete(); 解决了屏闪的问题,分析是在video 传输的时候不能直接传命令,不然会对video 有影响。
+ unsigned long flags;
+
+ u8 cmds[4];
+ local_irq_save(flags);
+ rk_fb_poll_wait_frame_complete();
+
+ cmds[0] = HSDT;
+ cmds[1] = 0x15;
+ cmds[2] = 0x51;
+ cmds[3] = value;
+ dsi_send_packet(0, cmds, 4);
+
+ local_irq_restore(flags);
调试方法是用的mipi 写寄存器。log上没有相关的东西。软件上的用法是
void rk_mipi_adjust_bl(u8 value)
{
+ u8 cmds4;
+
cmds0 = LPDT;
+ cmds1 = 0x15;
+ cmds2 = 0x51;
+ cmds3 = value;
+ dsi_send_packet(0, cmds, 4);
+ printk("++++++++++++++++%s:%d\n", func, value);
}
+EXPORT_SYMBOL_GPL(rk_mipi_adjust_bl);
看mipi datasheet ,调背光的寄存器确实是 0x51 ,用的ic 是 R69429
继续测试,发现只要在系统已经跑起来后写任何一个寄存器都会导致屏闪,颜色乱,于是在 写命令之前把这个加上
dsi_enable_video_mode(0, 0);
dsi_enable_command_mode(0, 1);
,写完后再
dsi_enable_command_mode(0, 0);
dsi_enable_video_mode(0, 1);
。
这样写后会稳定颜色错,位置有偏移。
把 mipi 的 dsi_hs_clk 和 clock-frequency 改低后还是一样。
在网上找了资料,发现在 mtk 平台有这样写过。但是其代码来看,没什么特殊的,
如 {"lcd-backlight", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK,{0}}, 这些配置,跟踪代码如下。也没什么特殊。
static void lcm_setbacklight(unsigned int level)
{
if(level > 255) level = 255;
send_ctrl_cmd(0x51);
send_data_cmd(level);
}
最后在瑞芯微原厂的支持下,加了一句 rk_fb_poll_wait_frame_complete(); 解决了屏闪的问题,分析是在video 传输的时候不能直接传命令,不然会对video 有影响。
+ unsigned long flags;
+
+ u8 cmds[4];
+ local_irq_save(flags);
+ rk_fb_poll_wait_frame_complete();
+
+ cmds[0] = HSDT;
+ cmds[1] = 0x15;
+ cmds[2] = 0x51;
+ cmds[3] = value;
+ dsi_send_packet(0, cmds, 4);
+
+ local_irq_restore(flags);
就不会造成颜色和屏闪的问题了,
另:local_irq_restore 的用法待查