1、配屏基本流程和原理
1.1 流程
Android产品开发,产品成熟后,各种原因,需要配各种屏。无论使用哪个厂商的芯片,屏驱动基本都已开发,除非特殊的屏。在驱动开发的情况下,只需要按照驱动需要的参数,构建屏参数文件,编译到固件升级即可。基本流程如下:
配屏说明文档和系统强相关,使用不同的系统方案,配屏文档不同,由系统解决方案方提供。
2.2 sync、DE屏
从软件上来说,DE 模式和 SYNC 模式是一样的,软件上不做区分。从表中我们可以得
到如下参数:
参数
Left_margin = HBP(Horizontal Back Porch)
Right_margin = HFP(Horizontal Front Porch)
Hsync = HPW(Horizontal Pulse Width )
Xres = HVD(Horizontal Valid)
Upper_margin = VBP(Vertical Back Porch)
low_margin = VFP(Vertical Front Porch)
Vsync = VPW(Vertical Pulse Width)
Yres = VVD(Vertical Valid)
参数满足关系
Left_margin + right_margin + hsync + xres = horizontal period
即:HBP+HFP+HPW+HVD=horizontal period
Upper_margin + low_margin + vsync + yres = vertical period
即:VBP+VFP+VPW+VVD=vertical period
刷新率 =DCLK/((xres+left_margin+right_margin+hsync)*(yres+upper_margin+low_margin+vsync))
即:刷新率=DCLK/(horizontal period*vertical period)
有些 DE 模式的屏幕,并没有直接告诉 HFP、HSYNC、HBP、VFP、VSYNC、
VBP 这些参数,而给的是 Horizontal blank time 和 Vertical blank time,这时我们
只要保证如下关系即可:
HFB + HSYNC + HBP = Horizontal blank time
VFP + VSYNC + VBP = vertical blank time
这里需要说明的一点是,Android 的最高刷新频率为 60fps,所以我们最好保证
LCDC 的刷新频率也为 60fps,根据文档第一部分介绍的 LCDC 的刷新频率计算公式可以
知道,LCDC 的刷新频率和 DCLK 成正比,和水平方向与垂直方向参数之和的乘积成反
比。根据屏幕的 datasheet 我们可以看出,对于一款屏幕 H_VD/V_VD 对应屏幕的分辨
率,值是固定的不能修改,BP、FP、PW 的值都有一个最大值和最小值的取值范围,所
以当我们的 DCLK 分配不到想要的频率的时候,可以适当的调整 BP、FP、PW,是的 LCDC
的刷新率尽可能的接近 60FPS。式
2.1 rk3288配屏
a. 配屏文档
配屏说明文档:RockChip_LCD开发文档v1.6.pdf
屏规格书,部分截图如下:
b. 在RK3288_6.0_0518\kernel\arch\arm\boot\dts目录下添加屏参数文件
不同的屏,配置的参数不同,此处以lvds为例:
/*
* rockChip. LCD-hsd121kxn1a103jf_lvds
*
*/
/ {
disp_timings: display-timings {
native-mode = <&timing0>;
timing0: timing0 {
screen-type = <SCREEN_LVDS>;
lvds-format = <LVDS_8BIT_1>;
out-face = <OUT_P888>;
color-mode = <COLOR_RGB>;
clock-frequency = <51200000>;
hactive = <1024>;
vactive = <768>;
hback-porch = <48>;
hfront-porch = <14>;
hsync-len = <16>;
hsync-active = <0>;
vback-porch = <3>;
vfront-porch = <5>;
vsync-len = <1>;
vsync-active = <0>;
screen-width = <245>;
screen-hight = <184>;
de-active = <0>;
pixelclk-active = <0>;
swap-rb = <0>;
swap-rg = <0>;
swap-gb = <0>;
};
};
};
文件名命名格式为:lcd-屏型号-屏类型或分辨率.dtsi,此例文件名为:lcd-hsd121kxn1a103jf-lvds.dtsi。
c. 在主设备树种添加对屏参数文件的应用
rk3288-huaxia.dts修改如下,此处新配屏未实际使用(12.1屏):
#include "rk3288.dtsi"
+// 12.1 size panel for robot
+// #include "lcd-hsd121kxn1a103jf-lvds.dtsi"
//#include "lcd-xinshixun-mipi.dtsi"
+// panel for face recognize product
#include "lcd-huaxia-purui.dtsi"
//#include "lcd-F402.dtsi"
//#include "lcd-shanghaidunlian.dtsi"
电压引脚使能修改,增加以下代码
lcd_en:lcd_en {
rockchip,power_type = <GPIO>;
gpios = <&gpio0 GPIO_B5 GPIO_ACTIVE_HIGH>;
ockchip,delay = <10>;
};
2.2 a40i配屏
a. 配屏文档
配屏说明文档:A40I sys_config.fex使用配置说明V1.0.pdf
特殊参数说明:
b. 修改配置文件
a40i\lichee\tools\pack\chips\sun8iw11p1\configs\a40-p1\sys_config.fex
部分内容如下
[lcd0]
lcd_used = 1
lcd_driver_name = "default_lcd"
lcd_backlight = 204
lcd_if = 0
;lcd_if = 3
;=======800X480===============
;lcd_x = 800
;lcd_y = 480
;lcd_width = 154
;lcd_height = 86
;lcd_dclk_freq = 33
;======1024X600===============
lcd_x = 1024
lcd_y = 600
lcd_width = 154
lcd_height = 85
lcd_dclk_freq = 51.2
;======1920X1080===============
3、解决的问题
3.1 rk3288配屏后显示不符合要求
旋转输出信号
a、硬件修改屏决定图像显示方向的引脚
b、软件做图像输出旋转
软件修改如下
diff --git a/kernel/arch/arm/configs/rockchip_defconfig b/kernel/arch/arm/configs/rockchip_defconfig
index 712f628..0d28ad6 100755
--- a/kernel/arch/arm/configs/rockchip_defconfig
+++ b/kernel/arch/arm/configs/rockchip_defconfig
@@ -2507,7 +2507,8 @@ CONFIG_FB_ROCKCHIP=y
# CONFIG_DUAL_LCDC_DUAL_DISP_IN_KERNEL is not set
# CONFIG_ONE_LCDC_DUAL_OUTPUT_INF is not set
CONFIG_NO_DUAL_DISP=y
-# CONFIG_FB_ROTATE is not set
+CONFIG_FB_ROTATE=y
+CONFIG_ROTATE_ORIENTATION=90
CONFIG_THREE_FB_BUFFER=y
CONFIG_LCDC_RK3188=y
CONFIG_LCDC_RK3288=y
3.2 配屏开机logo显示半屏
开机logo分辨率不正确
3.3 配屏出现显示屏固定地方花屏
初始配置参数不正确,导致屏烧坏,出现花屏
3.4 a40i配屏背光不可控
背光控制代码如下
if (disp_lcd_is_used(lcd)) {
__u64 backlight_bright;
__u64 period_ns, duty_ns;
if (lcdp->panel_info.lcd_pwm_used) {
lcdp->pwm_info.channel = lcdp->panel_info.lcd_pwm_ch;
lcdp->pwm_info.polarity = lcdp->panel_info.lcd_pwm_pol;
lcdp->pwm_info.dev = disp_sys_pwm_request(lcdp->panel_info.lcd_pwm_ch);
if (lcdp->panel_info.lcd_pwm_freq != 0) {
period_ns = 1000*1000*1000 / lcdp->panel_info.lcd_pwm_freq;
} else {
DE_WRN("lcd%d.lcd_pwm_freq is ZERO\n", lcd->disp);
period_ns = 1000*1000*1000 / 1000; //default 1khz
}
backlight_bright = lcdp->lcd_cfg.backlight_bright;
duty_ns = (backlight_bright * period_ns) / 256;
//DE_DBG("[PWM]backlight_bright=%d,period_ns=%d,duty_ns=%d\n",(u32)backlight_bright,(u32)period_ns, (u32)duty_ns);
disp_sys_pwm_set_polarity(lcdp->pwm_info.dev, lcdp->pwm_info.polarity);
lcdp->pwm_info.duty_ns = duty_ns;
lcdp->pwm_info.period_ns = period_ns;
}
duty_ns是占空比,当占空比变大,对屏背光的电压电流变大,因此背光的最大值不能超过屏可支持的最大占空比。
period_ns 是背光时钟周期。
lcd_pwm_freq:配置的背光频率。
从代码中计算公式看,频率过大,即使背光值设置为最大值250,占空比也很小,屏不亮。
注意: 屏的背光频率也不能过小,频率太小对屏的背光电压不稳定,导致屏显示闪烁。