全志A133 android10 mipi屏幕调试
一,确认屏幕信息
屏幕调试首先要查看屏幕规格书,主要看里面的屏供电电压vdd,背光供电电压,timing参数
部分。
举个例子:
- 屏供电电压
可以看出供电电压为3.3V,过大则会烧屏; - 背光供电电压
屏幕背光电压为12V; - 屏timing参数
全志平台的timming跟其他平台有一些差异,具体公式如下:
lcd_dclk_freq的值,具体公式如下:
lcd_dclk_freq = lcd_ht * lcd_vt * fps(60)
对于一直点不亮的mipi屏,可以适当加大数值,不一定要按照公式算出的准确结果!
lcd_hbp = hbp+hspw;
lcd_ht = hbp+hspw+hfp+ht;
lcd_hspw = hspw;
lcd_vbp = vbp+vspw;
lcd_vt = vbp+vspw+vfp+vt;
lcd_vspw = vspw;
二,设备树配置
- 设备树配置,主要配置disp,lcd0这两个节点:
代码路径:longan/device/config/chips/a133/configs/b6/board.dts
disp: disp@06000000 {
disp_init_enable = <1>;
disp_mode = <0>;
screen0_output_type = <1>;
screen0_output_mode = <4>;
screen1_output_type = <1>;
screen1_output_mode = <4>;
screen1_output_format = <0>;
screen1_output_bits = <0>;
screen1_output_eotf = <4>;
screen1_output_cs = <257>;
screen1_output_dvi_hdmi = <2>;
screen1_output_range = <2>;
screen1_output_scan = <0>;
screen1_output_aspect_ratio = <8>;
dev0_output_type = <1>;
dev0_output_mode = <4>;
dev0_screen_id = <0>;
dev0_do_hpd = <0>;
dev1_output_type = <4>;
dev1_output_mode = <10>;
dev1_screen_id = <1>;
dev1_do_hpd = <1>;
def_output_dev = <0>;
hdmi_mode_check = <1>;
fb0_format = <0>;
fb0_width = <720>;
fb0_height = <1280>;
fb1_format = <0>;
fb1_width = <0>;
fb1_height = <0>;
chn_cfg_mode = <1>;
disp_para_zone = <1>;
/*VCC-LCD*/
dc1sw-supply = <®_cldo4>;
/*VCC-DSI*/
cldo1-supply = <®_cldo1>;
/*VCC-PD*/
dcdc1-supply = <®_cldo3>;
};
lcd0: lcd0@01c0c000 {
lcd_used = <1>;
lcd_driver_name = "K080_IM2HYL802R_800X1280"; //mipi驱动
lcd_backlight = <50>;
lcd_if = <4>;
lcd_x = <720>;
lcd_y = <1280>;
lcd_width = <150>;
lcd_height = <36>;
lcd_dclk_freq = <58>;
lcd_pwm_used = <1>;
lcd_pwm_ch = <0>;
lcd_pwm_freq = <50000>;
lcd_pwm_pol = <1>;
lcd_pwm_max_limit = <255>;
lcd_hbp = <30>;
lcd_ht = <770>;
lcd_hspw = <6>;
lcd_vbp = <16>;
lcd_vt = <1311>;
lcd_vspw = <4>;
lcd_frm = <0>;
lcd_gamma_en = <0>;
lcd_bright_curve_en = <0>;
lcd_cmap_en = <0>;
deu_mode = <0>;
lcdgamma4iep = <22>;
smart_color = <90>;
lcd_dsi_if = <0>;
lcd_dsi_lane = <4>;
lcd_dsi_format = <0>;
lcd_dsi_te = <0>;
lcd_dsi_eotp = <0>;
lcd_pin_power = "dcdc1";
lcd_power0 = "cldo1";//VCC-MIPI-LCD cldo1 1.8
lcd_power1 = "dc1sw";//VCC-LCD cldo4 3.3
lcd_gpio_1 = <&pio PD 22 1 0 3 1>;//LCD-RST
lcd_gpio_2 = <&pio PE 9 1 0 3 1>;//LCD0_PWREN_H PE9
lcd_gpio_3 = <&r_pio PL 9 1 0 3 1>;//LCD0_PWREN_H_1V8
pinctrl-0 = <&dsi4lane_pins_a>;
pinctrl-1 = <&dsi4lane_pins_b>;
lcd_bl_en = <&pio PH 18 1 1 0 3 1>;
lcd_bl_0_percent = <15>;
lcd_bl_100_percent = <100>;
};
- uboot驱动配置
上面lcd节点中“lcd_driver_name = "K080_IM2HYL802R_800X1280";”
有引用驱动,mipi驱动部分平台已经是已经添加,我们只需要按照要求配置。如果uboot中没有添加驱动,那么连背光都不亮。驱动代码如下:
代码路径:longan/brandy/brandy-2.0/u-boot-2018/drivers/video/sunxi/disp2/disp/lcd/K080_IM2HYL802R_800X1280.c
替换填入初始化代码(一般由屏厂提供,按照格式替换进全志的数组中)
/*add panel initialization below*/
static struct LCM_setting_table lcm_init_setting[] = {
{0xB9, 3, {0xFF,0x83,0x94} },
{0xBA, 6, {0x63,0x03,0x68,0x6B,0xB2,0xC0} },
{0xB1, 10, {0x50,0x12,0x72,0x09,0x33,0x54,0x71,0x31,0x70,0x2F} },
{0xB2, 6, {0x00,0x80,0x64,0x0E,0x0D,0x2F} },
{0xB4, 21, {0x6C,0x6D,0x6C,0x6D,0x6C,0x6D,0x01,0x01,0xFF,0x75,0x00,0x3F,0x6C,0x6D,0x6C,0x6D,0x6C,0x6D,0x01,0x01,0xFF} },
{0xB6, 2, {0x73,0x73} },
{0xD3, 33, {0x00,0x00,0x07,0x07,0x40,0x07,0x10,0x00,0x08,0x10,0x08,0x00,0x08,0x54,0x15,0x0E,0x05,0x0E,0x02,0x15,0x06,0x05,0x06,0x47,0x44,0x0A,0x0A,0x4B,0x10,0x07,0x07,0x0E,0x40} },
{0xD5, 44, {0x1A,0x1A,0x1B,0x1B,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x24,0x25,0x18,0x18,0x26,0x27,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x21,0x18,0x18,0x18,0x18} },
{0xD6, 44, {0x1A,0x1A,0x1B,0x1B,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x21,0x20,0x18,0x18,0x27,0x26,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x25,0x24,0x18,0x18,0x18,0x18} },
{0xE0, 58, {0x00,0x0C,0x19,0x20,0x23,0x26,0x29,0x28,0x51,0x61,0x70,0x6F,0x76,0x86,0x89,0x8D,0x99,0x9A,0x95,0xA1,0xB0,0x57,0x55,0x58,0x5C,0x5E,0x64,0x6B,0x7F,0x00,0x0C,0x18,0x20,0x23,0x26,0x29,0x28,0x51,0x61,0x70,0x6F,0x76,0x86,0x89,0x8D,0x99,0x9A,0x95,0xA1,0xB0,0x57,0x55,0x58,0x5C,0x5E,0x64,0x6B,0x7F} },
{0xC0, 2, {0x1F,0x31} },
{0xCC, 1, {0x0B} },
{0xD4, 1, {0x02} },
{0xBD, 1, {0x02} },
{0xD8, 12, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF} },
{0xBD, 1, {0x00} },
{0xBD, 1, {0x01} },
{0xB1, 1, {0x60} },
{0xBD, 1, {0x00} },
{0xBF, 7, {0x40,0x81,0x50,0x00,0x1A,0xFC,0x01} },
//SLP OUT
{0x11, 1, {0x00} }, // SLPOUT
{REGFLAG_DELAY, REGFLAG_DELAY, {120} },
//DISP ON
{0x29, 1, {0x00} }, // DSPON
{REGFLAG_DELAY, REGFLAG_DELAY, {5} },
{REGFLAG_END_OF_TABLE, REGFLAG_END_OF_TABLE, {} }
};
LCD_panel_init函数用于初始化 LCD 面板,通过 DSI(Display Serial Interface)发送初始化命令序列。
static void LCD_panel_init(u32 sel)
{
__u32 i;
sunxi_lcd_dsi_clk_enable(sel);
sunxi_lcd_delay_ms(20);
sunxi_lcd_dsi_dcs_write_0para(sel, DSI_DCS_SOFT_RESET);
sunxi_lcd_delay_ms(10);
print_dsi_cmd(lcm_init_setting); //打印mipi屏初始化参数
for (i = 0; ; i++) {
if (lcm_init_setting[i].count == REGFLAG_END_OF_TABLE)
break;
else if (lcm_init_setting[i].count == REGFLAG_DELAY)
sunxi_lcd_delay_ms(lcm_init_setting[i].para_list[0]);
#ifdef SUPPORT_DSI
else
dsi_dcs_wr(sel, lcm_init_setting[i].cmd, lcm_init_setting[i].para_list, lcm_init_setting[i].count);
#endif
//break;
}
return;
}
一般情况下,按照如上步骤适配,基本都可以正常点亮屏幕。