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.

DS90UB949-Q1: Accessing the internal EDID (SRAM)

Part Number: DS90UB949-Q1
Other Parts Discussed in Thread: DS90UB948-Q1, ALP

Hi All,


I'm trying to display an image on a screen using the DS90UB949-Q1 and DS90UB948-Q1, but it's not displaying correctly.
I'm trying to output to a 1080x960 LVDS display.

I suspect the image isn't displaying correctly because the internal EDID doesn't have the correct format.

Please tell me the registers and procedures for accessing the internal EDID (SRAM).

Also, please tell me how to make the HDMI source wait until the internal EDID (SRAM) editing is complete.


Best Regards,
Ishiwata

  • Hi Ishiwata-san,

    Thank you for reaching out. Attached is a script showing how to program the 949 internal EDID. To prevent the 949 from asserting HPD on power-up, the device can be strapped for EXT_CTL = 1. This is done via MODE_SEL1.

    After the internal EDID is programmed, the script will disable EXT_CTL and the HDMI TX will read the intended EDID.

    ############################
    # 949->948, Dual FPD-Link STP, 1920x1080@60Hz
    ############################
    
    import time
    
    # System dependant variables - adjust according to system 
    UB949 = 0x18        # 949 I2C Address
    
    
    EDID = [
    0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x1D, 0x40, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
    0x06, 0x22, 0x01, 0x04, 0xA0, 0x09, 0x05, 0x78, 0x0A, 0xEE, 0x91, 0xA3, 0x54, 0x4C, 0x99, 0x26,
    0x0F, 0x50, 0x54, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x28, 0x3C, 0x80, 0xA0, 0x70, 0xB0, 0x23, 0x40, 0x30, 0x20,
    0x36, 0x00, 0x51, 0x2F, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x54, 0x49, 0x20,
    0x44, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x20, 0x54, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78,
    0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB
    ]
    
    board.WriteI2C(serAddr,0x48,0xD)
    for x in range(0,256):
        board.WriteI2C(serAddr,0x49,x)
        board.WriteI2C(serAddr,0x4B,EDID[x])
    
    
    board.WriteI2C(serAddr, 0x54, 0x20) # Enable internal HDMI receiver 
    board.WriteI2C(serAddr, 0x4F, 0x0) # Use internal EDID
    time.sleep(1.5) # Delay recommended to prevent I2C issues when using laptop as HDMI source
    board.WriteI2C(UB949,0x03,0xDA) # Set I2C passthrough
    
    
    

    Best,

    Jack

  • Hi Jack-san,


    Thank you for your answer.

    I have a follow-up question.

    Can I set it using the GUI by entering 1080x960 in the blue box shown below?
    If so, what exactly is written to which address?


    I'd like to know how to verify that the video signal is being transmitted correctly.
    Besides checking the Built-In Self Test (BIST) and the PASS and LOCK terminals on the 948, are there any other methods?
    Also, I'd like to check if there's a problem with the connection between the deserializer (DS90UB948-Q1) and the LCD.
    Is it correct to assume that using a Pattern Generator will allow me to display the video only between the deserializer and the LCD, regardless of the signal from the serializer?


    Best Regards,
    Ishiwata

  • Hi Ishiwata-san,

    Can I set it using the GUI by entering 1080x960 in the blue box shown below?
    If so, what exactly is written to which address?

    It is possible to set the EDID using the GUI but this will involve writing many registers manually. EDID is a 256 byte configuration file that contains that video timings to be read by the HDMI TX. The EDID register space is accessed through the APB registers. The script I previously sent has a loop that writes all 256 registers in the EDID space.

    If you know the complete video timings which include the horizontal and vertical blankings, I can generate an EDID for the 1080*960 timing.

    Besides checking the Built-In Self Test (BIST) and the PASS and LOCK terminals on the 948, are there any other methods?

    The below script will readback the active video timing from the 948. This script should only be used for debug purposes and not for runtime diagnostics. Typically this script has to be executed twice to get the horizontal active timing to readback correctly.

    UB948 = 0x58
    board.WriteI2C(UB948,0x68,0x19) # H active High monitor
    Hhigh = board.ReadI2C(UB948, 0x69, 1)
    board.WriteI2C(UB948,0x68,0x09) # H active Low monitor
    Hlow = board.ReadI2C(UB948, 0x69, 1)
    board.WriteI2C(UB948,0x68,0x39) # V active High monitor
    Vhigh = board.ReadI2C(UB948, 0x69, 1)
    board.WriteI2C(UB948,0x68,0x29) # V active Low monitor
    Vlow = board.ReadI2C(UB948, 0x69, 1)
    mask = int('00111111',2)
    hlowmask = Hlow & mask
    hhighmask = Hhigh & mask
    vlowmask = Vlow & mask
    vhighmask = Vhigh & mask
    hhighmask = hhighmask << 6
    vhighmask = vhighmask << 6
    Hactive = hhighmask | hlowmask
    Vactive = vhighmask | vlowmask
    print Hactive ,"x", Vactive  #print out detected Dimensions
    board.WriteI2C(UB948,0x68,0x0) #Disable readback feature

    Is it correct to assume that using a Pattern Generator will allow me to display the video only between the deserializer and the LCD, regardless of the signal from the serializer?

    Yes the 948 pattern generator will allow the video to be sent from the deserializer regardless of the signal from the serializer. The 948 pattern generator is recommended to be enabled via the 948 local I2C bus as remote I2C communication will be disabled when using the internal oscillator of the 948.

    Below is an app note that covers the pattern generation feature for FPD3 devices such as the UB949 and UB948. 948 pattern generation can be enabled with the dedicated tab in the 948 ALP profile.

    https://www.ti.com/lit/an/snla132g/snla132g.pdf?ts=1781123402537&ref_url=https%253A%252F%252Fwww.google.com%252F

    Best,

    Jack