MTK LCM调试总结

点亮新lcm
    1. 修改vendor\mediatek\proprietary\bootable\bootloader\lk\project\len6737m_35_m0.mk
            CUSTOM_LK_LCM="rm68200_hd720_dsi_vdo"(该为指定LCM)
 
    2. 修改kernel-3.18\arch\arm\configs\len6737m_35_m0_debug_defconfig、len6737m_35_m0_defconfig
            CONFIG_CUSTOM_KERNEL_LCM="rm68200_hd720_dsi_vdo"(该为指定LCM)
            CONFIG_LCM_HEIGHT="1280"
            CONFIG_LCM_WIDTH="720"
 
    3. 修改Y:\code2\mtk6737_pb5_1_0_cmcc\device\alibaba\b905_lezhou\ProjectConfig.mk
            CONFIG_LCM_HEIGHT="1280"
            CONFIG_LCM_WIDTH="720"
 
    4. 添加驱动代码,放到kernel-3.18\drivers\misc\mediatek\lcm目录
        创建文件夹rm68200_dsi_vdo_common文件夹中包含 rm68200_dsi_vdo_common.c、Makefile
        
    5. 添加驱动代码,放到vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\目录
        创建文件夹rm68200_dsi_vdo_common文件夹中包含 rm68200_dsi_vdo_common.c、Makefile
        
    6. 修改kernel-3.18\drivers\misc\mediatek\lcm\mt65xx_lcm_list.h
            +   extern LCM_DRIVER rm68200_hd720_dsi_vdo_lcm_drv;
            
        修改kernel-3.18\drivers\misc\mediatek\lcm\mt65xx_lcm_list.c
            
            +  #if defined(RM68200_HD720_DSI_VDO)
            +         &rm68200_hd720_dsi_vdo_lcm_drv,
            +  #endif
    
    7. 修改vendor\mediatek\proprietary\bootable\bootloader\lk\dev\lcm\mt65xx_lcm_list.c
            +  extern LCM_DRIVER rm68200_hd720_dsi_vdo_lcm_drv;
            
            +  #if defined(RM68200_HD720_DSI_VDO)
            +        &rm68200_hd720_dsi_vdo_lcm_drv,
            +  #endif
 
    8. 修改驱动代码...\lcm\rm68200_dsi_vdo_common\rm68200_dsi_vdo_common.c
        通常客户只给一个初始化代码,需要将其修改成数组格式 - 使用Emeditor,正则表达式
        8.1 客户给的格式:
            GP_COMMAD_PA(3);            //下面SPI_WriteData()三次
            SPI_WriteData(0xed);SPI_WriteData(0x60);SPI_WriteData(0x10);
        
        8.2 改成我们需要的格式(SPI_WriteData 先写地址再写数据,跟I2C一样):
            {0xed, 2,{0x60, 0x10}},
            
        8.3 ---->以下不改
            {0x11,1,{0x00}},        // sleep-out
            {REGFLAG_DELAY, 120, {}},  
            {0x29,1,{0x00}},        // display-on
            {REGFLAG_DELAY, 10, {}},  
            {REGFLAG_END_OF_TABLE, 0x00, {}}
            
        8.4 修改mipi通道数
            params->dsi.LANE_NUM = LCM_THREE_LANE; // LCM_FOUR_LANE; -- 根据实际模组打样来配置(询问FAE得知)
            -- 通常fwvga为2 hd为3/4,fhd为4(分辨率高的mipi通道数多)
            -- 同为hd,3路mipi要比4路mipi的时钟高一些
            
        8.5 屏的参数
            以下为常修改值--FAE提供--可以由数据手册算出
            params->dsi.vertical_sync_active                = 3;
            params->dsi.vertical_backporch                    = 12;     //后沿 
            params->dsi.vertical_frontporch                    = 8;      //前沿
            params->dsi.vertical_active_line                = FRAME_HEIGHT; 
 
            params->dsi.horizontal_sync_active                = 2;  
            params->dsi.horizontal_backporch                = 28;     // 修改前后沿也能影响闪屏效果
            params->dsi.horizontal_frontporch                = 50; 
            params->dsi.horizontal_active_pixel                = FRAME_WIDTH;
        
        8.6    兼容
            -- 系统通过读ID进行兼容,如果只配了一个屏则不读ID
            -- 点亮新屏的时候,可以先不兼容,或先把读ID函数写死return 1
            #define LCM_ID 0x6820
            lcm_compare_id(void){
                ...
                return (LCM_ID == id)?1:0;        // 点新屏时可写死 return 1;
            }
 
 
一、常用调试方法:
    1. 查看机器中lcm型号:
        adb shell
        cat /proc/cmdline        // androidN 没有
        // 自行添加
        alps/vendor/mediatek/proprietary/bootable/bootloader/lk/app/mt_boot/mt_boot.c
        -    //#define SERIAL_NUM_FROM_BARCODE
        +    #define SERIAL_NUM_FROM_BARCODE
 
            int boot_linux_from_storage(void)
        +        snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "lcm=%1d-%s", DISP_IsLcmFound(), mt_disp_get_lcm_id());
        +        cmdline_append(cmdline_tmpbuf);
        +        snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "fps=%1d", mt_disp_get_lcd_time());
        +        cmdline_append(cmdline_tmpbuf);
        +        snprintf(cmdline_tmpbuf, CMDLINE_TMP_CONCAT_SIZE, "vram=%1d", DISP_GetVRamSize());
        +        cmdline_append(cmdline_tmpbuf);
        
    2. 查看系统分辨率    
        cat /system/build.prop | grep lcd_density // 得“240”
        
    3. 修改系统分辨率
        device\lentek\len6737t_35g_m0\system.prop
        ro.sf.lcd_density=240    // 240就是系统的分辨率--可以通过修改这个值(参考其他工程)
    
    4. 闪屏
        修改kernel-3.18\drivers\misc\mediatek\lcm\rm68200_dsi_vdo_common\rm68200_dsi_vdo_common.c
        params->dsi.PLL_CLOCK = 200;   //200~240;修改这个值
    
    
        
二、屏的分辨率
    fwvga        --  856*480
    hd/hd720    -- 1280*720
    fhd            -- 1920*1080
    驱动中
    #define FRAME_WIDTH      (720)
    #define FRAME_HEIGHT     (1280)
 
三、相同ic的lcm做兼容 - 不通模组厂的模组可以通过内置电阻不通,而使lcm的ID脚输出电压不同,把ID脚接到PMU上,lcm_compare_id()时通过PMU读取电压值,根据电压值做判断
        0         - 0v
        470k    - 0.2~0.3v
        150k    - 0.7~0.8v
        51k        - 1.2~1.3v
    
    1. 查看硬件原理图,可知lcm的ID脚“AUX_IN1_LCD_ID” 连接在pmu的“AUX_IN1”脚
    
    2. 修改驱动, 主要是lcm_compare_id():
    
    +    #define AUXADC_LCM_VOLTAGE_CHANNEL     1    // 根据原理图,lcm的ID脚接在pmu的“AUX_IN1”脚,所以是1
        /* 根据mtk-online 不只屏,accdet也会用到
        AUX_IN0 -- channel 0
        AUX_IN1 -- channel 1
        AUX_IN2 -- channel 12
        AUX_IN3 -- channel 13
        AUX_IN4 -- channel 14
        */
    +    extern int IMM_GetOneChannelValue(int dwChannel, int data[4], int* rawdata);
        static unsigned int lcm_compare_id(void)
        {
    +        int data[4] = {0,0,0,0};
    +        int rawdata = 0;
    +        int lcm_vol = 0;
    +        int res = 0;
 
            unsigned int id = 0;
            unsigned char buffer[3];
            unsigned int array[16];
            SET_RESET_PIN(1);  //NOTE:should reset LCM firstly
            MDELAY(6);
            SET_RESET_PIN(0);
            MDELAY(6);
            SET_RESET_PIN(1);
            MDELAY(50);
 
    +    #ifdef AUXADC_LCM_VOLTAGE_CHANNEL
    +        res = IMM_GetOneChannelValue(AUXADC_LCM_VOLTAGE_CHANNEL,data,&rawdata);        // 通过PMU读取电压值,根据电压值做判断
    +        if(res < 0)
    +        {
    +    #ifdef BUILD_LK
    +            printf("[adc_uboot]: get data error\n");
    +    #endif
    +            return 0;
    +        }
    +    #endif    
    +        lcm_vol = data[0]*1000+data[1]*10;
 
            array[0] = 0x00043902;// read id return two byte,version and id
            array[1] = 0xf36192df;
            dsi_set_cmdq(array, 2, 1);
            MDELAY(10);
            array[0] = 0x00023700;
            dsi_set_cmdq(array, 1, 1);
            read_reg_v2(0xDF, buffer, 2);
            id = buffer[0]<<8 | buffer[1]; //we only need ID
        #if defined (BUILD_LK)
            printf("jd9261_hsd_qhd_dsi_vdo, id = 0x%08x\n", id);
        #else
            printk("jd9261_hsd_qhd_dsi_vdo, id = 0x%08x\n", id);
        #endif
    -        return (id == 0x9261)?1:0;
    +        return ((id == 0x9261) && (lcm_vol < 1000)) ? 1 : 0; // lcm模组1 读出来是:880mv
    或者    return ((id == 0x9261) && (lcm_vol > 1000)) ? 1 : 0; // lcm模组2 读出来是:1170mv
        }
 
四、打开ESD - 打静电的时候出现花屏(按电源键休眠再唤醒才会恢复正常)
    1. 在lcm的驱动中的添加 -  【验证为无效】
        static void lcm_get_params(LCM_PARAMS * params)
        {
            ...
            params->dsi.esd_check_enable = 1;  
            params->dsi.customization_esd_check_enable     = 1;  
            params->dsi.lcm_esd_check_table[0].cmd         = 0x0a;  
            params->dsi.lcm_esd_check_table[0].count     = 1;  
            params->dsi.lcm_esd_check_table[0].paralist[0]     = 0x9c;
            
    2. 验证有效的方法
    
        
    
五、如何计算帧率(刷新频率)
    1. LCD 刷新率 控制在50fps-65fps,须通过fps工具(svn->com.edburnette.fps2d_4.apk) 
    
    2. 由公式计算,apk 会比 公式 低几个fps(如算出60fps,apk实测约58fps)
        公式: 
            mtk : PLL_CLOCK = (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * 24 * fps / lane / 2
            展讯: PLL_CLOCK = (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * 24 * fps / lane
            高通: PLL_CLOCK = (height + vsa + vbp + vfp) * (width + hsa + hbp + hfp) * 24 * fps
    
    3. 修改    params->dsi.PLL_CLOCK=200; // 246
 
    4. 帧率的高低会影响:只亮背光、GPS、闪屏、功耗、射频、wifi等
    
    5. PLL_CLOCK 过GMS要求60~65
        
六、如何调整上下颠倒
    1. 若支持反扫,修改驱动初始化数组【未验证】
        通用寄存器(加在11 29前面): 
            {0x36, 1, {0x03}},
            
            {0x37, 1, {0x09}}, // 正扫    
            {0x37, 1, {0x05}}, // 反扫
 
        9369:【k27】
            {0xC1,2,{0x00,0x12}}, // 0x12->0x0A rotation 180;(D4;D3)
 
    
    2. 若不支持,翻转系统:(开机logo的第一张会是倒的,需要把图片翻转)
        lk:
        vendor/mediatek/proprietary/bootable/bootloader/lk/project/magc6737m_65_n.mk
            MTK_LCM_PHYSICAL_ROTATION=180
            
        kernel:
        kernel-3.18/arch/arm64/configs/magc6737m_65_n_debug_defconfig
            CONFIG_MTK_LCM_PHYSICAL_ROTATION="180"
            
        system:
        device/magcomm/magc6737m_65_n/ProjectConfig.mk
            MTK_LCM_PHYSICAL_ROTATION=180
    
七、如何控制gpio口
    1. dtsi中 添加节点"mtkfb1":
        / {
            soc {
        +        mtkfb1: mtkfb1@5e200000 {
        +            compatible = "mediatek,mtkfb1";
        +            reg = <0x7F000000 0x1000000>;
        +        };
    
    2. dts中填充节点"mtkfb1":
        /* DISPSYS GPIO standardization */
        &pio {
            
            mtkfb_pins_lcm_1_8v_en_out0_gpio: lcm_1_8v_en_out0_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO61__FUNC_GPIO61>;
                    slew-rate = <1>;
                    output-low;
                };
            };
 
            mtkfb_pins_lcm_1_8v_en_out1_gpio: lcm_1_8v_en_out1_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO61__FUNC_GPIO61>;
                    slew-rate = <1>;
                    output-high;
                };
            };
 
            mtkfb_pins_lcm_2_5v_en_out0_gpio: lcm_2_5v_en_out0_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO64__FUNC_GPIO64>;
                    slew-rate = <1>;
                    output-low;
                };
            };
            
            mtkfb_pins_lcm_2_5v_en_out1_gpio: lcm_2_5v_en_out1_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO64__FUNC_GPIO64>;
                    slew-rate = <1>;
                    output-high;
                };
            };
            
            mtkfb_pins_lcm_3_3v_en_out0_gpio: lcm_3_3v_en_out0_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO63__FUNC_GPIO63>;
                    slew-rate = <1>;
                    output-low;
                };
            };
            
            mtkfb_pins_lcm_3_3v_en_out1_gpio: lcm_3_3v_en_out1_gpio {
                pins_cmd_dat {
                    pins = <PINMUX_GPIO63__FUNC_GPIO63>;
                    slew-rate = <1>;
                    output-high;
                };
            };
            
            mtkfb_pins_default: default {
            };
        };
 
        &mtkfb1 {
            pinctrl-names = "default", "lcm_1_8v_en_out0_gpio", "lcm_1_8v_en_out1_gpio", "lcm_2_5v_en_out0_gpio", "lcm_2_5v_en_out1_gpio", "lcm_3_3v_en_out0_gpio", "lcm_3_3v_en_out1_gpio";
            pinctrl-0 = <&mtkfb_pins_default>;
            pinctrl-1 = <&mtkfb_pins_lcm_1_8v_en_out0_gpio>;
            pinctrl-2 = <&mtkfb_pins_lcm_1_8v_en_out1_gpio>;
            pinctrl-3 = <&mtkfb_pins_lcm_2_5v_en_out0_gpio>;
            pinctrl-4 = <&mtkfb_pins_lcm_2_5v_en_out1_gpio>;
            pinctrl-5 = <&mtkfb_pins_lcm_3_3v_en_out0_gpio>;
            pinctrl-6 = <&mtkfb_pins_lcm_3_3v_en_out1_gpio>;
            status = "okay";
        };
        /* DISPSYS GPIO standardization end */
    
    3. dws配置pin脚:
                EintMode|Def.Mode    M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1
        GPIO61            0:GPIO61    1                          0            0                 OUT     0    1    0        GPIO_LCM_PWR2_EN
        GPIO63            0:GPIO63    1                          0            0                 OUT     0    1    0        GPIO_LCM_PWR_EN
        GPIO64            0:GPIO64    1                          0            0                 OUT     0    1    0        GPIO_LCM_BL_EN
    
    4. 驱动中: 在读ID 和初始化之前要上电操作
        static unsigned int lcm_compare_id(void)
            lcd_power_en(1);
            
        static void lcm_init(void)
            lcd_power_en(1);
        
        static void lcm_suspend(void)
            lcd_power_en(0);
        
        static void lcd_power_en(unsigned char enabled)
        {
            if (enabled)
            {
        #ifdef BUILD_LK
                mt_set_gpio_mode(GPIO_LCM_PWR2_EN, GPIO_MODE_00);    //ldo1.8V
                mt_set_gpio_dir(GPIO_LCM_PWR2_EN, GPIO_DIR_OUT);
                mt_set_gpio_out(GPIO_LCM_PWR2_EN, GPIO_OUT_ONE);  
                MDELAY(10);     
                mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);        //ldo2.5V
                mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
                mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ONE);
                MDELAY(10);
                mt_set_gpio_mode(GPIO_LCM_PWR_EN, GPIO_MODE_00);    //ldo3.3V
                mt_set_gpio_dir(GPIO_LCM_PWR_EN, GPIO_DIR_OUT);
                mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ONE);
        #else
                mt_lcm_ldo_set_gpio(1);        // kernel中通过DTS控制gpio
        #endif
            }
            else    // disable
            {
        #ifdef BUILD_LK
             mt_set_gpio_mode(GPIO_LCM_PWR2_EN, GPIO_MODE_00);    //ldo1.8V
             mt_set_gpio_dir(GPIO_LCM_PWR2_EN, GPIO_DIR_OUT);
             mt_set_gpio_out(GPIO_LCM_PWR2_EN, GPIO_OUT_ZERO);
             MDELAY(10);
             mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);    //ldo2.5V
             mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
             mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ZERO);
             MDELAY(10);
             mt_set_gpio_mode(GPIO_LCM_PWR_EN, GPIO_MODE_00);    //ldo3.3V
             mt_set_gpio_dir(GPIO_LCM_PWR_EN, GPIO_DIR_OUT);
             mt_set_gpio_out(GPIO_LCM_PWR_EN, GPIO_OUT_ZERO);
        #else
            mt_lcm_ldo_set_gpio(0);        // kernel中通过DTS控制gpio
        #endif
            }
        }
 
        #ifndef BUILD_LK 
        struct platform_device *lcm_ldo_dev;
        struct pinctrl *lcm_ldo_pinctrl;
        struct device_node        *lcm_ldo_node;
        struct pinctrl_state *pinctrl_lcm_1_8v_en_low;
        struct pinctrl_state *pinctrl_lcm_1_8v_en_high;
        struct pinctrl_state *pinctrl_lcm_2_5v_en_low;
        struct pinctrl_state *pinctrl_lcm_2_5v_en_high;
        struct pinctrl_state *pinctrl_lcm_3_3v_en_low;
        struct pinctrl_state *pinctrl_lcm_3_3v_en_high;
 
        void nlcm_ldo_get_gpio_pinctrl(void)
        {
            int ret = 0;
            
            lcm_ldo_node = of_find_compatible_node(NULL, NULL, "mediatek,mtkfb1");
            if (lcm_ldo_node == NULL) {
                pr_err("LCM_LDO- get LCM_LDO node failed\n");
            }
            
            lcm_ldo_dev = of_find_device_by_node(lcm_ldo_node);
            if(lcm_ldo_dev == NULL) 
                return ;
                
            lcm_ldo_pinctrl = devm_pinctrl_get(&lcm_ldo_dev->dev);
            if (IS_ERR(lcm_ldo_pinctrl)) {
                dev_err(&lcm_ldo_dev->dev, "Cannot find usb lcm_ldo_pinctrl!\n");
            }
            
            pr_debug("****%s:%d nlcm_ldo_get_gpio_pinctrl !!!!!\n", __func__, __LINE__);
            
            pinctrl_lcm_1_8v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out0_gpio");
            if (IS_ERR(pinctrl_lcm_1_8v_en_low)) {
                ret = PTR_ERR(pinctrl_lcm_1_8v_en_low);
                printk("Cannot find  lcm_1_8v_en_out0_gpio\n");
            }
            
            pinctrl_lcm_1_8v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out1_gpio");
            if (IS_ERR(pinctrl_lcm_1_8v_en_high)) {
                ret = PTR_ERR(pinctrl_lcm_1_8v_en_high);
                printk("Cannot find  lcm_1_8v_en_out1_gpio\n");
            }
            
            pinctrl_lcm_2_5v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_2_5v_en_out0_gpio");
            if (IS_ERR(pinctrl_lcm_2_5v_en_low)) {
                ret = PTR_ERR(pinctrl_lcm_2_5v_en_low);
                printk("Cannot find  lcm_2_5v_en_out0_gpio\n");
            }
            
            pinctrl_lcm_2_5v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_2_5v_en_out1_gpio");
            if (IS_ERR(pinctrl_lcm_2_5v_en_high)) {
                ret = PTR_ERR(pinctrl_lcm_2_5v_en_high);
                printk("Cannot find  lcm_2_5v_en_out1_gpio\n");
            }
            
            pinctrl_lcm_3_3v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_3_3v_en_out0_gpio");
            if (IS_ERR(pinctrl_lcm_3_3v_en_low)) {
                ret = PTR_ERR(pinctrl_lcm_3_3v_en_low);
                printk("Cannot find  lcm_3_3v_en_out0_gpio\n");
            }
            
            pinctrl_lcm_3_3v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_3_3v_en_out1_gpio");
            if (IS_ERR(pinctrl_lcm_3_3v_en_high)) {
                ret = PTR_ERR(pinctrl_lcm_3_3v_en_high);
                printk("Cannot find  lcm_3_3v_en_out1_gpio\n");
            }
            
            pr_debug("****%s:%d end Init Drive NLEDS KS!!!!!\n", __func__, __LINE__);
        }
 
        int mt_lcm_ldo_set_gpio( unsigned int  level)
        {
            nlcm_ldo_get_gpio_pinctrl();    // 从dts中获取gpio的控制pin脚
                
            if (level == 0)
            {
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_low);
                MDELAY(10);
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_2_5v_en_low);
                MDELAY(10);
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_3_3v_en_low);
            }
            else 
            {
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_high);
                MDELAY(10);        
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_2_5v_en_high);
                MDELAY(10);
                pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_3_3v_en_high);
            }
            return 0;    
        }    
        #endif
 
案例一    : 机器温升超标 - 修改lcm亮度为70%
    平台: androidM,MTK6580
    步骤: 1. 修改alps\kernel-3.18\drivers\misc\mediatek\leds\mt6580\leds.c
            mt_mt65xx_led_set()中
            
            level = level*70/100;            // 改为70%
            mt_mt65xx_led_set_cust(level)     // 在此之前  或 disp_aal_notify_backlight_changed(
 
    
案例二    : lcm上有升压IC,需要将enable脚拉高
    现象    : 
    平台    : androidN,MTK6737
    排查过程: 1. 根据原理图,找到enable脚接到GPIO129
    
              2. 配置GPIO129(DTS & DWS)
                2.1 dtsi中 添加节点"mtkfb1":
                    / {
                        soc {
                    +        mtkfb1: mtkfb1@0 {
                    +            compatible = "mediatek,mtkfb1";
                    +        };
    
                2.2 dts中填充节点"mtkfb1":
                    /* DISPSYS GPIO standardization */
                    &pio {
                        
                        mtkfb1_pins_lcm_1_8v_en_out0_gpio: lcm_1_8v_en_out0_gpio {
                            pins_cmd_dat {
                                pins = <PINMUX_GPIO129__FUNC_GPIO129>;
                                slew-rate = <1>;
                                output-low;
                            };
                        };
 
                        mtkfb1_pins_lcm_1_8v_en_out1_gpio: lcm_1_8v_en_out1_gpio {
                            pins_cmd_dat {
                                pins = <PINMUX_GPIO129__FUNC_GPIO129>;
                                slew-rate = <1>;
                                output-high;
                            };
                        };
 
                        mtkfb1_pins_default: default {
                        };
                    };
 
                    &mtkfb1 {
                        pinctrl-names = "default", "lcm_1_8v_en_out0_gpio", "lcm_1_8v_en_out1_gpio";
                        pinctrl-0 = <&mtkfb1_pins_default>;
                        pinctrl-1 = <&mtkfb1_pins_lcm_1_8v_en_out0_gpio>;
                        pinctrl-2 = <&mtkfb1_pins_lcm_1_8v_en_out1_gpio>;
                        status = "okay";
                    };
                    /* DISPSYS GPIO standardization end */
                    
                2.3 dws配置pin脚:
                            EintMode|Def.Mode    M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1
                    GPIO129            0:GPIO129    1                          0            0                 OUT     0    1    0        GPIO_LCM_BL_EN
                  
              3. 驱动:
                static unsigned int lcm_compare_id(void)
                    lcd_power_en(1);
                    
                static void lcm_init(void)
                    lcd_power_en(1);
                
                static void lcm_suspend(void)
                    lcd_power_en(0);
                
                static void lcd_power_en(unsigned char enabled)
                {
                    if (enabled)
                    {
                #ifdef BUILD_LK
                        MDELAY(10);     
                        mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);    
                        mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
                        mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ONE);
                #else
                        mt_lcm_ldo_set_gpio(1);
                #endif
                    }
                    else
                    {
                #ifdef BUILD_LK
                     mt_set_gpio_mode(GPIO_LCM_BL_EN, GPIO_MODE_00);    
                     mt_set_gpio_dir(GPIO_LCM_BL_EN, GPIO_DIR_OUT);
                     mt_set_gpio_out(GPIO_LCM_BL_EN, GPIO_OUT_ZERO);
                #else
                    mt_lcm_ldo_set_gpio(0);
                #endif
                    }
                }
                
                #ifndef BUILD_LK //#ifdef CONFIG_OF
                struct platform_device *lcm_ldo_dev;
                struct pinctrl *lcm_ldo_pinctrl;
                struct device_node        *lcm_ldo_node;
                struct pinctrl_state *pinctrl_lcm_1_8v_en_low;
                struct pinctrl_state *pinctrl_lcm_1_8v_en_high;
 
                void nlcm_ldo_get_gpio_pinctrl(void)
                {
                    int ret = 0;
                    
                    lcm_ldo_node = of_find_compatible_node(NULL, NULL, "mediatek,mtkfb1");
                    if (lcm_ldo_node == NULL) {
                        pr_err("LCM_LDO- get LCM_LDO node failed\n");
                    }
                    
                    lcm_ldo_dev = of_find_device_by_node(lcm_ldo_node);
                    if(lcm_ldo_dev == NULL) 
                        return ;
                        
                    lcm_ldo_pinctrl = devm_pinctrl_get(&lcm_ldo_dev->dev);
                    if (IS_ERR(lcm_ldo_pinctrl)) {
                        dev_err(&lcm_ldo_dev->dev, "Cannot find usb lcm_ldo_pinctrl!\n");
                    }
                    
                    pr_debug("****%s:%d nlcm_ldo_get_gpio_pinctrl !!!!!\n", __func__, __LINE__);
                    
                    pinctrl_lcm_1_8v_en_low = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out0_gpio");
                    if (IS_ERR(pinctrl_lcm_1_8v_en_low)) {
                        ret = PTR_ERR(pinctrl_lcm_1_8v_en_low);
                        printk("Cannot find  lcm_1_8v_en_out0_gpio\n");
                    }
                    
                    pinctrl_lcm_1_8v_en_high = pinctrl_lookup_state(lcm_ldo_pinctrl, "lcm_1_8v_en_out1_gpio");
                    if (IS_ERR(pinctrl_lcm_1_8v_en_high)) {
                        ret = PTR_ERR(pinctrl_lcm_1_8v_en_high);
                        printk("Cannot find  lcm_1_8v_en_out1_gpio\n");
                    }
                    pr_debug("****%s:%d end Init Drive NLEDS KS!!!!!\n", __func__, __LINE__);
                }
 
 
                int mt_lcm_ldo_set_gpio( unsigned int  level)
                {
                    nlcm_ldo_get_gpio_pinctrl();
                        
                    if (level == 0)
                    {
                        pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_low);
                    }
                    else 
                    {
                        pinctrl_select_state(lcm_ldo_pinctrl, pinctrl_lcm_1_8v_en_high);
                    }
                    return 0;    
                }    
                #endif
    处理方案: 
    总结    : 
            
案例三    : 开机lk过后,开机动画之前会闪屏 - 关闭esd check
    现象    : 连续闪6下后正常
    平台    : android,MTK6737
    排查过程: 1. 检查lcm驱动中是否有打开esd check函数 - 否
    
              2. 关闭读id - 去掉兼容的其他lcm - 还是闪
              
              3. 在初始化数组中关闭esd check - ok
                st7703_hd_dsi_vdo_common.c
                    lcm_initialization_setting[] = {
                    -    {0xBa,27,{0x32,0x81,0x05,0xF9,0x0e,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x25,0x00,0x91,0x0a,0x00,0x00,0x02,0x4F,0x11,0x00,0x00,0x37}},// 0x11
                    +    {0xBa,27,{0x32,0x81,0x05,0xF9,0x0e,0x0e,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x25,0x00,0x91,0x0a,0x00,0x00,0x02,0x4F,0x01,0x00,0x00,0x37}},// 0x01
 
              
    处理方案: 
    总结    : 
    
案例四    : 开机花屏 - 修改lcm时序
    现象    : 合入供应商提供的lcm初始化数组,背光亮了,但是花屏
    平台    : androidO,MTK6737
    排查过程: 1. fae来现场调试,无果,带了一块屏回去。回去之后多方尝试后提供一组时序
                    params->dsi.vertical_sync_active         = 8;
                    params->dsi.vertical_backporch           = 37;
                    params->dsi.vertical_frontporch          = 65;
                 
                    params->dsi.horizontal_sync_active       = 14;
                    params->dsi.horizontal_backporch        = 25;
                    params->dsi.horizontal_frontporch          = 45;
 
                    合入之后顺利点亮,但是还有花屏现象,等fae现场优化
              2. 
              
              3. 
              
    处理方案: 少数屏对时序要求很严格,这组数据并非从数据手册能算出,而是要根据搭配的玻璃,凭经验去尝试(fae说话,带验证)
    总结    : 
    
案例五    : 开机logo的第一张会是倒的,第二张开机logo和开机动画均正常显示
    现象    : 
    平台    : androidO,MTK6739
    排查过程: 1. vendor/mediatek/proprietary/bootable/bootloader/lk/project/k39tv1_bsp_1g.mk
                -    DEFINES += MTK_LCM_PHYSICAL_ROTATION_HW
                +    #DEFINES += MTK_LCM_PHYSICAL_ROTATION_HW
 
    
 
 
 
 
 
 
 
 
            
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unigui可以使用WebSocket进行客户端之间的实时互相发消息

Unigui可以使用WebSocket进行客户端之间的实时互相发消息。WebSocket是一种支持双向通信的网络协议&#xff0c;可以使客户端和服务器之间实时地进行数据交换。 实现步骤: 1. 在Unigui项目中添加WebSocket组件。 2. 在WebModule的OnCreate事件中开启WebSocket服务。 proced…

uniapp(uncloud) 使用生态开发接口详情4(wangeditor 富文本, 云对象, postman 网络请求)

wangeditor 官网: https://www.wangeditor.com/v4/pages/01-%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8/01-%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8.html 这里用vue2版本,用wangeditor 4 终端命令: npm i wangeditor --save 开始使用 在项目pages > sy_news > add.vue 页面中…

Docker部署Jumpserver堡垒机

Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的专业运维审计系统。 Jumpserver 使用 Python / Django 进行开发&#xff0c;遵循 Web 2.0 规范&#xff0c;配备了业界领先的 Web Terminal 解决方案&#xff0c;交互界面…

优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. .运算符

&#x1f974;博主&#xff1a;小猫娃来啦 &#x1f974;文章核心&#xff1a;优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符 文章目录 引言空值处理的挑战解决方案1&#xff1a;?? 运算符基本用法与 || 运算符的区别实际应用场景举例 解决方案2&#xff…

jenkins出错与恢复

如果你的jenkins出现了如下图所示问题&#xff08;比如不能下载插件&#xff0c;无法保存任务等&#xff09;&#xff0c;这个时候就需要重新安装了。 一、卸载干净jenknis 要彻底卸载 Jenkins&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1、停止 Jenkins 服务&…

CCC数字钥匙设计【NFC】--通过NFC进行车主配对Phase3

1、车主配对流程介绍 车主配对可以通过车内NFC进行&#xff0c;若支持UWB测距&#xff0c;也可以通过蓝牙/UWB进行。通过NFC进行车主配对总共有5个Phase。本文档主要对Phase3进行介绍。 1) Phase0&#xff1a;准备阶段&#xff1b; 2) Phase1&#xff1a;启动流程&#xff1…

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}

第六十二章 符号概览

文章目录 第六十二章 符号概览.. (Two Periods)..abcdef..abcdef(xxx)..#abcdef ... (Three Periods)abcdef... # (Pound Sign)#abcdef##abcdef##class(abc.def).ghi(xxx)##super() 第六十二章 符号概览 .. (Two Periods) 在每种情况下&#xff0c;两个句点一起构成从一个类成…

mssql调用外部接口

前言&#xff1a; 断更很久了。 是因为这段时间发现&#xff0c;AI出来之后&#xff0c;很多博客都没有记录的必要了&#xff0c;你问他他都能即时告诉你。 这篇博客产出的原因是&#xff0c;看到一份奇葩需求&#xff0c;说数据库改某行数据的状态字段&#xff0c;也要调用接…

从零实现FFmpeg6.0+ SDL2播放器

FFmpeg6.0开发环境搭建播放器代码框架分析解复用模块开发实现包队列和帧队列设计音视频解码线程实现SDL2音频声音输出SDL2视频画面渲染-YUV显示音视频同步-基于音频 地址: https://xxetb.xet.tech/s/3NWJGf

CronJob运行自动化任务

CronJob运行自动化任务 创建 创建一个cronjob,每一分钟输出日期和指定信息 cronjob.yml apiVersion: batch/v1 kind: CronJob metadata:name: hello spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busybox:1.28im…

【STM32】--基础了解

一、STM32来历背景 1.从51到STM32 &#xff08;1&#xff09;单片机有很多种 &#xff08;2&#xff09;STM32内核使用ARM&#xff0c;但是ARM不一定是STM32 &#xff08;3&#xff09;ATM32是当前主流的32位高性能单片机 &#xff08;4&#xff09;STM32的特点&#xff1a;高…

docker入门加实战—部署Java和前端项目

docker入门加实战—部署Java和前端项目 部署之前&#xff0c;先删除nginx&#xff0c;和自己创建的dd两个容器&#xff1a; docker rm -f nginx dd部署Java项目 作为演示&#xff0c;我们的Java项目比较简单&#xff0c;提供了一个接口&#xff1a; 配置文件连接docker里的m…

03、爬取资料---但是失败,仅作为记录

1、找网址 进入直播间&#xff0c;里面的用户被设置不对外查看。 如图&#xff0c;找url 2、伪装 user-agent 用户代理 cookie 用户登录后保留的信息 登录信息&#xff1a;找cookie 浏览器信息&#xff1a;找user-agent user-agent 用户代理 cookie 用户登录后保留的信…

Prefix-Tuning源码解析

Prefix-Tuning源码解析 Prefix-Tuning在PEFT包中的源码实现 改写自Based on https://github.com/THUDM/P-tuning-v2/blob/main/model/prefix_encoder.py import torch from transformers import PretrainedConfigclass PrefixEncoder(torch.nn.Module):rThe torch.nn model t…

Linux-Jconsole连接远程服务器

Jconsole连接远程服务器 一、修改jmxremote.password.template文件二、启动jar项目三、jconsole远程连接1、打开的你jconsole2、远程连接 一、修改jmxremote.password.template文件 进去你的/idk/jre/lib/management目录下可以看到jmxremote.password.template文件 修改jmxr…

使用apose.pdf批量导出图片

今天遇到了&#xff0c;需要将pdf文件插到word里&#xff0c;好像word不支持直接插入pdf文件&#xff0c;所以现在通过将pdf转为图片的方式&#xff0c;逐个将图片插入到word。这里使用apose.pdf第三方库&#xff0c;将多个pdf文件读取&#xff0c;然后转为pdf。具体的实现代码…

sqoop 脚本密码管理

1&#xff1a;背景 生产上很多sqoop脚本的密码都是铭文&#xff0c;很不安全&#xff0c;找了一些帖子&#xff0c;自己尝试了下&#xff0c;记录下细节&#xff0c;使用的方式是将密码存在hdfs上然后在脚本里用别名来替代。 2&#xff1a;正文 第一步&#xff1a;创建密码对…

【网络空间实战攻防能力训练】DNS欺骗

DNS欺骗 0x01 环境准备0x02 实验过程1.设置Kali Linux主机、Windows Server 2016服务器与Windows 10在同一个可以上网的网段。分别记录各个主机的IP地址,并检查他们之间能否ping通。配置Windows Server 2016打开其IIS的Web服务。2.在Kali Linux的root终端中打开并编辑ettercap…

中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例

中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例 中文编程开发语言工具编程实际案例&#xff1a;美发店会员管理系统软件编程实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&a…