NT35523在海思平台调试
0赞//配置基本信息
//平台型号忘记了
//IC:NT35523
//Interface:mipi-4lane
//2power mode(NT50198B)
//不良现象:客户反馈屏点亮显异花屏,我到现场看,明显是GIP不对,摸IC还有点发烫,
//分析思路如下:先检查平台的代码与原厂给的是否一致,代码未发现问题;其次量常规电压如
//VGL,VGH,AVDD,AVEE,VCC,IOVCC发现VGL,VGH异常;那问题来了,代码没问题,送到驱动IC就异常了,
//要么屏有问题,要么平台发的代码掉链子了,试了几次屏都一个屌样,我觉得还是对屏要有信心,
//屏厂不可能这么坑,所以先要验证第二种情况,我好歹是有备而来,上逻辑分析仪,飞线抓主板下的代码,
//果然平台掉到坑里 了
//有图有真相,左边是应下的代码,右边是逻辑分析仪抓到的代码,对比过后就找到原因了
//最终平台改海思MIPI底层LP MODE的速率,编译一版烧进去,效果扛扛的,优化一下flicker收工回家。
//滴滴FAE提醒:逻辑分析出门必备神品,值得拥有。
#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;
}