示意图
sys_config.fex
;----------------------------------------------------------------------------------
;disp init configuration
;
;disp_mode (0:screen0<screen0,fb0>)
;screenx_output_type (0:none; 1:lcd; 3:hdmi;)
;screenx_output_mode (used for hdmi output, 0:480i 1:576i 2:480p 3:576p 4:720p50)
; (5:720p60 6:1080i50 7:1080i60 8:1080p24 9:1080p50 10:1080p60)
;fbx format (4:RGB655 5:RGB565 6:RGB556 7:ARGB1555 8:RGBA5551 9:RGB888 10:ARGB8888 12:ARGB4444)
;fbx pixel sequence (0:ARGB 1:BGRA 2:ABGR 3:RGBA)
;fb0_scaler_mode_enable(scaler mode enable, used FE)
;fbx_width,fbx_height (framebuffer horizontal/vertical pixels, fix to output resolution while equal 0)
;lcdx_backlight (lcd init backlight,the range:[0,256],default:197
;lcdx_yy (lcd init screen bright/contrast/saturation/hue, value:0~100, default:50/50/57/50)
;lcd0_contrast (LCD contrast, 0~100)
;lcd0_saturation (LCD saturation, 0~100)
;lcd0_hue (LCD hue, 0~100)
;----------------------------------------------------------------------------------
[disp_init]
disp_init_enable = 1
disp_mode = 0
screen0_output_type = 1
screen0_output_mode = 4
screen1_output_type = 1
screen1_output_mode = 4
fb0_format = 10
fb0_pixel_sequence = 0
fb0_scaler_mode_enable = 0
fb0_width = 0
fb0_height = 0
fb1_format = 10
fb1_pixel_sequence = 0
fb1_scaler_mode_enable = 0
fb1_width = 0
fb1_height = 0
lcd0_backlight = 197
lcd1_backlight = 197
lcd0_bright = 50
lcd0_contrast = 50
lcd0_saturation = 57
lcd0_hue = 50
lcd1_bright = 50
lcd1_contrast = 50
lcd1_saturation = 57
lcd1_hue = 50
;----------------------------------------------------------------------------------
;lcd0 configuration
;lcd_if: 0:hv(sync+de); 1:8080; 2:ttl; 3:lvds; 4:dsi; 5:edp; 6:extend dsi
;lcd_x: lcd horizontal resolution
;lcd_y: lcd vertical resolution
;lcd_width: width of lcd in mm
;lcd_height: height of lcd in mm
;lcd_dclk_freq: in MHZ unit
;lcd_pwm_freq: in HZ unit
;lcd_pwm_pol: lcd backlight PWM polarity
;lcd_pwm_max_limit lcd backlight PWM max limit(<=255)
;lcd_hbp: hsync back porch
;lcd_ht: hsync total cycle
;lcd_vbp: vsync back porch
;lcd_vt: vysnc total cycle
;lcd_hspw: hsync plus width
;lcd_vspw: vysnc plus width
;lcd_lvds_if: 0:single link; 1:dual link
;lcd_lvds_colordepth: 0:8bit; 1:6bit
;lcd_lvds_mode: 0:NS mode; 1:JEIDA mode
;lcd_frm: 0:disable; 1:enable rgb666 dither; 2:enable rgb656 dither
;lcd_io_phase: 0:noraml; 1:intert phase(0~3bit: vsync phase; 4~7bit:hsync phase;
; 8~11bit:dclk phase; 12~15bit:de phase)
;lcd_gamma_en lcd gamma correction enable
;lcd_bright_curve_en lcd bright curve correction enable
;lcd_cmap_en lcd color map function enable
;deu_mode 0:smoll lcd screen; 1:large lcd screen(larger than 10inch)
;lcdgamma4iep: Smart Backlight parameter, lcd gamma vale * 10;
; decrease it while lcd is not bright enough; increase while lcd is too bright
;smart_color 90:normal lcd screen 65:retina lcd screen(9.7inch)
;----------------------------------------------------------------------------------
[lcd0_para]
lcd_used = 1
lcd_driver_name = "default_lcd"
lcd_if = 3
lcd_x = 800
lcd_y = 1280
lcd_width =
lcd_height =
lcd_dclk_freq = 60
lcd_pwm_used = 1
lcd_pwm_ch = 0
lcd_pwm_freq = 50000
lcd_pwm_pol = 0
lcd_hbp = 24
lcd_ht = 920
lcd_hspw = 24
lcd_vbp = 10
lcd_vt = 1304
lcd_vspw = 2
lcd_lvds_if = 0
lcd_lvds_colordepth = 0
lcd_lvds_mode = 0
lcd_frm = 1
lcd_io_phase = 0x0100
lcd_gamma_en = 0
lcd_bright_curve_en = 0
lcd_cmap_en = 0
deu_mode = 0
lcdgamma4iep = 22
smart_color = 90
lcd_bl_en = port:PL04<1><0><default><1>
lcd_power = "axp22_dc1sw"
lcdd0 = port:PD18<3><0><default><default>
lcdd1 = port:PD19<3><0><default><default>
lcdd2 = port:PD20<3><0><default><default>
lcdd3 = port:PD21<3><0><default><default>
lcdd4 = port:PD22<3><0><default><default>
lcdd5 = port:PD23<3><0><default><default>
lcdd6 = port:PD24<3><0><default><default>
lcdd7 = port:PD25<3><0><default><default>
lcdd8 = port:PD26<3><0><default><default>
lcdd9 = port:PD27<3><0><default><default>
;----------------------------------------------------------------------------------
;pwm config
;----------------------------------------------------------------------------------
[pwm0_para]
pwm_used = 1
pwm_positive = port:PH00<2><0><default><default>
[pwm1_para]
pwm_used = 0
pwm_positive = port:PH01<2><0><default><default>
屏幕参数
原理图
主控屏线
使能和PWM
电源 axp22_dc1sw
FAQ611
全志平台在board.dts(或sys_config.fex)文件的lcd0节点中,对LCD屏幕的timing时序参数进行了配置。
时序参数对于调屏非常关键,决定了发送端(SoC)发送数据时序。由于涉及到发送端和接收端的调试,除了分辨率和尺寸之外,其它几个数值都不是绝对不变的,两款一样分辨率,同种接口的屏,它们的数值也有可能不一样。
timing获取方式
最好的获取方式是通过询问LCD屏厂获得确切的时序参考值。其次或是从屏手册或者Driver IC手册中查找(向屏厂索要这些文档)。
至少需要从屏厂获得Width(屏宽),Height(屏高),HBP,HFP,HSW,VBP,VFP,VSW的数值。
全志board.dts中屏时序参数说明
lcd_x
含义:显示屏的水平像素数量,也就是屏分辨率中的宽。
数值:对应屏厂Width。
lcd_y
含义:显示屏的垂直行数,也就是屏分辨率中的高。
数值:对应屏厂Height。
lcd_hspw
含义:Horizontal Sync Pulse Width。指行同步信号的宽度。单位为1个dclk的时间(即是1个data cycle的时间)。
数值:对应屏厂HSW。
lcd_hbp
含义:Horizontal Back Porch。指有效行间,行同步信号(hsync)开始,到有效数据开始之间的 dclk 的 cycle 个数,包括同步信号区。
数值:是包含了hspw段,也就是lcd_hbp = 实际的hbp + 实际的hspw。对应屏厂HBP+HSW。
lcd_ht
含义:Horizontal Total time。指一行总的 dclk 的 cycle 个数。
数值:lcdht = lcdx + lcdhspw + lcdhbp + lcdhfp。对应屏厂Width+HSW+HBP+HFP。
由上面公式可知,我们不需要设置lcdhfp参数,因为驱动会自动根据其它几个已知参数中算出lcd_hfp。
lcd_vspw
含义:Vertical Sync Pulse Width。指场同步信号的宽度。单位为行。
数值:对应屏厂VSW。
lcd_vbp
含义:Vertical Back Porch。指场同步信号(vsync)开始,到有效数据行开始之间的行数,包括场同步信号区。
数值:是包含了vspw段,也就是lcd_vbp = 实际的vbp + 实际的vspw。对应屏厂VBP+VSW。
lcd_vt
含义:Vertical Total time。指一场的总行数。
数值:lcdvt = lcdy + lcdvspw + lcdvbp + lcdvfp。对应屏厂Height+VSW+VBP+VFP。
由上面公式可知,我们不需要设置lcdvfp参数,因为驱动会自动根据其它几个已知参数中算出lcd_vfp。
lcddclkfreq
含义:Dot Clock Frequency。传输像素传送频率。单位为MHz。
数值:lcddclkfreq = lcdht * lcdvt * fps,fps一般是60。注意lcddclkfreq数值取整数,单位是MHz。
如果是串行接口,发完一个像素需要2到3个周期的,那么,
lcddclkfreq * cycles = lcdht * lcdvt * fps 或者 lcddclkfreq = lcdht * cycles * lcdvt * fps。
实例演练
假如调试一款mipi屏,通过询问屏厂获得了屏的时序参数如下: Width-200,Height-400,HBP-120,HFP-130,HSW-60,VBP-20,VFP-40,VSW-40。
那么,对board.dts文件中的屏时序相关参数配置如下:
lcd_x = <200>;
lcd_y = <400>;
lcd_dclk_freq = <15>;
lcd_hbp = <180>;
lcd_ht = <510>;
lcd_hspw = <60>;
lcd_vbp = <60>;
lcd_vt = <500>;
lcd_vspw = <40>;
lcd_lvds_mode
lcd_lvds_mode: 0:NS mode; 1:JEIDA mode
lcd_lvds_mode 参数通常有两个或多个可选值,比如0代表NS mode,1代表JEIDA mode等。
- NS mode:这是一个特定的LVDS信号传输模式,可能是某种特定的自定义标准,或者是针对某个特定品牌或型号的显示器所设计的信号格式。
- JEIDA mode:则是遵循JEIDA(日本电子工业发展协会)制定的一种LVDS接口标准,它规定了数据线的数量、排列方式、时序和电平转换等细节,确保与遵循同样标准的LCD面板能够正确同步并接收图像数据。 简而言之,lcd_lvds_mode 参数就是用来告诉系统应该按照何种协议或标准来与连接的LVDS接口液晶显示器进行通信,确保视频信号的正确传输和显示。在实际应用中,应根据所使用的LCD屏的实际规格和数据手册来设置对应的模式,以确保屏幕能够正常显示图像。