This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

DS90UB947-Q1: The screen vertical line problem

Part Number: DS90UB947-Q1

hi  Team,

SAIC EP39 project DMH model use 947+948, now receive SAIC back-end information, the vehicle during the customer use of the vertical line of projection screen problem;

Details are as follows:
(1) The occurrence of malfunction phenomenon is sporadic and irregular;
(2) The duration of the failure varies, may be flashing for 1 second self-recovery, or lasting for 5-6 seconds self-recovery;
(3) No other special operations were carried out before and after the breakdown;
The problem only occurs in the meter display map interface (projection screen area);
Number: Up to now, 3 cases of malfunctions, sales of about 10,000 units;
See attached video for symptoms;

below is the 947 script.

void TI947_INIT(void)
 {       
                 if(DS90UB947_read_status ==0)
{
DS90UB947_Init_Delay_Cnt--;
                }
                
                    if(DS90UB947_Init_Delay_Cnt == 62)
                    {
                        if(DS90UB947_read_status==0)
                        {
                            ds_reg = 0x23;
                            wbuf[0] = 0x80;
                            ret_io = hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
                            ds_reg = 0x24;
                            wbuf[0] = 0x80;
                            ret_io = hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
                            DS90UB947_read_count = 0;
                            DS90UB947_read_status = 1;                              
                        }else
                        {
                            if(ti947_count< 3)
                            {
                                ti947_count++;
                            }else
                            {
                                ti947_count = 0;
                                ds_reg=0x24;
                                ret_io = hal_i2c_read_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf, 1);
                                
                                printf("read24_status=%d,ret_io=%d\n", wbuf[0],ret_io);
                                if((wbuf[0]&0x1F) == 0x1B)
                                {
                                    DS90UB947_read_status = 0;
                                    DS90UB947_read_count = 0;
                                    ds_reg = 0x24;
                                    wbuf[0] = 0x00;
                                    hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
                                    ds_reg = 0x23;
                                    wbuf[0] = 0x00;
                                    hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);                               
                                }else
                                {
                                    if(DS90UB947_read_count< 499)   // 10s
                                    {
                                        DS90UB947_read_count++;
                                    }else
                                    {
                                        DS90UB947_read_count = 0;
                                        ds_reg = 0x01;
                                        wbuf[0] = 0x01;
                                        hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf,1);
                                    }
                                }
                            }
                        }
                    }else if(DS90UB947_Init_Delay_Cnt == 52)
                    {
                        ds_reg = 0x17;
                        wbuf[0] = 0xde;
                        hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
                        ds_reg = 0x03;
                        wbuf[0] = 0xda;
                        hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg, 1, wbuf,1);
                    }else if(DS90UB947_Init_Delay_Cnt == 42)
                    {
                        Task_io_ds90ub947_init2();
                    }else if(DS90UB947_Init_Delay_Cnt == 22)
                    {
                        Task_io_ds90ub948_Read1();
                    }else if(DS90UB947_Init_Delay_Cnt == 2)
                    {
                        DS90UB947_read_status = 1;
                        if(ti948_count < 3)
                        {
                            ti948_count++;
                        }else
                        {
                            ti948_count = 0;
                            Task_io_ds90ub948_Read2();
                        }
                    }else
                    {
                    }
  }
 
 
 
 
void Task_io_ds90ub947_init2(void)
{
    uint8_t ds_reg[10] = {0x40, 0x41, 0x42, 0x41, 0x42, 0x42, 0x42, 0x42, 0x41, 0x42};
uint8_t wbuf[10]   = {0x10, 0x49, 0x16, 0x47, 0x20, 0xA0, 0x20, 0x00, 0x49, 0x00};
    uint8_t temp8 = 0;
    for(temp8 = 0;temp8<10;temp8++)
    {
        hal_i2c_write_reg_data(i2c_handle, 0x0c, &ds_reg[temp8], 1, &wbuf[temp8],1);
    }
}
void Task_io_ds90ub948_Read1(void)
{
    uint8_t ds_reg[2] = {0x00, 0x00};
uint8_t wbuf[2]   = {0x00, 0x00};
ds_reg[0]=0x03;
wbuf[0]=0xFA;
hal_i2c_write_reg_data(i2c_handle, 0x0C, &ds_reg[0], 1, &wbuf[0],1);
ds_reg[0]=0x03;
wbuf[0]=0xDA;
hal_i2c_write_reg_data(i2c_handle, 0x0C, &ds_reg[0], 1, &wbuf[0],1);
ds_reg[0]=0x68;
wbuf[0]=0x19;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg[0], 1, &wbuf[0],1);
}
void Task_io_ds90ub948_Read2(void)
{
    uint8_t ds_reg = 0x00;
uint8_t wbuf[2]   = {0x00, 0x00};
uint16_t Hhigh=0;
uint16_t Hlow=0;
uint16_t Vhigh=0;
uint16_t Vlow=0;
int ret_ti948 = 0;
ds_reg=0x68;
wbuf[0]=0x19;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1);  // H active High monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Hhigh=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x09;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1);  // H active Low monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Hlow=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x39;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1);  // V active High monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Vhigh=wbuf[0];
ds_reg=0x68;
wbuf[0]=0x29;
hal_i2c_write_reg_data(i2c_handle, 0x34, &ds_reg, 1, &wbuf[0],1);  // V active Low monitor
ds_reg=0x69;
ret_ti948 = hal_i2c_read_reg_data(i2c_handle, 0x34, &ds_reg, 1, wbuf, 1);
Vlow=wbuf[0];
Hhigh=Hhigh&0x3F;
Hlow=Hlow&0x3F;
Vhigh=Vhigh&0x3F;
Vlow=Vlow&0x3F;
Hhigh<<=6;
Hhigh=Hhigh|Hlow;
Vhigh<<=6;
Vhigh=Vhigh|Vlow;
printf("Hactive=%d,Vactive=%d\n", Hhigh,Vhigh);
if((Hhigh == 1920U)&&(Vhigh == 720U))
{
DS90UB947_read_status = 0;
DS90UB948_read_count = 0;
}else
{
if(DS90UB948_read_count < 4)
{
DS90UB948_read_count++;
}else
{
DS90UB948_read_count = 0;
DS90UB947_Init_Delay_Cnt = 43;
DS90UB947_read_status = 0;
DS90UB947_read_count = 0;
}
}
}

  • Colt,

    Based on the video of the issue, this does not look like something which can be introduced by the 947 or 948 SERDES since the display issue does not span the entire screen vertical resolution. It looks like the problem is isolated to a specific portion of the screen where the map data is being rendered only. FPD-Link generally can not create such an isolated failure - how have you narrowed that this issue is related to FPD-Link specifically and not the SoC generating the display content?

    Best Regards,
    Casey