高通821平台LCD调试(6):Kernel部分流程(一)

 

总目录:高通821平台LCD调试

一、Panel指定

buildscript/set_build_config.sh

(1)编译选项

在其中由VENDOR_PROJECT来指定编译的相关文件

# change project name
echo "Replacing project name in vendor/picovr/common.mk"
sed -i "s/PICO_INTERNAL_PRODUCT_NAME := .*$/PICO_INTERNAL_PRODUCT_NAME := ${VENDOR_PROJECT}/" vendor/picovr/common.mk

# replace rom version
echo "Replacing rom version string ..."
sed -i "s/PICO_BUILD_NUMBER := .*$/PICO_BUILD_NUMBER := ${PUI_VERSION}/" vendor/picovr/projects/${VENDOR_PROJECT}_config.mk
sed -i "s/PICO_BUILD_INTERNAL_VERSION := .*$/PICO_BUILD_INTERNAL_VERSION := ${ROM_VERSION}/" vendor/picovr/projects/${VENDOR_PROJE    CT}_config.mk

VENDOR_PROJECT_config = finch_config.mk

在其中将PICO_DISPLAY_CONFIG定义为CONFIG_TIANMA_2K

export PICOVR_DISPLAY_CONFIG := CONFIG_TIANMA_2K

(2)全局变量

video/msm/mdss/Makefile

/arch/arm64/boot/dts/qcom/Makefile +19 line 中都有此定义

ifeq ($(PICOVR_DISPLAY_CONFIG),CONFIG_TIANMA_2K)
ccflags-y += -DDISPLAY_TIANMA_2K_VIDEO_PANEL=1

二、驱动Probe流程

2.1 MDP驱动Probe

mdss_mdp_probe() 对使用的硬件资源进行初始化,fb中注册MDP的使用接口

2.2 DSI  probe  

内核中开发修改的接口主要是从DSI probe引入的

4048 static struct platform_driver mdss_dsi_ctrl_driver = {
4049         .probe = mdss_dsi_ctrl_probe,
4050         .remove = mdss_dsi_ctrl_remove,
4051         .shutdown = NULL,
4052         .driver = {
4053                 .name = "mdss_dsi_ctrl",
4054                 .of_match_table = mdss_dsi_ctrl_dt_match,
4055         },
4056 };
3464 static const struct of_device_id mdss_dsi_ctrl_dt_match[] = {
3465         {.compatible = "qcom,mdss-dsi-ctrl"},
3466         {}
3467 };

与之相对应的设备树描述如下:

403                 mdss_dsi0: qcom,mdss_dsi_ctrl0@994000 {
404                         compatible = "qcom,mdss-dsi-ctrl";
405                         label = "MDSS DSI CTRL->0";
406                         cell-index = <0>;
407                         reg =   <0x994000 0x400>,
408                                 <0x994400 0x588>,
409                                 <0x828000 0x108>;
410                         reg-names = "dsi_ctrl", "dsi_phy", "mmss_misc_phys";
411
412                         qcom,timing-db-mode;
413                         oled-vdda-supply = <&pm8994_l19>;
414                         vddio-supply = <&pm8994_l14>;
415                         lab-supply = <&lab_regulator>;
416                         ibb-supply = <&ibb_regulator>;
417                         qcom,mdss-mdp = <&mdss_mdp>;
418
419                         clocks = <&clock_mmss clk_mdss_byte0_clk>,
420                                  <&clock_mmss clk_mdss_pclk0_clk>,
421                                  <&clock_mmss clk_mdss_esc0_clk>,
422                                  <&clock_mmss clk_byte0_clk_src>,
423                                  <&clock_mmss clk_pclk0_clk_src>,
424                                  <&mdss_dsi0_pll clk_dsi0pll_byte_clk_mux>,
425                                  <&mdss_dsi0_pll clk_dsi0pll_pixel_clk_mux>,
426                                  <&mdss_dsi0_pll clk_dsi0pll_byte_clk_src>,
427                                  <&mdss_dsi0_pll clk_dsi0pll_pixel_clk_src>,
428                                  <&mdss_dsi0_pll
429                                         clk_dsi0pll_shadow_byte_clk_src>,

mdss_dsi_ctrl_probe()解析模组厂提供的panel 的dtsi 文件,从那个文件中能获取到panel 的mode ,分辨率,刷新率,还有 Driver IC 的初始化 command; 这些command 对于 video mode 和 command mode 是不一样的,在command mode 的时候还需要知道TE 相关的信息。

如下所示DSI probe中包含了pinctrl的接口bl_settings(背光设置)的接口以及屏本身参数的接口初始化动作。

rc = mdss_dsi_pinctrl_init(pdev); //调试中发现,pinctrl没有正常初始化,实际上没起作用
rc = mdss_panel_parse_bl_settings(dsi_pan_node, ctrl_pdata);
rc = dsi_panel_device_register(pdev, dsi_pan_node, ctrl_pdata);
rc = mdss_dsi_shadow_clk_init(pdev, ctrl_pdata);
rc = mdss_dsi_set_clk_rates(ctrl_pdata);
rc = mdss_dsi_cont_splash_config(pinfo, ctrl_pdata);

2.3 Framebuffer  probe 

mdss_fb_probe从DSI 的数据结构中获取到panel 的相关信息,对MDP 做初始化。

三、背光设置

从上一部分的背光调试接口入手进行分析,可以看到mdss_dsi_ctrl_probe

3.1 背光相关的变量

mdss_dsi.h中添加相关变量

enum dsi_panel_bl_ctrl {
	BL_PWM,
	BL_WLED,
	BL_DCS_CMD,
	#if ((defined DISPLAY_TIANMA_2K_VIDEO_PANEL) || (defined DISPLAY_BOE_4K_DSC_CMD_PANEL) || (defined DISPLAY_TIANMA_2K90_DSC_VIDEO_PANEL))/*modified by PICO_driver webber.wang for bug 14410 - BOE 4K lcd debug*/
	BL_GPIOS, //GPIO方式控制背光
	#endif
	UNKNOWN_CTRL,
};

struct mdss_dsi_ctrl_pdata 中添加

	int bklt_en_gpio;
	#if ((defined DISPLAY_TIANMA_2K_VIDEO_PANEL) || (defined DISPLAY_BOE_4K_DSC_CMD_PANEL) || (defined DISPLAY_TIANMA_2K90_DSC_VIDEO_PANEL))/*modified by PICO_driver webber.wang for bug 14410 - BOE 4K lcd debug*/
	int bklt_brightness_gpio[3];
	#endif

3.2 变量的初始化

首先是背光使能引脚的初始化,bklt_en_gpio, 在mdss_dsi_parse_gpio_params中完成,mdss_dsi_parse_gpio_params是由Probe函数的dsi_device_panel_register直接调用

	ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
		"qcom,platform-bklight-en-gpio", 0);
	if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio))
		pr_info("%s: bklt_en gpio not specified\n", __func__);

然后是三个背光调节GPIO的初始化,
mdss_panel_parse_bl_settings()中 依次从设备树获得三个GPIO的节点信息句柄

else if(!strcmp(data, "bl_ctrl_gpio")){
			pr_info("%s: Configured GPIOS bklt ctrl\n",__func__);

			ctrl_pdata->bklt_ctrl = BL_GPIOS;

			ctrl_pdata->bklt_brightness_gpio[0] = of_get_named_gpio(np,
					"qcom,mdss-dsi-bklight-gpio1", 0);
			if (gpio_is_valid(ctrl_pdata->bklt_brightness_gpio[0])){
				pr_info("%s: qcom,mdss-dsi-bklight-gpio1 specified\n", __func__);

			rc = gpio_request(ctrl_pdata->bklt_brightness_gpio[0],"bklight-gpio1");
			if (rc)
				pr_err("request mdss-dsi-bklight-gpio1 failed, rc=%d\n",rc);
			}

			ctrl_pdata->bklt_brightness_gpio[1] = of_get_named_gpio(np,
					"qcom,mdss-dsi-bklight-gpio2", 0);
			if (gpio_is_valid(ctrl_pdata->bklt_brightness_gpio[1])){
				pr_info("%s: qcom,mdss-dsi-bklight-gpio2  specified\n", __func__);

			rc = gpio_request(ctrl_pdata->bklt_brightness_gpio[1],"bklight-gpio2");
			if (rc)
				pr_err("request mdss-dsi-bklight-gpio2 failed, rc=%d\n",rc);
			}

			ctrl_pdata->bklt_brightness_gpio[2] = of_get_named_gpio(np,
					"qcom,mdss-dsi-bklight-gpio3", 0);
			if (gpio_is_valid(ctrl_pdata->bklt_brightness_gpio[2])){
				pr_err("%s: qcom,mdss-dsi-bklight-gpio3  specified\n", __func__);

			rc = gpio_request(ctrl_pdata->bklt_brightness_gpio[2],"bklight-gpio3");
			if (rc)
				pr_err("request mdss-dsi-bklight-gpio3 failed, rc=%d\n",rc);
			}

		

3.3 背光设置的接口

./mdss_dsi_panel.c/mdss_dsi_panel_bl_ctrl.c

根据输入的等级来依次选择,并直接传递给上层的接口

ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl;
mdss_fb.c
static struct led_classdev backlight_led = {
	.name           = "lcd-backlight",
	.brightness     = MDSS_MAX_BL_BRIGHTNESS / 2,
	.brightness_set = mdss_fb_set_bl_brightness,
	.max_brightness = MDSS_MAX_BL_BRIGHTNESS,
};


源码如下

 640       static void mdss_dsi_panel_bl_ctrl(struct mdss_panel_data *pdata,
 641							u32 bl_level)
................
 707         case BL_GPIOS:    //调节背光时,或者关闭背光时进入此接口
 708                 pr_debug("%s: bl_level = %d\n", __func__,bl_level);
 710                 switch(bl_level) 
//bl_level 为传入的参数,共0-4 五级,0代表关闭背光,1-4分别为亮度等级
 711                 {
 712                         case 0:
 713                                 if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) {
 714                                         pr_debug("%s: set bklt gpio low\n",__func__);
 715                                         bklt_status = 0;  //关闭背光时清0,上电时会根据此变量脉冲上电
 716                                         ret= gpio_direction_output(ctrl_pdata->bklt_en_gpio, 0);//关闭背光使能
 717                                         if (ret) {
 718                                                 pr_err("%s: unable to set dir for bklt gpio\n",__func__);
 719                                         }
 720                                 }
 721                                 goto END;
 723                         case 1:
 724                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[0],0);
 725                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[1],0);
 726                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[2],0);
 727                                 break;
 729                         case 2:
 730                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[0],0);
 731                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[1],0);
 732                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[2],1);
 733                                 break;
 735                         case 3:
 736                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[0],0);
 737                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[1],1);
 738                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[2],1);
 739                                 break;
 741                         case 4:
 742                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[0],1);
 743                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[1],1);
 744                                 gpio_direction_output(ctrl_pdata->bklt_brightness_gpio[2],1);
 745                                 break;
 746                 }
 747                 /*added by PICO_driver jim.qiu for bug13856:debug tianma lcd,fix flicker of LCD when resume system  --start--*/
 748                 if(0 == bklt_status)
 749                 {
 750                         if (gpio_is_valid(ctrl_pdata->bklt_en_gpio)) {
 751                                 /*added by PICO_driver jim.qiu for bug15340: optimise bklt en gpio control when resume system  --s     tart--*/
 752                                 bklt_status = 1;
 753                                 pr_debug("%s line%d: set bklt gpio\n",__func__,__LINE__);
//以下为按照硬件给出的阶梯上电,给大电容充电
 754                                 mutex_lock(&ctrl_pdata->mutex);
 755                                 for(i=0;i<=80;i++)
 756                                 {
 757                                         ret = gpio_direction_output(
 758                                                 ctrl_pdata->bklt_en_gpio, 1);
 759                                         if (ret) {
 760                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 761                                                         __func__,__LINE__);
 762                                         }
 764                                         udelay(900+i*5);
 766                                         ret = gpio_direction_output(
 767                                                 ctrl_pdata->bklt_en_gpio, 0);
 768                                         if (ret) {
 769                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 770                                                         __func__,__LINE__);
 771                                         }
 773                                         udelay(1500);
 775                                 }
 776                                 for(i=81;i<=160;i++)
 777                                 {
 778                                         ret = gpio_direction_output(
 779                                                 ctrl_pdata->bklt_en_gpio, 1);
 780                                         if (ret) {
 781                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 782                                                         __func__,__LINE__);
 783                                         }
 785                                         udelay(1100+i*8);
 787                                         ret = gpio_direction_output(
 788                                                 ctrl_pdata->bklt_en_gpio, 0);
 789                                         if (ret) {
 790                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 791                                                         __func__,__LINE__);
 792                                         }
 794                                         udelay(1500);
 796                                 }
 797                                 for(i=161;i<=180;i++)
 798                                 {
 799                                         ret = gpio_direction_output(
 800                                                 ctrl_pdata->bklt_en_gpio, 1);
 801                                         if (ret) {
 802                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 803                                                         __func__,__LINE__);
 804                                         }
 806                                         udelay(800+i*12); 
 808                                         ret = gpio_direction_output(
 809                                                 ctrl_pdata->bklt_en_gpio, 0);
 810                                         if (ret) {
 811                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 812                                                         __func__,__LINE__);
 813                                         }
 815                                         udelay(1500);
 817                                 }
 818                                 for(i=181;i<=185;i++)
 819                                 {
 820                                         ret = gpio_direction_output(
 821                                                 ctrl_pdata->bklt_en_gpio, 1);
 822                                         if (ret) {
 823                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 824                                                         __func__,__LINE__);
 825                                         }
 827                                         udelay(2000+i*10);
 829                                         ret = gpio_direction_output(
 830                                                 ctrl_pdata->bklt_en_gpio, 0);
 831                                         if (ret) {
 832                                                 pr_err("%s line%d : unable to set dir for bklt gpio\n",
 833                                                         __func__,__LINE__);
 834                                         }
 835 
 836                                         udelay(1500);
 838                                 }
 840                                 /*added by PICO_driver jim.qiu for bug15340: optimise bklt en gpio control when resume system  --e     nd--*/
 841                                 pr_debug("%s: set bklt gpio high\n",__func__);
 842                                 ret= gpio_direction_output(ctrl_pdata->bklt_en_gpio, 1);
 843                                 if (ret) {
 844                                         pr_err("%s: unable to set dir for bklt gpio\n",__func__);
 845                                 }
 846                                 mutex_unlock(&ctrl_pdata->mutex);
 847                         }
 848                 }
 849                 //mdelay(30);
 851                 pr_debug("%s: vreg_name=%s\n", __func__,ctrl_pdata->panel_power_data.vreg_config[3].vreg_name);
 852                 if(0 == regulator_is_enabled(ctrl_pdata->panel_power_data.vreg_config[3].vreg))
 853                 {
 854                         pr_debug("%s: vreg_name=%s,222\n", __func__,ctrl_pdata->panel_power_data.vreg_config[3].vreg_name);
 855                         ret = regulator_enable(ctrl_pdata->panel_power_data.vreg_config[3].vreg);
 856                         if (ret)
 857                         {
 858                                 pr_err("%s: ret=%d\n",__func__, ret);
 859                         }
 860                 }
 861                 /*added by PICO_driver jim.qiu for bug13856:debug tianma lcd,fix flicker of LCD when resume system  --end--*/
 862                 break;
 863         #endif
 864         /*added by PICO_driver jim.qiu for bug10644:debug tianma lcd,modify backlight brightness  --end--*/


 

猜你喜欢

转载自blog.csdn.net/musicalspace/article/details/81028513