总目录:高通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--*/