一、实现步骤
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 数据33、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 564.
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 校正