Bootstrap

RK3288 7.1 MIPI屏适配

功能需求与描述

适配威耀7寸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.向屏幕供应商索要对应屏幕的初始化指令(该指令用于下发到屏幕IC,部分屏幕IC集成了初始化指令则不需要),然后打开文件会看到对应的初始化代码,首先这份代码不能为瑞芯微平台所使用,要按照瑞芯微官方的MIPI屏适配手册来完成指令翻译,大致步骤如下:

2.1 打开初始化指令文件,如下图:

从上面图片可以简单看到屏幕的一些参数,分辨率(800×1280),使能电压(5.5v)以及差分时钟通道个数(4Lane)接着指令第一行是注册指令:REGISTER,FF,98,81,03,那么按照瑞芯微的指令下发规则,该指令对应的是:39 00 04 FF 98 81 03;

继续往下第二行:REGISTER,01,00,该指令对应的是:15 00 02 01 00;

.........................

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

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

该指令的翻译为:

39 00 04 FF 98 81 00

05 78 01 11

05 14 01 29

将它们添加到panel-init-sequence数组末尾,作为屏幕唤醒代码。

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

至此指令的翻译结束。

3.按照规格书来配置屏幕的各个参数,包括如下属性:

以下Timing供调试参考:

提示:

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表示差分时钟通道数,具体数值要根据实际情况修改,rk3288里面需要*1.25,因为配置会比实际输出会低一点。

配置代码如下所示:

4.在kernel/arch/arm/boot/dts/rk3288-evb.dts文件里打开&dsi0节点,关闭&lvds、&edp和其他显示屏幕的面板。代码如下:


&lvds {
- status = "okay";
+ status = "disabled";
};


&dsi0{
- status = "disabled";
+ status = "okay";
};

5.编译固件、烧录测试(屏幕无法点亮继续下一步,点亮了开始第8步)

6.从硬件开始着手检测问题。大致步骤如下:

6.1查看屏幕的电路设计,针对性的测量电路上的使能引脚和接地脚的电压,判断是否符合标准。电路如图所示:

供应商屏幕规格书线序

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

6.3我们这边能控制的GPIO只有reset-gpio,根据供应商提供的规格书可以发现,他的波形如下图所示:

7.我们reset-gpio的控制则在kernel/driver/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)如图所示:

最终更改的方式如图:

提示:reset脚作为屏幕初始化点亮的关键,必须得弄清楚,同时在重新拉高之后要注意添加延时操作,否则也可能导致屏幕起不来。

8.重新编译kernel并进行烧录,发现屏幕亮起,但是显示效果不佳,此时需要进行参数调节,大致问题和解决方案如下:

8.1常规屏幕显示问题

8.1.1在点亮屏后刚开始有开机logo闪烁,向右偏移了近半个屏幕的长度等问题。

解决方案:重新确认 clock-frequence ,通过上面的公式来计算。(不一定要理论数值,可以适当调整大小,理论数值只是作为标准来参考)

8.1.2 显示图像偏移较大

解决方案:稍微降低 hs_clk ,由 504 降低到 496 解决8.

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

解决方案:调整 VFP 后解决。

8.1.4 下面会有黑边

解决方案:稍微增大 VBP 后解决

8.1.5 开机Android最左边会被裁剪一部分

解决方案:增大 HBP 后解决

8.2其他一下杂散需要确认的内容

是否有framebuffer输出,要是改动了display这块的clk很有可能沒有buffer输出的,可以通过cat /dev/graphyics/fb0查看有沒有输出字符。

8.3 参数为8字节、16字节 传输会异常?错,可以正常传输

看到一篇文章中说,数据 cmds 为 8 字节 和 16 字节 的时候,写命令和数据的函数要注意变化。
然后在调试的时候发现 如果 参数为这两种情况的时候, 传输模式会自动由 LP 模式 变成 HS 模式。但这只是个意外。
跟踪代码后发现,其实是可以正常传输的,我这只是个意外而已:
[Android5.1][RK3288] LCD Mipi 初始化长包数据规范问题_android mipi发长包-CSDN博客

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

timing 中的参数设置有误。优先确认。
看着图像调节前扫、回扫进行左右上下移动

8.5 白屏

随机出现白屏有可能是静电问题,把LCD拿到头发上擦几下,如果很容易出现白屏那肯定就是静电问题了。另外一个在有Backend IC的情况下,也有可能bypass没处理好。
结束开机logo至android动画出现之间出现闪屏或者闪白光的情況。原因:在这个时间点kernel会对屏再次初始化,我们可以软件上屏蔽第一次初始动作从而解决。

8.6 屏在进出睡眠或者显示过程中白屏

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

8.7 花屏

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

8.8 屏幕闪烁

pclk 有问题
在最开始的时候,我的 pclk 漏了一个 0 ,为之前的 1/10 此时就有图像闪烁问题。
proch 有问题
在调试完后,我尝试将 proch 增加到极限,发现会出现图像闪烁的问题。

8.9 屏幕抖动

测时序,延时不足

8.10 屏幕闪动

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

8.11 唤醒闪屏问题

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

8.12 屏幕唤醒显示灰色底面

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

8.13 水波纹

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

8.14 调节对比度

VRL、VRH、VDV和VCM,这些电压也可以用来调节亮暗(对比度)
也可以通过调节Gamma值来实现,要调节的对象为 PRP、PRN、VRP、VRN 等

8.15 确认有没有 framebuffer 输出

要是改动了display这块的clk很有可能没有buffer输出的,可以通过cat /dev/graphyics/fb0 查看有没有输出字符
如果有说明是 mipi 还没有调通,如果没有说明是 fb 有问题

8.16 图像颜色不正常

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

9.个人开发总结和发现问题

(1) 在自己不能保证屏幕排线是否接好的情况下,切记寻找硬件工程师确认屏幕排线没有接错,否则容易造成烧坏屏幕的后果

(2)对于新屏幕,一开始尽可能不要下发到了其他屏幕的初始化指令,这样容易“污染”屏幕IC的指令区,导致即使下发对应屏幕的初始化指令也不能去除其它已刷入的屏幕初始化指令,最后会使得无论怎样调试都解决不了的屏幕显示问题。

(3)要尽可能确保固件已经配好了对应的屏幕,在烧写完毕之后,断电接好屏幕,重新上电查看屏幕显示效果

(4)遇到疑问及时与硬件工程师和屏幕供应商反馈情况,以获得最有效的帮助

(5)屏幕调试的过程中应尽量避免裸机板卡与屏幕或其它东西接触而受到干扰,从而烧坏屏幕或板卡,应采取不导电的东西垫在板卡底下和板卡与屏幕之间,使他们有一定的隔离

;