RK3568系列14——屏幕参数公共配置

  不管是什么协议的屏幕,都有一个屏幕参数需要定义,系统根据这个参数来发送显示信号,但是一些具有双向通信能力(eDP/HDMI)的屏幕,系统可以读取屏幕固件中的信息,来自动填充这些参数,这里主要讲讲如何从屏幕厂商提供的Datasheet中找到这些参数。

屏幕协议

  • LVDS:只能被动接收CPU发来的显示信号并显示,因此必须配置屏幕参数
  • eDP:有一对辅助(AUX)通道用来传输信息,可以不用填写,但是RK推荐代码写死,因为屏幕有部分损坏的可能导致CPU读取不到屏参信息
  • MIPI:可以发送命令读取/写入屏幕寄存器,但是需要填写屏参信息
  • HDMI:即插即用,无需过多配置

时序配置

  一个屏幕需要配置的典型时序如下,注释部分是需要从屏幕Datasheet中找到的关键点,但是很多屏厂并不会标明这些参数,因此需要自己计算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <>; # 屏幕时钟频率

hactive = <>; # 宽有效区域
hfront-porch = <>; # 宽左空白区域
hback-porch = <>; # 宽右空白区域
hsync-len = <>; # 宽剩余区域

vactive = <>; # 高有效区域
vfront-porch = <>; # 高上空白区域
vback-porch = <>; # 高下空白区域
vsync-len = <>; # 高剩余区域

hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};
};

计算方法

1
2
3
4
5
6
7
h-total =  h-active + h-blanking
= h-active + (h-front + h-back + h-len)

v-total = v-active + v-blanking
= v-active + (v-front + v-back + v-len)

clock-frequency = h-total * v-total * fps
  • 其中h-front、h-back、h-len只要保证加起来等于h-blanking即可
  • 一般h-len取一个小于10的数,h-front、h-back对半分,h-front略大即可

配置实例1

  以图片为例,clock-frequency为78000000,hactive为1366,h-blanking为240(h-front、h-back、h-len各分为120、110、10)。高相关参数以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
timing0: timing0 {
clock-frequency = <78000000>;
hactive = <1266>;
hfront-porch = <120>;
hback-porch = <110>;
hsync-len = <10>;
vactive = <768>;
vfront-porch = <20>;
vback-porch = <10>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};

配置实例2

  图中这个屏幕厂商已把屏幕时序信息定义好,找到相关项配置好即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
timing0: timing0 {
clock-frequency = <72000000>;
hactive = <800>;
hfront-porch = <52>;
hback-porch = <48>;
hsync-len = <8>;
vactive = <1280>;
vfront-porch = <15>;
vback-porch = <16>;
vsync-len = <6>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
};

上电延迟配置

  除了屏幕时序,还有一个上电顺序需要配置,如果配置不当会出现屏幕闪一下白屏等异常现象,甚至可能会损坏屏幕。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
panel {
compatible = "simple-panel";
......
prepare-delay-ms = <>; # 上电到开始接收数据的时间
enable-delay-ms = <>; # 开始接收数据到开始显示画面的时间
disable-delay-ms = <>; # 关闭屏幕的时间
unprepare-delay-ms = <>; # 关闭电源的时间
reset-delay-ms = <>; # 屏幕重置的时间
init-delay-ms = <>; # 重置屏幕后初始化的时间
......
};

backlight {
......
post-pwm-on-delay-ms = <>; # 开启背光的延迟
pwm-off-delay-ms = <>; # 关闭背光的延迟
......
};

配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
panel {
compatible = "simple-panel";
......
prepare-delay-ms = <10>; # max(T1)
enable-delay-ms = <50>; # max(T2)
disable-delay-ms = <50>; # max(T3)
unprepare-delay-ms = <10>; # 未标明,随手写个
reset-delay-ms = <800>; # T4
init-delay-ms = <200>; # 未标明,随手写个
......
};

backlight {
......
post-pwm-on-delay-ms = <300>; # T5 + 100ms
pwm-off-delay-ms = <300>; # T6 + 100ms
......
};

背光配置

  RK平台Android系统中的背光控制默认调用的是名字为backlight的背光,因此有多块屏幕时需要把主屏或是需要经常修改背光亮度的屏幕配置backlight = <&backlight>;