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.

SN65DSI86, Can enable colorbar mode in standalone?

Other Parts Discussed in Thread: SN65DSI86

Hi, 

       I want know to do to enable color bar mode without DSI.

       because datasheet say "The DSIX6 implements a SMPTE color bar. The color bar generator does not require the DSI interface".

       have any example code? like 3175.DSI86_SW_EXAMPLES.pdf

        

   

  • Hello,

    I have forwarded your question to the appropriate people and they will come back to you shortly.

    Regards.

  • Hi Elias,

             Thank you for watch the question! 

    BR,

    KunYi

  • Hello KunYi,

    You should create your own script to load the configuration required for your Display on the DSI86 you can base your script in the examples provided in the document DSI86_SW_EXAMPLES.pdf and you should add the following line to your script in order to enable the color bar feature in the DSI86:

    =====COLOR BAR ======= <i2c_write addr="0x2D" count="1" radix="16"><i2c_write radix="16" count="1" addr="0x2D">3C 18</i2c_write>

     

    I'm attaching two script examples where you could see the color bar feature enabled.

    Script1

    http://e2e.ti.com/cfs-file.ashx/__key/communityserver-discussions-components-files/130/0334.COLOR_5F00_BAR_5F00_800x600.xml

    Script2

    http://e2e.ti.com/cfs-file.ashx/__key/communityserver-discussions-components-files/130/1104.COLOR_5F00_BAR_5F00_640x480.xml

    Regards,

    Luis.

  • Dear Luis,

              Thank you for your reply. but still failed on my side when I try your script.

             please help me to check my testing program

    //*****************************************************************************
    //
    // SN65DSI86 testing program
    //
    // This is part of revision 1.0 of the EK-TM4C123GXL Firmware Package.
    //
    //*****************************************************************************
    
    #include <stdint.h>
    #include <string.h>
    #include <stdbool.h>
    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/fpu.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/timer.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    #include "utils/softi2c.h"
    
    //*****************************************************************************
    //
    //! UART0, connected to the Virtual Serial Port and running at
    //! 115,200, 8-N-1, is used to display messages from this application.
    //
    //*****************************************************************************
    #define SLAVE_ADDR 0x2C
    
    //*****************************************************************************
    //
    // The states in the interrupt handler state machine.
    //
    //*****************************************************************************
    #define STATE_IDLE              0
    #define STATE_WRITE_PRE_NEXT	1
    #define STATE_WRITE_PRE_FINAL   2 
    #define STATE_WRITE_NEXT        3
    #define STATE_WRITE_FINAL       4
    #define STATE_WAIT_ACK          5
    #define STATE_SEND_ACK          6
    #define STATE_OFFSET_ONE		7
    #define STATE_OFFSET_FIRST		8
    #define STATE_READ_ONE          9
    #define STATE_READ_FIRST		10
    #define STATE_READ_NEXT         11
    #define STATE_READ_FINAL        12
    #define STATE_READ_WAIT			13
    
    
    //
    //
    //
    #define EDP_CONFIGURATION_CAP		(0x000D)
    # define ASSR_SUPPORT				(1<<0)
    # define ENHANCE_FRAMING			(1<<1)
    # define DPCD_DISPLAY_CONTORL_CAP   (1<<3)
    
    
    #define EDP_CONFIGURATION_SET		(0x010A)
    # define EN_ASSR					(1<<0)
    # define EN_ENHANCE_FRAMING			(1<<1)
    # define EN_SELF_TEST				(1<<7)
    
    static tSoftI2C g_sI2C;
    
    static uint8_t  g_ui8SlaveAddr  = SLAVE_ADDR;
    static uint8_t *g_pui8Data = 0;
    static uint32_t g_ui32Count = 0;
    static uint32_t g_ui32Offset = 0;
    
    static volatile uint32_t g_ui32State = STATE_IDLE;
    
    static uint8_t g_ui8EDID[128];
    
    //*****************************************************************************
    //
    // The error routine that is called if the driver library encounters an error.
    //
    //*****************************************************************************
    #ifdef DEBUG
    void
    __error__(char *pcFilename, uint32_t ui32Line)
    {
    }
    #endif
    
    //*****************************************************************************
    //
    // The callback function for the SoftI2C module.
    //
    //*****************************************************************************
    void
    SoftI2CCallback(void)
    {
        //
        // Clear the SoftI2C interrupt.
        //
        SoftI2CIntClear(&g_sI2C);
    
        //
        // Determine what to do based on the current state.
        //
        switch(g_ui32State)
        {
            //
            // The idle state.
            //
            case STATE_IDLE:
            {
                //
                // There is nothing to be done.
                //
                break;
            }
    
    		case STATE_WRITE_PRE_NEXT:
    		{
    
    			SoftI2CDataPut(&g_sI2C, (g_ui32Offset & 0xFF));
    			SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_CONT);
    			g_ui32State = STATE_WRITE_NEXT;
    			break;
    		}
    
    		case STATE_WRITE_PRE_FINAL:
    		{
    			SoftI2CDataPut(&g_sI2C, (g_ui32Offset & 0xFF));
    			SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_CONT);
    			g_ui32State = STATE_WRITE_FINAL;
    			break;
    		}
    
            //
            // The state for the middle of a burst write.
            //
            case STATE_WRITE_NEXT:
            {
                //
                // Write the next data byte.
                //
                SoftI2CDataPut(&g_sI2C, *g_pui8Data++);
                g_ui32Count--;
    
                //
                // Continue the burst write.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_CONT);
    
                //
                // If there is one byte left, set the next state to the final write
                // state.
                //
                if(g_ui32Count == 1)
                {
                    g_ui32State = STATE_WRITE_FINAL;
                }
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // The state for the final write of a burst sequence.
            //
            case STATE_WRITE_FINAL:
            {
                //
                // Write the final data byte.
                //
                SoftI2CDataPut(&g_sI2C, *g_pui8Data++);
                g_ui32Count--;
    
                //
                // Finish the burst write.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_FINISH);
    
                //
                // The next state is to wait for the burst write to complete.
                //
                g_ui32State = STATE_SEND_ACK;
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // Wait for an ACK on the read after a write.
            //
            case STATE_WAIT_ACK:
            {
                //
                // See if there was an error on the previously issued read.
                //
                if(SoftI2CErr(&g_sI2C) == SOFTI2C_ERR_NONE)
                {
                    //
                    // Read the byte received.
                    //
                    SoftI2CDataGet(&g_sI2C);
    
                    //
                    // There was no error, so the state machine is now idle.
                    //
                    g_ui32State = STATE_IDLE;
    
                    //
                    // This state is done.
                    //
                    break;
                }
    
                //
                // Fall through to STATE_SEND_ACK.
                //
            }
    
            //
            // Send a read request, looking for the ACK to indicate that the write
            // is done.
            //
            case STATE_SEND_ACK:
            {
                //
                // Put the I2C master into receive mode.
                //
                SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, true);
    
                //
                // Perform a single byte read.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_SINGLE_RECEIVE);
    
                //
                // The next state is the wait for the ack.
                //
                g_ui32State = STATE_WAIT_ACK;
    
                //
                // This state is done.
                //
                break;
            }
    
    		// The state for a single byte read.
    		case STATE_OFFSET_ONE:
    		{
    			SoftI2CDataPut(&g_sI2C, (g_ui32Offset & 0xFF));
    			SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_CONT);
    			g_ui32State = STATE_READ_ONE;
    			break;
    		}
    
    		case STATE_OFFSET_FIRST:
    		{
    			SoftI2CDataPut(&g_sI2C, (g_ui32Offset & 0xFF));
    			SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_CONT);
    			g_ui32State = STATE_READ_FIRST;
    			break;
    		}
    
            //
            // The state for a single byte read.
            //
            case STATE_READ_ONE:
            {
                //
                // Put the SoftI2C module into receive mode.
                //
                SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, true);
    
                //
                // Perform a single byte read.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_SINGLE_RECEIVE);
    
                //
                // The next state is the wait for final read state.
                //
                g_ui32State = STATE_READ_WAIT;
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // The state for the start of a burst read.
            //
            case STATE_READ_FIRST:
            {
                //
                // Put the SoftI2C module into receive mode.
                //
                SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, true);
    
                //
                // Start the burst receive.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_RECEIVE_START);
    
                //
                // The next state is the middle of the burst read.
                //
                g_ui32State = STATE_READ_NEXT;
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // The state for the middle of a burst read.
            //
            case STATE_READ_NEXT:
            {
                //
                // Read the received character.
                //
                *g_pui8Data++ = SoftI2CDataGet(&g_sI2C);
                g_ui32Count--;
    
                //
                // Continue the burst read.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_RECEIVE_CONT);
    
                //
                // If there are two characters left to be read, make the next
                // state be the end of burst read state.
                //
                if(g_ui32Count == 2)
                {
                    g_ui32State = STATE_READ_FINAL;
                }
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // The state for the end of a burst read.
            //
            case STATE_READ_FINAL:
            {
                //
                // Read the received character.
                //
                *g_pui8Data++ = SoftI2CDataGet(&g_sI2C);
                g_ui32Count--;
    
                //
                // Finish the burst read.
                //
                SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_RECEIVE_FINISH);
    
                //
                // The next state is the wait for final read state.
                //
                g_ui32State = STATE_READ_WAIT;
    
                //
                // This state is done.
                //
                break;
            }
    
            //
            // This state is for the final read of a single or burst read.
            //
            case STATE_READ_WAIT:
            {
                //
                // Read the received character.
                //
                *g_pui8Data++ = SoftI2CDataGet(&g_sI2C);
                g_ui32Count--;
    
                //
                // The state machine is now idle.
                //
                g_ui32State = STATE_IDLE;
    
                //
                // This state is done.
                //
                break;
            }
        }
    }
    
    void
    I2C_Write8(uint8_t *pui8Data, uint32_t ui32Offset, uint32_t ui32Count)
    {
        //
        // Save the data buffer to be written.
        //
        g_pui8Data = pui8Data;
        g_ui32Count = ui32Count;
    	g_ui32Offset = ui32Offset;
        //
        // Set the next state of the callback state machine based on the number of
        // bytes to write.
        //
        if(ui32Count != 1)
        {
            g_ui32State = STATE_WRITE_NEXT;
        }
        else
        {
            g_ui32State = STATE_WRITE_FINAL;
        }
    
        //
        // Set the slave address and setup for a transmit operation.
        //
        SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, false);
    
        //
        // Write the address to be written as the first data byte.
        //
        SoftI2CDataPut(&g_sI2C, (ui32Offset & 0xFF));
    
        //
        // Start the burst cycle, writing the address as the first byte.
        //
        SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_START);
    
        //
        // Wait until the SoftI2C callback state machine is idle.
        //
        while(g_ui32State != STATE_IDLE)
        {
        }
    }
    
    
    //*****************************************************************************
    //
    // Write to the Atmel device.
    //
    //*****************************************************************************
    void
    AtmelWrite(uint8_t *pui8Data, uint32_t ui32Offset, uint32_t ui32Count)
    {
        //
        // Save the data buffer to be written.
        //
        g_pui8Data = pui8Data;
        g_ui32Count = ui32Count;
    	g_ui32Offset = ui32Offset;
        //
        // Set the next state of the callback state machine based on the number of
        // bytes to write.
        //
        if(ui32Count != 1)
        {
            g_ui32State = STATE_WRITE_PRE_NEXT;
        }
        else
        {
            g_ui32State = STATE_WRITE_PRE_FINAL;
        }
    
        //
        // Set the slave address and setup for a transmit operation.
        //
        SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, false);
    
        //
        // Write the address to be written as the first data byte.
        //
        SoftI2CDataPut(&g_sI2C, (ui32Offset>>8));
    
        //
        // Start the burst cycle, writing the address as the first byte.
        //
        SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_START);
    
        //
        // Wait until the SoftI2C callback state machine is idle.
        //
        while(g_ui32State != STATE_IDLE)
        {
        }
    }
    
    void 
    I2C_Read8(uint8_t *pui8Data, uint32_t ui32Offset, uint32_t ui32Count)
    {
    	//
        // Save the data buffer to be read.
        //
        g_pui8Data = pui8Data;
        g_ui32Count = ui32Count;
    	g_ui32Offset = ui32Offset;
    
        //
        // Set the next state of the callback state machine based on the number of
        // bytes to read.
        //
        if(ui32Count == 1)
        {
            g_ui32State = STATE_READ_ONE;
        }
        else
        {
            g_ui32State = STATE_READ_FIRST;
        }
    
        //
        // Start with a dummy write to get the address set in the EEPROM.
        //
        SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, false);
    
        //
        // Write the address to be written as the first data byte.
        //
        SoftI2CDataPut(&g_sI2C, (ui32Offset & 0xFF));
    
        //
        // Perform a single send, writing the address as the only byte.
        //
        SoftI2CControl(&g_sI2C, SOFTI2C_CMD_SINGLE_SEND);
    	//SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_START);
    
        //
        // Wait until the SoftI2C callback state machine is idle.
        //
        while(g_ui32State != STATE_IDLE)
        {
    	} 
    }
    
    
    //*****************************************************************************
    //
    // Read from the Atmel device.
    //
    //*****************************************************************************
    void
    AtmelRead(uint8_t *pui8Data, uint32_t ui32Offset, uint32_t ui32Count)
    {
        //
        // Save the data buffer to be read.
        //
        g_pui8Data = pui8Data;
        g_ui32Count = ui32Count;
    	g_ui32Offset = ui32Offset;
    
        //
        // Set the next state of the callback state machine based on the number of
        // bytes to read.
        //
        if(ui32Count == 1)
        {
            g_ui32State = STATE_OFFSET_ONE;
        }
        else
        {
            g_ui32State = STATE_OFFSET_FIRST;
        }
    
        //
        // Start with a dummy write to get the address set in the EEPROM.
        //
        SoftI2CSlaveAddrSet(&g_sI2C, g_ui8SlaveAddr, false);
    
        //
        // Write the address to be written as the first data byte.
        //
        SoftI2CDataPut(&g_sI2C, (ui32Offset>>8));
    
        //
        // Perform a single send, writing the address as the only byte.
        //
    //    SoftI2CControl(&g_sI2C, SOFTI2C_CMD_SINGLE_SEND);
    	SoftI2CControl(&g_sI2C, SOFTI2C_CMD_BURST_SEND_START);
    
        //
        // Wait until the SoftI2C callback state machine is idle.
        //
        while(g_ui32State != STATE_IDLE)
        {
        }
    }
    
    //*****************************************************************************
    //
    // This is the interrupt handler for the Timer0A interrupt.
    //
    //*****************************************************************************
    void
    Timer0AIntHandler(void)
    {
        //
        // Clear the timer interrupt.
        // TODO: change this to whichever timer you are using.
        //
        TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
    
        //
        // Call the SoftI2C tick function.
        //
        SoftI2CTimerTick(&g_sI2C);
    }
    
    
    //*****************************************************************************
    //
    // Configure the UART and its pins.  This must be called before UARTprintf().
    //
    //*****************************************************************************
    void
    ConfigureUART(void)
    {
        //
        // Enable the GPIO Peripheral used by the UART.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    
        //
        // Enable UART0
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
    
        //
        // Configure GPIO Pins for UART mode.
        //
        ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
        ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
        ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
    
        //
        // Use the internal 16MHz oscillator as the UART clock source.
        //
        UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
    
        //
        // Initialize the UART for console I/O.
        //
        UARTStdioConfig(0, 115200, 16000000);
    }
    
    static void READ_DPCD(uint8_t* buff, uint32_t v_addr, uint32_t cnt)
    {
    	uint8_t tmp[4];
    	// AUX 20bit address
    	tmp[0] = (v_addr>>16) & 0x0F;
    	tmp[1] = (v_addr>>8) & 0xFF;
    	tmp[2] = (v_addr & 0xFF);
    	// length
    	tmp[3] = (cnt & 0x1F);
    	I2C_Write8(tmp, 0x74, 4); // write DPCD register address
    
    	// AUX_NATIVE_CMD (0x9)
    	tmp[0] = (9<<4) | // AUX_NATIVE_READ
    			 (1<<0);  // EN_SEND_AUX
        I2C_Write8(tmp, 0x78, 1);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // waiting for response
    	I2C_Read8(buff, 0x79, (cnt&0x1F));
    }
    
    static void WRITE_DPCD(uint8_t* buff, uint32_t v_addr, uint32_t cnt)
    {
    	uint8_t tmp[4];
    	// AUX 20bit address
    	tmp[0] = (v_addr>>16) & 0x0F;
    	tmp[1] = (v_addr>>8) & 0xFF;
    	tmp[2] = (v_addr & 0xFF);
    	// length
    	tmp[3] = (cnt & 0x1F);
    	I2C_Write8(tmp, 0x74, 4); // write DPCD register address
    
    	I2C_Write8(buff, 0x64, cnt);
    
    	// AUX_NATIVE_CMD (0x8)
    	tmp[0] = (8<<4) | // AUX_NATIVE_WRITE
    			 (1<<0);  // EN_SEND_AUX
        I2C_Write8(tmp, 0x78, 1);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3);
    }
    
    
    static void opAUX(uint32_t v_addr, uint8_t* buff, uint8_t cnt, uint8_t cmd)
    {
    	uint8_t tmp[4];
    	// AUX 20bit address
    	tmp[0] = (v_addr>>16) & 0x0F;
    	tmp[1] = (v_addr>>8) & 0xFF;
    	tmp[2] = (v_addr & 0xFF);
    	// length
    	tmp[3] = (cnt & 0x1F);
    	I2C_Write8(tmp, 0x74, 4); // write address
    	
    	if ((cnt != 0) && cmd != 5)
    		I2C_Write8(buff, 0x64, cnt);
    	tmp[0] = (cmd << 4) |
    			 ( 1 << 0); // SEND flag
    	I2C_Write8(tmp, 0x78, 1);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3);
    }
    
    static void readEDID(void)
    {
    	uint8_t buf[2];
    	uint8_t count;
    	
    	memset(buf, 0, sizeof(buf));
    	opAUX(0x50, buf, 0, 4); // Write with MOT, I2C over AUX, SYNC
    	opAUX(0x50, buf, 1, 4); // Write with MOT, Offset 0
    	opAUX(0x50, buf, 0, 5); // Read with MOT, READ START
    	for (count=0; count < 128; count+= 16) {
    		opAUX(0x50, buf, 0x10, 5); // Read with MOT, read 16 byte
    		I2C_Read8((g_ui8EDID+count), 0x79, 0x10);
    	}
    	opAUX(0x50, buf, 0, 1); // read without MOT, read stop
    }
    
    static void dumpEDID(void)
    {
    	uint8_t count;
    	uint8_t vo;
    	
    	count = vo = 0;
    	UARTprintf("--------------------------------------------------------\n");
    	UARTprintf("Dump Panel EDID \n");
    	UARTprintf("--------------------------------------------------------\n");
    	UARTprintf("    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");
    	UARTprintf("--------------------------------------------------------");
    	for(count = 0; count < sizeof(g_ui8EDID); count++) {
    		if ((count % 16) == 0) {
    			UARTprintf("\n%02X|", vo);
    			vo += 0x10;
    		}
    		UARTprintf(" %02x", g_ui8EDID[count]);
    	}
    	
    	UARTprintf("\n");
    }
    
    static void dumpPanelTiming(void)
    {
    	uint32_t t;
    	uint16_t ha;
    	uint16_t hb;
    	uint16_t ho;
    	uint16_t va;
    	uint16_t vb;
    	uint16_t vo;
    	uint16_t hpw;
    	uint16_t vpw;
    	uint16_t hsz;
    	uint16_t vsz;
    	uint16_t hbp;
    	uint16_t vbp;
    	
    	UARTprintf("--------------------------------------------------------\n");
    	UARTprintf("Extract Panel timing from EDID DTD1\n");
    	UARTprintf("--------------------------------------------------------\n");
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf
    
    	#define DTD1_OFFSET  (0x36)
    	t = (g_ui8EDID[DTD1_OFFSET+1]<<8) + g_ui8EDID[DTD1_OFFSET+0];
    	ha = ((g_ui8EDID[DTD1_OFFSET+4] & 0xF0)<<4) + g_ui8EDID[DTD1_OFFSET+2];
    	hb = ((g_ui8EDID[DTD1_OFFSET+4] & 0x0F)<<8) + g_ui8EDID[DTD1_OFFSET+3];
    	va = ((g_ui8EDID[DTD1_OFFSET+7] & 0xF0)<<4) + g_ui8EDID[DTD1_OFFSET+5];
    	vb = ((g_ui8EDID[DTD1_OFFSET+7] & 0x0F)<<8) + g_ui8EDID[DTD1_OFFSET+6];
    	ho = ((g_ui8EDID[DTD1_OFFSET+11] & 0xC0)<<2) + g_ui8EDID[DTD1_OFFSET+8];
    	vo = ((g_ui8EDID[DTD1_OFFSET+11] & 0x0C)<<2) + (g_ui8EDID[DTD1_OFFSET+10] >> 4);	
    	hpw = ((g_ui8EDID[DTD1_OFFSET+11] & 0x30)<<4) + g_ui8EDID[DTD1_OFFSET+9];
    	vpw = ((g_ui8EDID[DTD1_OFFSET+11] & 0x03)<<4) + (g_ui8EDID[DTD1_OFFSET+10]&0x0F);
    	hsz = ((g_ui8EDID[DTD1_OFFSET+14] & 0xF0)<<4) + g_ui8EDID[DTD1_OFFSET+12];
    	vsz = ((g_ui8EDID[DTD1_OFFSET+14] & 0x0F)<<8) + g_ui8EDID[DTD1_OFFSET+13];
    	hbp = g_ui8EDID[DTD1_OFFSET+15];
    	vbp = g_ui8EDID[DTD1_OFFSET+16];
    	
    	UARTprintf("Pixel Clock %dMHz(%dKHz)\n", t/100, t*10);
    	UARTprintf("Active zone(Hori.xVert.): %dx%d\n", ha, va);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf	
    	UARTprintf("Blinking zone(Hori. & Vert.): %d & %d\n", hb, vb);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf	
    	UARTprintf("Horizontal sync Offset & Pulse width: %d & %d\n", ho, hpw);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf	
    	UARTprintf("Vertical sync Offset & Pulse width: %d & %d\n", vo, vpw);	
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf	
    	UARTprintf("Border (Hori. & Vert.): %d & %d\n", hbp, vbp);
    	UARTprintf("Display Size(Hori.xVert.): %dx%d mm2\n", hsz, vsz);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf
    	if ((g_ui8EDID[DTD1_OFFSET+17] & 0x18) !=  0x18) {
    		UARTprintf("can't support the panel, because we need a digital separate type\n");
    		return;
    	}
    	UARTprintf("Horizontal sync. Polarity: ");		
    	if (g_ui8EDID[DTD1_OFFSET+17] & (1<<1)) {
    		UARTprintf("Positive\n");
    	} else {
    		UARTprintf("Negative\n");
    	}
    
    	UARTprintf("Vertical sync. Polarity: ");	
    	if (g_ui8EDID[DTD1_OFFSET+17] & (1<<2)) {
    		UARTprintf("Positive\n");
    	} else {
    		UARTprintf("Negative\n");
    	}
    }
    
    static void dumpDPCD(void)
    {
    	uint8_t count;
    	uint8_t i;
    	uint8_t buf[16];
    	uint16_t lists[] = {
    		0x0000, 0x0100, 0x0200, 0x0210 };
    
    	UARTprintf("--------------------------------------------------------\n");
    	UARTprintf("dump panel DPCD value\n");
    	UARTprintf("--------------------------------------------------------\n");
    
    	for (i = 0; i < (sizeof(lists)/sizeof(uint16_t)); i++) {
    		READ_DPCD(buf, lists[i], 16);
    		UARTprintf("DPCD %04xh:", lists[i]);
    		for(count = 0; count < 16; count++) {
    			UARTprintf(" %02X", buf[count]);
    		}
    		UARTprintf("\n");
    		ROM_SysCtlDelay(ROM_SysCtlClockGet()/10/3); // wating for UARTprintf
    	}
    }
    
    static void showDPCDInfo(void)
    {
    	uint8_t buf[16];
    	READ_DPCD(buf, 0, 16);
    
    	UARTprintf("DPCD: REV:%d.%d, MAX_LINK_RATE:", (buf[0] >> 4), (buf[0]&0xF));
    	if (buf[1] == 0x06) {
    		UARTprintf("1.62Gbps");
    	} else if (buf[1] == 0x0A) {
    		UARTprintf("2.7Gbps");
    	}
    	UARTprintf(" MAX_LINK_LANE:%d\n", buf[2]);
    	if (buf[0x0D] & ASSR_SUPPORT) {
    		UARTprintf(" support ASSR");
    	} else {
    		UARTprintf(" not support ASSR");
    	}
    	if (buf[0x0D] & ENHANCE_FRAMING) {
    		UARTprintf(" support Enhance framing");
    	} else {
    		UARTprintf(" not support Enhance framing");
    	}
    	UARTprintf("\n");
    }
    //*****************************************************************************
    //
    //
    //*****************************************************************************
    int
    main(void)
    {
        //volatile uint32_t ui32Loop;
    	uint32_t count;
    	uint8_t BUF[32];
    	uint32_t tmp;
    	uint32_t vo = 0;
    
    	tmp = 0;
    	BUF[0] = BUF[1] = BUF[2] = BUF[3] = tmp;
    	tmp = BUF[0];
    
        //
        // Enable lazy stacking for interrupt handlers.  This allows floating-point
        // instructions to be used within interrupt handlers, but at the expense of
        // extra stack usage.
        //
        ROM_FPULazyStackingEnable();
    
        //
        // Set the clocking to run directly from the crystal.
        //
        ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
                           SYSCTL_OSC_MAIN);
    
        //
        // Enable the GPIO port that is used for the on-board LED.
        //
        ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    
        //
        // Enable the GPIO pins for the LED (PF2 & PF3).
        //
        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);
    
    	//
    	// Initialize SoftI2C 
    	//
    	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    	ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    	GPIOPinTypeI2C(GPIO_PORTA_BASE, GPIO_PIN_6 | GPIO_PIN_7);
    	memset(&g_sI2C, 0, sizeof(g_sI2C));
    	SoftI2CCallbackSet(&g_sI2C, SoftI2CCallback);
    	SoftI2CSCLGPIOSet(&g_sI2C, GPIO_PORTA_BASE, GPIO_PIN_6);
    	SoftI2CSDAGPIOSet(&g_sI2C, GPIO_PORTA_BASE, GPIO_PIN_7);
    	SoftI2CInit(&g_sI2C);
    
    	SoftI2CIntEnable(&g_sI2C);
    
        TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
        TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet() / 40000);
        TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
        TimerEnable(TIMER0_BASE, TIMER_A);
    
        IntEnable(INT_TIMER0A);
    
    
        //
        // Initialize the UART.
        //
        ConfigureUART();
    	
    	UARTprintf("for ColorBar Test \r\n");
    	BUF[0] = 1;
    	I2C_Write8(BUF, 0x09, 1); // software reset
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = 0 ;
    	I2C_Write8(BUF, 0x5A, 1); // disable VSTREAM
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = 0x0;
    	I2C_Write8(BUF, 0x0D, 1); // disable DP_PLL_EN
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    	
    	BUF[0] = 1;
    	I2C_Write8(BUF, 0x09, 1); // software reset
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    	
    	BUF[0] = 0x2;
    	I2C_Write8(BUF, 0x0A, 1); // Clock Ref = 19.2MHz
    
    	readEDID();
    	dumpEDID();
    	dumpPanelTiming();
    	dumpDPCD();
    	showDPCDInfo();
    	BUF[0] = (1 << 5) | // SINGL CHANNEL DSI (A)
    			(0 << 3) | // Four Lane
    			(0);	   // SOT_ERR_TOL_DIS
    	I2C_Write8(BUF, 0x10, 1);
    
    	BUF[0] = 0; // disable ASSR
    	I2C_Write8(BUF, 0x5A, 1);
    
    	BUF[0] = 1<<1; // 24BPP
    	I2C_Write8(BUF, 0x5B, 1);
    
    	BUF[0] = 0; // HPD Enable
    	I2C_Write8(BUF, 0x5C, 1);
    
    	BUF[0] = (0 << 6)  | // DP pre emphasis lv 0
    			(2 << 4)  | // DP 2 lane
    			(2 << 1)  | // Downspread 3750ppm
    			(0 << 0);   // disable SSC
    	I2C_Write8(BUF, 0x93, 1);
    
    	BUF[0] = (4 << 5) | // 2.70Gbps
    			(0 << 2) | // 61ps
    			(0 << 0);  // Voltage
    	I2C_Write8(BUF, 0x94, 1);
    // Panel timing 
    #define  HA			(1920)
    #define  HSPW		(39)
    #define  HFP		(59)
    #define  HBP		(62)
    #define  HSP		(0) // Hsyn Polarity:0 POS
    #define  VA         (1200)
    #define  VSPW		(3)
    #define  VFP		(6)
    #define  VBP		(26)
    #define  VSP        (1) // Vsyn Polarity: NEG
    
    	BUF[0] = (HA & 0xFF);
    	BUF[1] = ((HA>>8) & 0xFF);
    	I2C_Write8(BUF, 0x20, 2); // ActiveLine
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = (VA & 0xFF);
    	BUF[1] = ((VA>>8) & 0xFF);
    	I2C_Write8(BUF, 0x24, 2);  // Vertical line
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = (HSPW & 0xFF);
    	BUF[1] = ((HSPW>>8) & 0x7F) |
    			(HSP << 7);
    	I2C_Write8(BUF, 0x2C, 2); // HSYNC Pulse width
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = (VSPW & 0xFF);
    	BUF[1] = ((VSPW>>8) & 0xFF) |
    			(VSP << 7); // neg
    	I2C_Write8(BUF, 0x30, 2); // VSYNC Pulse width
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = HBP;
    	I2C_Write8(BUF, 0x34, 1); // H_BACK_PORCH
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = VBP;
    	I2C_Write8(BUF, 0x36, 1); // V_BACK_PORCH
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = HFP;
    	I2C_Write8(BUF, 0x38, 1); // H_FRONT_PORCH
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    	
    	BUF[0] = VFP;
    	I2C_Write8(BUF, 0x3A, 1); // V_FRONT_PORCH
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    	
    	BUF[0] = 0;
    	I2C_Write8(BUF, 0x5B, 1); //24bpp
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	BUF[0] = 0x1;
    	I2C_Write8(BUF, 0x0D, 1); // Enable DP_PLL_EN
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	I2C_Read8(BUF, 0x0A, 1);
    	if (BUF[0] & 0x80) UARTprintf("DSI86 PLL has Locked now\n");
    
    	BUF[0] = 0xA;	// ML_TX_MODE,Semi Auto Link Training
    	I2C_Write8(BUF, 0x96, 1);
    	ROM_SysCtlDelay(ROM_SysCtlClockGet() / 10 / 3);
    
    	I2C_Read8(BUF, 0x96, 1);
    	UARTprintf("SemiTraning result:%02X\n", BUF[0]);
    
    #if 0
    	BUF[0] = EN_SELF_TEST;
    	WRITE_DPCD(BUF, EDP_CONFIGURATION_SET, 1);
    #endif
    
    	BUF[0] = 0x18; // Color Bar enable
    	I2C_Write8(BUF, 0x3C, 1);
    	SysCtlDelay(SysCtlClockGet() / 10 / 3);
    
    	I2C_Read8(BUF, 0x20, 4);
    
    	BUF[0] = (1<<3) ; // VStream
    			//(0<<2) | // Enhanced Framing
    	I2C_Write8(BUF, 0x5A, 1);
    	SysCtlDelay(SysCtlClockGet() / 10 / 3);
    	
    	UARTprintf("--------------------------------------------------------\n");
    	UARTprintf("    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");
    	UARTprintf("--------------------------------------------------------");
    
    #if 1
    	for (tmp = 0; tmp < 8; tmp++) {
    		I2C_Read8(BUF, tmp*sizeof(BUF), sizeof(BUF));
    		for(count = 0; count < sizeof(BUF); count++) {
    			if ((count % 16) == 0) {
    				UARTprintf("\n%02X|", vo);
    				vo += 0x10;
    			}
    			UARTprintf(" %02x", BUF[count]);
    		}
    	}
    #endif
    	UARTprintf("\n");
    	dumpDPCD();
        while(1)
        {
    		
            //
            // Turn on the BLUE LED.
            //
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
    
            //
            // Delay for a bit.
            //
    		 SysCtlDelay(SysCtlClockGet() / 10 / 3);
    	
            //
            // Turn off the BLUE LED.
            //
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
    
            //
            // Delay for a bit.
            //
            SysCtlDelay(SysCtlClockGet() / 10 / 3);
    	}
    }
    
    or

    the program result under the below or

    BR,

    KunYi


    for ColorBar Test
    --------------------------------------------------------
    Dump Panel EDID
    --------------------------------------------------------
    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    --------------------------------------------------------
    00| 00 ff ff ff ff ff ff 00 0e 14 93 1c 00 00 00 00
    10| 13 17 01 04 95 16 0e 78 0a a7 9d 91 52 54 93 2b
    20| 1a 50 54 00 00 fd 01 01 01 01 01 01 01 01 01 01
    30| 01 01 01 01 01 01 28 3c 80 a0 70 b0 23 40 3b 27
    40| 36 00 d9 87 00 00 00 1a 28 3c 80 a0 70 b0 23 40
    50| 3b 27 36 00 d9 87 00 00 00 1a 00 00 00 fe 00 43
    60| 50 54 20 20 20 20 20 20 20 20 20 20 00 00 00 00
    70| 00 43 4c 41 41 31 30 31 46 50 30 0a 20 20 00 ba
    --------------------------------------------------------
    Extract Panel timing from EDID DTD1
    --------------------------------------------------------
    Pixel Clock 154MHz(154000KHz)
    Active zone(Hori.xVert.): 1920x1200
    Blinking zone(Hori. & Vert.): 160 & 35
    Horizontal sync Offset & Pulse width: 59 & 39
    Vertical sync Offset & Pulse width: 3 & 6
    Border (Hori. & Vert.): 0 & 0
    Display Size(Hori.xVert.): 217x135 mm2
    Horizontal sync. Polarity: Positive
    Vertical sync. Polarity: Negative
    --------------------------------------------------------
    dump panel DPCD value
    --------------------------------------------------------
    DPCD 0000h: 11 0a 02 00 00 00 00 00 00 00 00 00 00 00 00 00
    DPCD 0100h: 0a 02 00 09 09 00 00 00 00 00 00 00 00 00 00 00
    DPCD 0200h: 00 00 00 00 80 00 55 00 00 00 00 00 00 00 00 00
    DPCD 0210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    DPCD: REV:1.1, MAX_LINK_RATE:2.7Gbps MAX_LINK_LANE:2
    not support ASSR not support Enhance framing
    DSI86 PLL has Locked now
    SemiTraning result:01

    dump SN65DSI86
    --------------------------------------------------------
    00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
    --------------------------------------------------------
    00| 36 38 49 53 44 20 20 20 02 00 82 00 00 01 00 00
    10| 20 00 64 00 00 00 00 00 00 00 00 00 00 00 00 00
    20| 80 07 00 00 b0 04 00 00 00 00 00 00 27 00 00 00
    30| 03 80 00 00 3e 00 1a 00 3b 00 06 00 10 00 00 00
    40| 15 49 00 00 80 00 20 08 d3 04 65 00 1d 00 27 00
    50| 03 80 80 07 b0 04 20 00 40 e4 09 00 10 00 90 00
    60| a0 60 a4 00 00 09 00 00 00 00 00 00 00 00 00 00
    70| 00 00 00 00 00 01 02 01 80 81 00 02 00 00 00 00
    80| 00 00 00 00 00 00 00 00 00 1f 7c f0 c1 07 1f 7c
    90| f0 c1 07 64 81 00 01 04 01 00 00 00 00 00 00 00
    a0| 01 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00
    b0| 04 78 ac ac 08 6c 9c 9c 0c 5c 5c 5c 0c 0c 0c 0c
    c0| 3f 3f 0f 00 00 00 00 00 00 00 00 00 00 00 00 00
    d0| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    e0| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    f0| 00 00 00 00 01 22 00 00 01 00 00 00 00 00 00 00
    --------------------------------------------------------
    dump panel DPCD value
    --------------------------------------------------------
    DPCD 0000h: 11 0a 02 00 00 00 00 00 00 00 00 00 00 00 00 00
    DPCD 0100h: 0a 02 00 09 09 00 00 00 00 00 00 00 00 00 00 00
    DPCD 0200h: 00 00 77 00 01 01 55 00 00 00 00 00 00 00 00 00
    DPCD 0210h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  • I got root cause today..

    SN65DSI86 just support  panel with ASSR.

    due to my test panel is non-ASSR type. so always failed.