Android—— MIPI屏调试

一、实现步骤

1、在kernel/arch/arm/boot/dts/lcd-box.dtsi文件中打开&dsi0节点,关闭其他显示面板接口(&edp_panel、&lvds_panel)

复制代码
--- a/kernel/arch/arm/boot/dts/lcd-box.dtsi
+++ b/kernel/arch/arm/boot/dts/lcd-box.dtsi
@@ -5,14 +5,14 @@
&dsi0 {
//enable-gpios = <&gpio6 7 GPIO_ACTIVE_HIGH>;
- reset-gpios = <&gpio7 3 GPIO_ACTIVE_HIGH>;
- status = "disabled";
- rockchip,lane-rate = <1000>;
+ status = "okay";
+ rockchip,lane-rate = <546>;
@@ -276,7 +254,7 @@
//enable-delay-ms = <120>;
pinctrl-0 = <&lcd_cs>;
power-supply = <&vcc_lcd>;
- status = "okay";
+ status = "disabled";
display-timings {
native-mode = <&timing_edp>;
@@ -300,7 +278,7 @@
};
&lvds_panel {
- status = "okay";
+ status = "disabled";

2、根据屏幕厂商提供的初始化指令将panel-init-sequence填好

该指令用于下发到屏幕IC,部分屏幕IC集成了初始化指令则不需要,然后打开文件会看到对应的初始化代码,将初始化指令转换为RK可以识别的格式。大致步骤如下:

(1)打开初始化指令文件,如下图:

从上面可以看到屏幕的一些参数:分辨率(800x1280),使能电压(5.5V)以及差分时钟通道个数(4 Lane) ,转化规则rk说明书上面有,用得比较多的就是DCS Write,0x15,0x39。

复制代码
1、0x15
REGISTER,01,00,该指令对应的是:15 00 02 01 00
15 :表示0x15指令
00 :表示没有延时
02 :表示2个数据长度 01 00
01 :表示寄存器地址
00 :表示1个数据


2、0x39
REGISTER,FF,98,81,03,该指令对应的是:39 00 04 FF 98 81 03
39 :表示0x39指令
00 :表示没有延时
04 :表示4个数据长度 FF 98 81 03
FF :表示寄存器地址
98 81 03 :表示数据1 数据2 数据3


3、DCS Write
WriteComm (0xAD)<----------------->这是写命令操作,命令地址(寄存器地址)0xAD
WriteData (0xEB)<----------------->这是写数据操作,数据为:0xEB
WriteData (0x98)<----------------->这是写数据操作,数据为:0x98
WriteData (0x67)<----------------->这是写数据操作,数据为:0x67
数据是多个数据,所以用的指令是0x39,39 00 11 AD EB 98 67 

如果
WriteComm (0xAD)
WriteData (0x56),则转化为:15 00 02 AD 56

4.
SSD_SEND(地址,寄存器1的值,寄存器2的值,寄存器3值...)
SSD_SEND(0x01,0xE0,0xAB,0xBA);
SSD_SEND(0x01,0xE1,0xBA,0xAB);
SSD_SEND(0x01,0xB1,0x10,0x01,0x47,0xFF);
SSD_SEND(0x01,0xB2,0x0C,0x14,0x04,0x50,0x50,0x14);

转换为:
39 00 03 E0 AB BA
39 00 03 E1 BA AB
39 00 05 B1 10 01 47 FF
39 00 07 B2 0C 14 04 50 50 14			

按照瑞芯微官方MIPI屏适配手册以此类推,并将他写到panel-init-sequence数组里面。

(2)完成初始指令时,他的末尾都会有一个ExitSleep指令,如图所示:

该指令的翻译为: 39 00 04 FF 98 81 00 05 78 01 11 05 14 01 29 将它们添加到panel-init-sequence数组末尾,作为屏幕唤醒代码。

(3)添加EnterSleep指令到panel-exit-sequence数组里,实现休眠功能,威耀供应商提供的MIPI屏幕采用的时统一的代码,如下图所示:

3、修改屏参display-timings

按照规格书来配置屏幕的各个参数

1、不要漏了lane-rate,这里是4;

2、clock-frequency的计算公式:

clock-frequency =(Hsync+HBP+HAdr+HFP)x(Vsync+VBP+VAdr+VFP)x FPS ,其中FPS为屏幕刷新率。

3、lane-rate的计算公式,

lane-rate= clk(时钟频率) * RGB(3) * BIT(8) / lane_num ,lane_num表示差分时钟通道数。

4、确定一下reset-gpio

根据硬件原理图,确定reset-gpio

reset-gpios = <&gpio7 3 GPIO_ACTIVE_HIGH>;

配置如下:

复制代码
&dsi0 {
 reset-gpios = <&gpio7 3 GPIO_ACTIVE_HIGH>;
 status = "okay";
 rockchip,lane-rate = <546>;
    display-timings {
        native-mode = <&timing_mipi>;
        timing_mipi: timing_mipi {
            clock-frequency = <75000000>;
            hactive = <800>;
            vactive = <1200>;
            hsync-len = <10>;
            hback-porch = <40>;
            hfront-porch = <40>;
            vsync-len = <5>;
            vback-porch = <20>;
            vfront-porch = <30>;
            hsync-active = <0>;
            vsync-active = <0>;
            de-active = <0>;
            pixelclk-active = <0>;  
}
    }
        }             

5、检测硬件

(1)查看屏幕的电路设计,针对性的测量电路上的使能引脚和接地脚的电压,然后和硬件设计数据比对,判断是否符合标准

(2)在测量完电路没有问题的情况下,接着我们来通过示波器测量一下reset脚的波形和对应屏幕时钟的差分信号,跟规格书进行比较。

我们reset-gpio的控制则在kernel/drivers/gpu/drm/panel/panel-simple.c

这里可以看到完全不符合供应商屏幕规格书显示的波形,屏幕规格书显示波形转换为代码应该是:

复制代码
gpiod_direction_output(p->reset_gpio, 1);

gpiod_direction_output(p->reset_gpio, 0);

gpiod_direction_output(p->reset_gpio, 1);

而我们这边的代码则是这样的顺序:

复制代码
gpiod_direction_output(p->reset_gpio, 1);

gpiod_direction_output(p->reset_gpio, 0);

所以我们要再加上拉高reset-gpio的操作:

"gpiod_direction_output(p->reset_gpio, 1);",

代码如图所示:

6、编译kernel并进行烧录,发现屏幕正常亮起

二、调试常见问题

1、在点亮屏后刚开始有开机 logo 闪烁,向右偏移了近半个屏幕的长度

重新确认 clock-frequence 。(不一定要理论数值,可以适当调整大小,理论数值只是作为标准来参考)

2、显示图像偏移比较大

稍微降低 hs_clk ,由 504 降低到 496 解决。

3、垂直方向会显示多一点内容

调整 VFP 后解决。

4、下面会有黑边

稍微增大 VBP 后解决

5、开机 android 最左边会被裁剪一部分

增大 HBP 后解决

6、 显示偏移、图像位置偏差

timing 中的参数设置有误,优先确认。

7、 白屏屏在进出睡眠或者显示过程中白屏 ,唤醒屏幕闪白光

背光早亮了,很有可能是下序列mdelay太久,改小点就沒有这个问题了。根本原因屏幕初始化序列下慢了。 sleep out(0x11)和 display on(0x29)之间需要 mdelay(120ms)左右。

8、花屏

说明 lcd 初始化成功,但是没有 rgb 刷过来。 timing 中的参数设置有误。优先确认 pclk。 花屏还可能是总线速度有问题。 开机就花屏最简单的解决方式是,在 Init 结束的地方加一个刷黑屏的功能。也可以在睡眠函数里加延时函数。

9、屏幕抖动

测时序,延时不足

10、屏幕闪动

通过调节电压来稳定,一般调节的电压为VRL、VRH、VDV和VCM

11、 唤醒闪屏问题

这是由于每次重新RST下序列过程delay久了导致,适当減少delay时间

12、屏幕唤醒显示灰色底面

寄存器没有使能外部升压电路

13、水波纹

通常都是rgb interface polarity导致,需要调整pclk hsync vsync de极性使之符合平台极性

14、图像颜色不正常

可能时钟型号极性反了 、VCOM 调节不正常 、进行 GAMMA 校正

相关推荐
_extraordinary_1 小时前
MySQL 事务(二)
android·数据库·mysql
鸿蒙布道师5 小时前
鸿蒙NEXT开发动画案例5
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
橙子1991101610 小时前
在 Kotlin 中什么是委托属性,简要说说其使用场景和原理
android·开发语言·kotlin
androidwork10 小时前
Kotlin Android LeakCanary内存泄漏检测实战
android·开发语言·kotlin
笨鸭先游11 小时前
Android Studio的jks文件
android·ide·android studio
gys989511 小时前
android studio开发aar插件,并用uniapp开发APP使用这个aar
android·uni-app·android studio
H3091912 小时前
vue3+dhtmlx-gantt实现甘特图展示
android·javascript·甘特图
像风一样自由12 小时前
【001】renPy android端启动流程分析
android·gitee
千里马学框架13 小时前
重学安卓14/15自由窗口freeform企业实战bug-学员作业
android·framework·bug·systrace·安卓framework开发·安卓窗口系统·自由窗口
xianrenli3819 小时前
android特许权限调试
android