高通平台外设之 lcd and tp bring up

LCD调试说明

MIPI接口LCD的调试包括LK和kernel两个阶段的调试。下面以添加720p的DSI接口屏hx8394d为例阐述LCD的调试步骤。

1.调试前的准备

1.1 原理图信息

相关原理图如下:

在这里插入图片描述

需要通过原理图获取的信息:
1)2.8V VDD供电脚 —— LDO17;
2)1.8V VDD供电脚 —— LDO6;
3)RESET脚 —— GPIO61;
4)TE脚(一般DSI cmd模式下才会使用)—— GPIO24;
5)背光使能脚 —— GPIO137;
6)背光控制方式 —— PWM控制;
7)MIPI Lane通道 —— 4lane。

1.2 其他信息

调试前还需要屏厂提供如下信息:
1)寄存器初始化时序,如下示例是屏厂提供ili9881c的部分初始化时序:
在这里插入图片描述

2)一组对应的porch值,示例如下:
在这里插入图片描述

2. LK阶段的调试

2.1 添加定义LCD各种参数的头文件

在如下路径添加一份待调LCD的参数头文件(可以复制一份当前目录其他LCD的头文件进行更改):
bootable/bootloader/lk/dev/gcdb/display/include/panel_hx8394d_720p_video.h
LCD参数众多,根据不同类别分别定义在一系列的结构体变量中。相要了解LCD参数头文件中各结构体变量数据的具体含义,请查看其定义的地方:
bootable/bootloader/lk/dev/gcdb/display/include/panel.h

下面对其中比较重要的几项参数配置:分辨率、porch值、初始化时序、lane通道、DSI时钟,进行说明。

2.1.1 分辨率和porch值的 配置

分辨率和porch值在struct panel_resolution 结构体中配置,如图:
在这里插入图片描述

2.1.2 初始化时序的配置

寄存器初始化数据在struct mipi_dsi_cmd 结构体中配置,如图:
在这里插入图片描述

为增加灵活性,也可将定义初始化数组长度的宏值进行如下修改:
#define HX8394D_720P_VIDEO_ON_COMMAND ARRAY_SIZE(hx8394d_720p_video_on_command)
LCD初始化发送的cmd命令一般分为带data数据的长数据包,和不带data数据的短数据包。如下hx8394d_720p_video_on_cmd1表示带data的长数据包:
在这里插入图片描述

hx8394d_720p_video_on_cmd14表示不带data的短数据包:
在这里插入图片描述

2.1.3 lane通道的配置

lane通道在struct lane_configuration 中配置:
static struct lane_configuration hx8394d_720p_video_lane_config = {
4, // 使用的通道数,4表示使用的了4通道
0, // lane通道是否有对换连接,0表示没有对换
1, // lane0,1表示启用,0表示不启用
1, // lane1,1表示启用,0表示不启用
1, // lane2,1表示启用,0表示不启用
1 // lane3,1表示启用,0表示不启用
};

2.1.4 DSI 时钟配置

DSI时钟是通过一个12位数据长度的uint32_t类型数组配置的,如下:
const uint32_t hx8394d_720p_video_timings[] = {
0x88, 0x1e, 0x12, 0x00, 0x42, 0x46, 0x18, 0x20, 0x16, 0x03, 0x04, 0x00
};
这些数据是根据LCD分辨率、porch值、帧率、位深等数据,通过电子表格80-NH713-1_Y_DSI_Timing_Parameters_User_Interactive_Spreadsheet.xlsm计算出来的。
计算方法如下:
1)打开DSI and MDP Registers工作表,将面板分辨率、porch值、fps、位深、通道数输入如下所示的红圈区域并选择相应的平台(Chip)。
在这里插入图片描述

2)打开DSI PHY timing setting 工作表,按下CTRL+J 和CTRL+K,计算T_CLK_ZERO以获得VALID值(确保计算之后显示的是VALID值)。
然后将计算得到的DSI PHY registerrs值填入hx8394d_720p_video_timings数组中即可,注意这里计算只得到11位数据,最后一位补0.
在这里插入图片描述

另外,此计算同时会得到一组T_CLK_POST和T_CLK_PRE值:
在这里插入图片描述

将其填入struct panel_timing 结构体参数的后两位即可。
static struct panel_timing hx8394d_720p_video_timing_info = {
0, 4, 4, 27
};

2.2在公共面板代码中添加LCD面板信息

修改文件:
bootable/bootloader/lk/target/msm8953/oem_panel.c
修改内容如下:
1)将上一步添加的头文件include进来
#include “include/panel_hx8394d_720p_video.h”
2)在面板枚举变量中添加hx8394d相关枚举值,该值一般按照 __VIDEO/CMD_PANEL 的格式命名

	enum {
		HX8394D_480P_VIDEO_PANEL,
		... ...
		HX8394D_720P_VIDEO_PANEL,
		UNKNOWN_PANEL
	};

3)在支持的面板列表中,将hx8394d代号名添加进去并与上面添加的枚举名绑定

static struct panel_list supp_panels[] = {
		{"hx8394d_480p_video", HX8394D_480P_VIDEO_PANEL},
		... ...
		{"hx8394d_720p_video", HX8394D_720P_VIDEO_PANEL},
	};

4)在初始化面板函数init_panel_data()中添加对应的case,case的内容可参照其他面板case(格式都是一样的,只是将对应具体面板的参数变量赋值到面板结构体中)

	static int init_panel_data(struct panel_struct *panelstruct,
	struct msm_panel_info *pinfo,
	struct mdss_dsi_phy_ctrl *phy_db)
	{
	... ...
	switch (panel_id) {
	... ...
		case HX8394D_720P_VIDEO_PANEL:
		panelstruct->paneldata = &hx8394d_720p_video_panel_data;
		panelstruct->panelres = &hx8394d_720p_video_panel_res;
		panelstruct->color = &hx8394d_720p_video_color;
		panelstruct->videopanel = &hx8394d_720p_video_video_panel;
		panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
		panelstruct->state = &hx8394d_720p_video_state;
		panelstruct->laneconfig = &hx8394d_720p_video_lane_config;
		panelstruct->paneltiminginfo = &hx8394d_720p_video_timing_info;
		panelstruct->panelresetseq = &hx8394d_720p_video_panel_reset_seq;
		panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
		pinfo->mipi.panel_cmds = hx8394d_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds = HX8394D_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing, hx8394d_720p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
		break;
	... ...
	}

5)init_panel_data()函数是在oem_panel_select()函数中调用的,panel_id 也是在oem_panel_select()函数中赋值的,所以要检查保证oem_panel_select()函数中在相应条件下 panel_id 的值可被赋值为HX8394D_720P_VIDEO_PANEL(如果不用兼容其他屏,panel_id可直接赋值为HX8394D_720P_VIDEO_PANEL)。

2.3 配置VDD电源

根据原理图,VDD电源使用的是LDO17(2.8V)和LDO6(1.8V),LK阶段LCD的电源是在文件
bootable/bootloader/lk/target/msm8953/regulator.c
中配置的:
1)定义LDO电源结构体变量(默认已存在,若使用其他LDO供应,可参考已存在的LDO进行添加):

static uint32_t ldo6[][11]=
	{
		{
			LDOA_RES_TYPE, 6,
			KEY_SOFTWARE_ENABLE, 4, GENERIC_DISABLE,
			KEY_MICRO_VOLT, 4, 0,
			KEY_CURRENT, 4, 0,
		},
	
		{
			LDOA_RES_TYPE, 6,
			KEY_SOFTWARE_ENABLE, 4, GENERIC_ENABLE,
			KEY_MICRO_VOLT, 4, 1800000,
			KEY_CURRENT, 4, 150,
		},
	};
	
	
	static uint32_t ldo17[][11]=
	{
		{
			LDOA_RES_TYPE, 17,
			KEY_SOFTWARE_ENABLE, 4, GENERIC_DISABLE,
			KEY_MICRO_VOLT, 4, 0,
			KEY_CURRENT, 4, 0,
		},
	
		{
			LDOA_RES_TYPE, 17,
			KEY_SOFTWARE_ENABLE, 4, GENERIC_ENABLE,
			KEY_MICRO_VOLT, 4, 2850000,
			KEY_CURRENT, 4, 40,
		},
	};

2)使能LDO电源:

void regulator_enable(uint32_t enable)
{
	… …
	if (enable & REG_LDO17)
		rpm_send_data(&ldo17[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
	if (enable & REG_LDO6)
		rpm_send_data(&ldo6[GENERIC_ENABLE][0], 36, RPM_REQUEST_TYPE);
}

2.4 配置GPIO口

reset、背光使能脚等GPIO的配置在文件
bootable/bootloader/lk/target/msm8953/target_display.c
中,如下,根据原理图修改其中PIN ID即可:

static struct gpio_pin reset_gpio = {
  "msmgpio", 61,  // pin id,表示GPIO61
3,  // 驱动能力,3表示8mA
1,  // 方向,1表示输出,0表示输入
0,  // 上拉方式,0表示不上拉
1   // 状态标识,1表示使能该GPIO口
};

static struct gpio_pin bkl_gpio = {
  "msmgpio", 137, 3, 1, 1, 1
};

3. kernel阶段的调试

3.1 添加面板dtsi文件

在如下路径添加面板dtsi文件并对其元素属性进行配置(可复制一份已存在的dtsi文件进行更改)
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/dsi-panel-hx8394d-720p-video.dtsi
其中sc820-evk表示对应的工程版本,根据实际项目选择对应的目录。其中dtsi中各元素值的配置,请参考lk阶段头文件中的参数值,这里就不再一一赘述。

3.2导入添加的面板dtsi文件

将面板dtsi include进工程mdss dtsi文件中,并指定hx8394d节点。
1)修改文件
kernel/msm-3.18/arch64/arm/boot/dts/qcom/sc820-evk/msm8953-mdss-panels.dtsi
将dsi-panel-hx8394d-720p-video.dtsi include进来:
#include “dsi-panel-hx8394d-720p-video.dtsi”
2)修改文件
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/msm8953-sc820-evk.dtsi
指定所用的面板节点:
&mdss_dsi0 {
qcom,dsi-pref-prim-pan = <&dsi_hx8394d_720_vid>;
… …
};
其中 dsi_hx8394d_720_vid 是dsi-panel-hx8394d-720p-video.dtsi中定义的节点名:

3.3配置面板相关的GPIO口

以配置当前面板需要配置的reset脚和背光使能脚为例:
1)修改文件
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/msm8953-pinctrl.dtsi
根据原理图配置LCD使用的功能复位脚信息(下面这段代码正常情况改文件中已经存在,只需修改其中对应的GPIO引脚号即可)

pmx_mdss: pmx_mdss {
		mdss_dsi_active: mdss_dsi_active {
			mux {
				pins = "gpio61", "gpio138";
				function = "gpio";
			};

			config {
				pins = "gpio61", "gpio138";
				drive-strength = <8>; /* 8 mA   61-136 parrellel*/
				bias-disable = <0>; /* no pull */
				output-high;
			};
		};

		mdss_dsi_suspend: mdss_dsi_suspend {
			mux {
				pins = "gpio61",  "gpio138";
				function = "gpio";
			};

			config {
				pins = "gpio61",  "gpio138";
				drive-strength = <2>; /* 2 mA */
				bias-pull-down; /* pull down */
			};
		}; 
         … …
      	}

另,如果是DSI command模式,可能还需要配置TE信号脚:

pmx_mdss_te {
			mdss_te_active: mdss_te_active {
				mux {
					pins = "gpio24";
					function = "mdp_vsync";
				};
				config {
					pins = "gpio24";
					drive-strength = <2>; /* 8 mA */
					bias-pull-down; /* pull down*/
				};
			};

			mdss_te_suspend: mdss_te_suspend {
				mux {
					pins = "gpio24";
					function = "mdp_vsync";
				};
				config {
					pins = "gpio24";
					drive-strength = <2>; /* 2 mA */
					bias-pull-down; /* pull down */
				};
			};
		}; 

2)修改文件
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/msm8953-sc820-evk.dtsi
配置reset脚和背光使能脚
在这里插入图片描述

3.4配置面板所需的电源

1)修改文件:
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/msm8953-sc820-evk.dtsi
添加如下内容:
&dsi_hx8394d_720_vid {
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
qcom,mdss-dsi-pan-enable-dynamic-fps;
qcom,mdss-dsi-pan-fps-update = “dfps_immediate_clk_mode”;
};
其中 dsi_hx8394d_720_vid是dsi-panel-hx8394d-720p-video.dtsi中定义的节点名。
在这里插入图片描述

2)dsi_panel_pwr_supply 的定义在文件
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk-1/msm8953-mdss-panels.dtsi
中:

dsi_panel_pwr_supply: dsi_panel_pwr_supply {
	#address-cells = <1>;
	#size-cells = <0>;

	qcom,panel-supply-entry@0 {
		reg = <0>;
		qcom,supply-name = "vdd";
		qcom,supply-min-voltage = <2850000>;
		qcom,supply-max-voltage = <2850000>;
		qcom,supply-enable-load = <100000>;
		qcom,supply-disable-load = <100>;
	};

	qcom,panel-supply-entry@1 {
		reg = <1>;
		qcom,supply-name = "vddio";
		qcom,supply-min-voltage = <1800000>;
		qcom,supply-max-voltage = <1800000>;
		qcom,supply-enable-load = <100000>;
		qcom,supply-disable-load = <100>;
	};
     … …
}

可以看出,面板电源的具体供应电压在 qcom,panel-supply-entries 节点中配置。
3)vdd、vddio对应的ldo电源在文件
kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk-1/msm8953-mdss.dtsi
中定义,可根据实际硬件设计进行更改:
在这里插入图片描述

TP调试说明

  1. 根据原理图配置设备树
    在这里插入图片描述
    需要通过原理图获取的信息,中断脚:gpio13;
    复位reset脚:gpio12;
    设备挂载的i2c总线:i2c3;
    电源:ldo17
    I2c上拉源:ldo6

2.配置设备树
配置文件:kernel/msm-3.18/arch/arm64/boot/dts/qcom/sc820-evk/msm8953-sc820-evk.dtsi
问题点:TP横竖坐标错误,goodix,change-x2y;
如图:
在这里插入图片描述

3.添加驱动代码
添加路径 kernel/msm-3.18/drivers/input/fibocom/touchscreen/gt9xx
在 kernel/msm-3.18/drivers/input/fibocom/touchscreen/Makefile 中添加:
obj-$(CONFIG_FIBOCOM_TOUCHSCREEN_GT9XX) += gt9xx/
在 kernel/msm-3.18/drivers/input/fibocom/Kconfig 中添加:
config FIBOCOM_TOUCHSCREEN_GT9XX
bool “Goodix touchpanel GT9xx series”
depends on I2C

4.添加驱动配置
在对应的工程驱动配置文件
kernel/msm-3.18/arch/arm64/configs/msmcortex_defconfig
和kernel/msm-3.18/arch/arm64/configs/msmcortex-perf_defconfig
中添加:
CONFIG_FIBOCOM_TOUCHSCREEN_GT9XX=y

  1. 编译调试
    1)确认i2c是否挂载正常,如图:
    在这里插入图片描述

3-005d表示i2c3上已挂载地址为0x5d的i2c设备,根据上面的配置可知,此即为TP设备。
2)调试TP时间,如图:
在这里插入图片描述

可知TP对应/dev/input/event2。
使用getevent –l /dev/input/event2 调试,点击触摸屏,正常可得到如下点击事件和报点:
在这里插入图片描述

FAQ

调试过程遇到的常见问题

1、未点亮lcd调试

1、确认Lcd信息所在文件被编译进去,并且lcd 和board name里面注册一致,倘若这部正确,那么log里面应该有对应分辨率的一段framebuffer同时调到相对应的power_on函数。
在这里插入图片描述
2、检查pin管脚是否对应正确,检查屏幕原理图的pin管脚是否与我们开发板的对应正确。包括电压大小。
遇到客户使用相同的电压,但是不是我们的屏供电脚,时序对不上导致花屏。
3、仔细检查上电,mipi屏需要RST高低高操作,才能正常启动。一般sleep out(0x11)和display on(0x29)之间需要mdelay(120)左右,对于大部分panel是必须的。
4、最后还要确认是否有framebuffer输出,要是改动了display这块的clk很有可能没有buffer输出的,可以通过cat /dev/graphyics/fb0查看有没有输出字符。

2、点亮lcd后问题点调试

1、屏幕呈花屏状态,说明lcd初始化成功,但是没有rgb刷过来。认真检查之后发现pclk时序不对,用高通的timing生成器,重新生成数据,若还是遇到屏幕显示不太正常,此操作可重复多次。
2、porch值不对,导致屏幕显示异常(上下左右偏差,晃动)
3、reset时序问题,一般的屏幕reset时序没特别严格,如果遇到了算你倒霉。
4、唤醒屏幕闪白光问题,背光亮早了,屏幕初始化的delay时间改小点。初始化快速完成。一般可以解决,
5、lcd唤醒闪屏问题,这个是由于每次重新RST下序列过程delay久了导致,适当减少delay时间即可。
6、结束开机logo至android动画出现之间出现问题,需要去追屏的启动流程解决。例如,内存分配出问题,屏的再次初始化出问题等等。

3、LK中亮屏流程

1.gcdb_display_init(),
2.oem_panel_select(),添加屏参;
3.dsi_panel_init()把屏头文件中的配置信息拷贝到结构体中;
4.msm_display_init(),屏上电和初始化时钟,申请FB缓冲区,配置display,点亮屏幕,打开背光;
pdata->power_func(1, &(panel->panel_info));---->panel.power_func = mdss_dsi_panel_power;//上电使能
pdata->pll_clk_func(1, &(panel->panel_info));---->panel.pll_clk_func = mdss_dsi_panel_clock;//时钟使能
msm_fb_alloc(&(panel->fb));//申请FB缓冲区
msm_display_config();//LCD的基本配置
msm_display_on();//mipi通道配置,及一些寄存器配置;
ret = pdata->bl_func(1);//背光使能;初始化背光
**Kernel中屏幕流程函数**
fb_ioctl() //framebuff节点对应的函数操作,位置:fbdev/core/fbmem.c ,创建FB节点
do_fb_ioctl();
fb_blank(struct fb_info *info, int blank);//亮屏的起始函数;
mdss_fb_blank(int blank_mode, struct fb_info *info);
mdss_fb_blank_sub(int blank_mode, struct fb_info *info,int op_enable);//判断函数,判断亮灭屏
mdss_fb_blank_unblank(mfd);----->亮屏操作;
mdss_dsi_panel_power_ctrl(pdata, MDSS_PANEL_POWER_ON);//上电操作
mdss_dsi_panel_on(struct mdss_panel_data *pdata);---->发送on命令和屏幕相关参数命令	
mdss_fb_set_backlight(mfd, mfd->unset_bl_level);----->打开背光;

5.读取图片数据放到缓冲区中,调用函数fbcon_extract_to_screen()来把图片显示到屏幕上;原理:splash.img内容都会加载到内存中,然后把内存图片的数据拷贝到FB内存中
7、屏有时可以唤醒有时则唤不醒,通常RST有问题。
8、mipi video模式的lcd中遇见唤醒就只偶尔出现一帧,之后隐约看见刷的灰色界面但不能正常显示。最后发现是high speed模式没有设置正确,该屏只能使用burst模式,video还有其他2中模式;
9、lcd屏幕旋转等参数在dtsi文件中,qcom,mdss-dsi-panel-orientation = “180”;

3、需要使能MIPI clock高速传输模式
有些LCD需要打开MIPI clock高速模式才能点亮,打开方法如下:
1)配置lk层mipi clk高速模式:

--- a/bootable/bootloader/lk/platform/msm_shared/mdp4.c
+++ b/bootable/bootloader/lk/platform/msm_shared/mdp4.c
@@ -352,8 +352,11 @@ int mdp_dsi_video_config(struct msm_panel_info *pinfo,
 			 fb->width - 1) << 16 | lcdc->h_pulse_width +
 			lcdc->h_back_porch, MDP_DSI_VIDEO_ACTIVE_HCTL);
}-
-	if (pinfo->mipi.force_clk_lane_hs) {
+	pinfo->force_clk_lane_hs = 1;
+	if (pinfo->force_clk_lane_hs) {
	uint32_t tmp;
 
 	tmp = readl_relaxed(MIPI_DSI_BASE + 0xA8);

--- a/bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c
+++ b/bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c
@@ -678,7 +678,9 @@ int mdss_dsi_config(struct msm_fb_panel_data *panel)
 			goto error;
 		}
 	}    
+	mipi->force_clk_lane_hs = 1;
 	if (mipi->force_clk_lane_hs)
 		mdss_dsi_force_clk_lane_hs(mipi, mipi->dual_dsi);

2)配置kernel层mipi clk高速模式:
在对应LCD的dtsi配置文件中添加元素节点:
qcom,mdss-dsi-force-clock-lane-hs;
如图:
在这里插入图片描述

展锐内存分配问题解决方案
1、uboot部分
路径:bsp/bootloader/u-boot15/arch/arm/dts/sl8541e_.dts
720x1280 logo_reserved size = 72012804 = 0x384000
4代表4lane
logo_reserved: logobuffer@beef0000{
reg = <0x0 0x9e000000 0x0 0x384000>;
}
2、kernel部分
路径:bsp/kernel/kernel4.14/arch/arm/boot/dts/su806-v2-evk

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值