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 校正

相关推荐
石山岭15 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧17 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker1 天前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋1 天前
Android 现代架构不需要事件总线进阶篇
android
杉氧2 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏2 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧2 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄2 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭2 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景2 天前
Kotlin Flow操作符学习
android·kotlin