滴滴FAE

各种调屏经验分享:TFT,AMOLED,PMOLED,详情见麦瑞科技术mrklcd.com

NT35523在海思平台调试

0
阅读(2234)

//配置基本信息

//平台型号忘记了

//IC:NT35523

//Interface:mipi-4lane

//2power mode(NT50198B)

//不良现象:客户反馈屏点亮显异花屏,我到现场看,明显是GIP不对,摸IC还有点发烫,

//分析思路如下:先检查平台的代码与原厂给的是否一致,代码未发现问题;其次量常规电压如

//VGL,VGH,AVDD,AVEE,VCC,IOVCC发现VGL,VGH异常;那问题来了,代码没问题,送到驱动IC就异常了,

//要么屏有问题,要么平台发的代码掉链子了,试了几次屏都一个屌样,我觉得还是对屏要有信心,

//屏厂不可能这么坑,所以先要验证第二种情况,我好歹是有备而来,上逻辑分析仪,飞线抓主板下的代码,

//果然平台掉到坑里 了

//有图有真相,左边是应下的代码,右边是逻辑分析仪抓到的代码,对比过后就找到原因了

//最终平台改海思MIPI底层LP MODE的速率,编译一版烧进去,效果扛扛的,优化一下flicker收工回家。

//滴滴FAE提醒:逻辑分析出门必备神品,值得拥有。


image.png

#include "voscreen_nt35523.h"

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/ioctl.h>

#include <unistd.h>

#include <fcntl.h>

#include "videolib.h"

#include "vo_hisiv2.h"

#include "hicommon_hisiv2.h"

#include "vmgrbase.h"

#include "hi_mipi_tx.h"

#include "common.h"


combo_dev_cfg_t MIPI_TX_720X1280_60_CONFIG_NT35523 =

{

    .devno = 0,

    .lane_id = {0, 1, 2, 3},

    .output_mode = OUTPUT_MODE_DSI_VIDEO,

#if (_HW_VER==NSD_HW_PLATFORM_HI3516DV300)

    .video_mode =  BURST_MODE,

#else

    .video_mode =  BRUST_MODE,

#endif

    .output_format = OUT_FORMAT_RGB_24_BIT,

    .sync_info = {

        .vid_pkt_size     = 720, // hact

        .vid_hsa_pixels   = 4,  // hsa

        .vid_hbp_pixels   = 60,  // hbp

        .vid_hline_pixels = 844, // hact + hsa + hbp + hfp,此处必需这样累加,此平台需要注意

//倒推一下HFP=60

        .vid_vsa_lines    = 2,   // vsa

        .vid_vbp_lines    = 20,  // vbp

        .vid_vfp_lines    = 20,   // vfp

        .vid_active_lines = 1280,// vact

        .edpi_cmd_size    = 0,

    },

    .phy_data_rate = 459,//MIPI 速率

    .pixel_clk = 74250,//像素时钟,有点偏高,当时未测帧率,也懒得管他了,

};


struct LCD_setting_table_V2 

{

    unsigned char length;

    unsigned char para[20];

};


//初始化代码格式,海思跟其它平台差不多,只不过第一个参数是包长,第二个是cmd,依次是参数1,参数2

//代码转格式千万不要转错了,放点耐心,建议用Notepad++工具,我去过很多手机方案,都在用这个工具

//编辑代码

//4Lane to 3lane 四通道切换成3通道,现在很多IC都支持此功能,如果要改lansel的高低状态才能切,就有点

//坑了

//REGW 0xFF,0xAA,0x55,0xA5,0x80

//REGW 0x6F,0x0C

//REGW 0xF7,0x10


//

//BIST mode,说真的,我第一次点某个IC,我会习惯性的找它的BIST MODE指令,毕竟先保证data0接线以及

//确认供电是否正常,特别是远程调屏,这寄存器就非常好使,毕竟方案公司的驱动不一定会给你去量VGH,VGL  // bist mode on                   

//REGW 0xF0,0x55,0xAA,0x52,0x08,0x00       //page 0                 

//REGW 0xEE,0x87,0x78,0x02,0x40

//REGW 0xEF,0x00,0x07,0xFF,0xFF


static struct LCD_setting_table_V2 lcd_initialization_setting_720x1280_5p[] = {

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x01}},

    {2, {0xC0,0x64}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x00}},

    {2, {0xC8,0x80}},

    {3, {0xB1,0xE8,0x21}},

    {3, {0xB5,0x05,0x00}},

    {3, {0xBB,0x93,0x93}},

    {3, {0xBC,0x0F,0x00}},

    {5, {0xBD,0x11,0x30,0x10,0x10}},

    {5, {0xEE,0x87,0x78,0x02,0x40}},

    {5, {0xEF,0x00,0x22,0x1F,0x00}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x01}},

    {3, {0xD7,0x00,0xFF}},

    {3, {0xB7,0x00,0x6C}},

    {2, {0xCE,0x00}},

    {2, {0xCA,0x03}},

    {3, {0xB3,0x23,0x23}},

    {3, {0xB4,0x23,0x23}},

    {3, {0xC3,0x5A,0x5A}},

    {3, {0xC4,0x5A,0x5A}},

    {3, {0xC2,0x5A,0x5A}},

    {3, {0xB9,0x34,0x34}},

    {3, {0xBA,0x34,0x34}},

    {3, {0xBC,0x50,0x00}},

    {3, {0xBD,0x50,0x00}},

    {3, {0xBE,0x00,0x71}},

    {3, {0xBF,0x00,0x71}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x03}},

    {5, {0xB0,0x00,0x00,0x00,0x00}},

    {5, {0xB1,0x00,0x00,0x00,0x00}},

    {8, {0xB2,0x00,0x00,0x0A,0x06,0x00,0xF0,0x5B}},

    {8, {0xB3,0x00,0x00,0x09,0x06,0x00,0xF0,0x5B}},

    {11,{0xB6,0xF0,0x05,0x06,0x03,0x00,0x00,0x00,0x00,0x10,0x10}},

    {11,{0xB7,0xF0,0x05,0x07,0x03,0x00,0x00,0x00,0x00,0x10,0x10}},

    {8, {0xBC,0xC5,0x03,0x00,0x08,0x00,0xF0,0x5B}},

    {3, {0xC4,0x00,0x00}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x05}},

    {5, {0xB0,0x33,0x04,0x00,0x01}},

    {3, {0xB1,0x40,0x00}},

    {4, {0xB2,0x03,0x02,0x02}},

    {5, {0xB3,0x83,0x23,0x42,0x97}},

    {5, {0xB4,0xC5,0x35,0x77,0x53}},

    {8, {0xB5,0x4C,0xE5,0x31,0x33,0x33,0xA3,0x0A}},

    {7, {0xB6,0x00,0x00,0xD5,0x31,0x77,0x53}},

    {6, {0xB9,0x00,0x00,0x00,0x05,0x00}},

    {6, {0xC0,0x35,0x33,0x33,0x50,0x05}},

    {5, {0xC6,0x00,0x00,0x00,0x00}},

    {3, {0xCE,0xF0,0x1F}},

    {6, {0xD2,0x00,0x25,0x02,0x00,0x00}},

    {3, {0xE7,0xE8,0xFF}},

    {3, {0xE8,0xFF,0xFF}},

    {2, {0xE9,0x00}},

    {2, {0xEA,0xAA}},

    {2, {0xEB,0xAA}},

    {2, {0xEC,0xAA}},

    {2, {0xEE,0xAA}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x06}},

    {6, {0xB0,0x7D,0x4A,0x7D,0x7D,0x7D}},

    {6, {0xB1,0x7D,0x7D,0x42,0x5d,0x7D}},

    {6, {0xB2,0x7D,0x63,0x61,0x7D,0x7D}},

    {6, {0xB3,0x5f,0x72,0x7d,0x7D,0x7D}},

    {3, {0xB4,0x7D,0x7D}},

    {6, {0xB5,0x7D,0x48,0x7D,0x7D,0x7D}},

    {6, {0xB6,0x7D,0x7D,0x40,0x5c,0x7D}},

    {6, {0xB7,0x7D,0x62,0x60,0x7D,0x7D}},

    {6, {0xB8,0x5e,0x72,0x7d,0x7D,0x7D}},

    {3, {0xB9,0x7D,0x7D}},

    {6, {0xF0,0x55,0xAA,0x52,0x08,0x02}},

    {2, {0xB0,0x42}},

    {17,{0xD1,0x00,0x00,0x00,0x1B,0x00,0x3F,0x00,0x5B,0x00,0x71,0x00,0x97,0x00,0xB5,0x00,0xE6}},

    {17,{0xD2,0x01,0x0D,0x01,0x4A,0x01,0x7B,0x01,0xC7,0x02,0x03,0x02,0x05,0x02,0x3A,0x02,0x73}},

    {17,{0xD3,0x02,0x97,0x02,0xCB,0x02,0xEE,0x03,0x20,0x03,0x41,0x03,0x6D,0x03,0x8C,0x03,0xAB}},

    {5, {0xD4,0x03,0xBC,0x03,0xBE}},

    {5, {0xFF,0xAA,0x55,0xA5,0x80}},

    {2, {0xF3,0xC0}},

    {2, {0x35,0x00}},

};


CVoScreenNT35523::CVoScreenNT35523()

{


}


CVoScreenNT35523::~CVoScreenNT35523()

{


}


int CVoScreenNT35523::GetScreenParam(combo_dev_cfg_t *cfg)

{

    memcpy(cfg, &MIPI_TX_720X1280_60_CONFIG_NT35523, sizeof(combo_dev_cfg_t));

    return 0;

}


int CVoScreenNT35523::InitScreen(int fd)

{

    HI_S32              s32Ret;

    cmd_info_t          cmd_info = {0};


    for (int i=0;i<(int)(sizeof(lcd_initialization_setting_720x1280_5p) / sizeof(struct LCD_setting_table_V2));i++)

    {

        HI_U8 cmd[30] = {0};

        int cmd_size=lcd_initialization_setting_720x1280_5p[i].length;

        if (cmd_size > 2)

        {

            for (int j=0;j<cmd_size;j++)

            {

                cmd[j] = lcd_initialization_setting_720x1280_5p[i].para[j];

            }

            cmd_info.devno     = 0;

            cmd_info.cmd_size  = cmd_size;

            cmd_info.data_type = 0x29;

            cmd_info.cmd       = cmd;

        }

        else if (cmd_size == 2)

        {

            cmd_info.devno     = 0;

            cmd_info.cmd_size  = (unsigned short)(lcd_initialization_setting_720x1280_5p[i].para[0]<<8) | lcd_initialization_setting_720x1280_5p[i].para[1];

            cmd_info.data_type = 0x23;

            cmd_info.cmd       = NULL;

        }

#if 0 //debug

        printf("%d : ", i);

        if (cmd_info.cmd != NULL)

        {

            for (int x=0;x<cmd_size;x++)

            {

                printf("%02x ", cmd[x]);

            }

        }

        else

        {

            printf("%04x", cmd_info.cmd_size);

        }

        printf("\n");

#endif

        s32Ret = ioctl(fd, HI_MIPI_TX_SET_CMD, &cmd_info);

        if (HI_SUCCESS != s32Ret)

        {

            VIDEO_LOG(NSDLOG_ERROR,0,"MIPI_TX SET CMD failed\n");

            close(fd);

            return -1;

        }


        __h_sleep(1);

    }


    cmd_info.devno     = 0;

    cmd_info.cmd_size  = 0x11;

    cmd_info.data_type = 0x15;

    cmd_info.cmd       = NULL;

    s32Ret = ioctl(fd, HI_MIPI_TX_SET_CMD, &cmd_info);

    if (HI_SUCCESS != s32Ret)

    {

        VIDEO_LOG(NSDLOG_ERROR,0,"MIPI_TX SET CMD failed\n");

        close(fd);

        return -1;

    }

    //printf("set cmd = %x\n", cmd_info.cmd_size);

    __h_sleep(200);


    cmd_info.devno     = 0;

    cmd_info.cmd_size  = 0x29;

    cmd_info.data_type = 0x15;

    cmd_info.cmd       = NULL;

    s32Ret = ioctl(fd, HI_MIPI_TX_SET_CMD, &cmd_info);

    if (HI_SUCCESS != s32Ret)

    {

        VIDEO_LOG(NSDLOG_ERROR,0,"MIPI_TX SET CMD failed\n");

        close(fd);

        return -1;

    }

    //printf("set cmd = %x\n", cmd_info.cmd_size);

    __h_sleep(200);


    return 0;

}


int CVoScreenNT35523::InitVoPubAttr(int p_VoDev)

{

    VO_PUB_ATTR_S stVoPubAttr;

    stVoPubAttr.enIntfType = VO_INTF_MIPI;

    stVoPubAttr.enIntfSync = VO_OUTPUT_720x1280_60;//VO_OUTPUT_USER;//VO_OUTPUT_1080x1920_60;//


    stVoPubAttr.u32BgColor = 0x00000000;


    int nRet=HI_MPI_VO_SetPubAttr(p_VoDev, &stVoPubAttr);

    if(nRet!=0)

    {

        BADLOG("errcode=0x%#x",nRet);

        return NSDERR_FAIL;

    }


    return 0;

}