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.

Linux/AM5718: HDMI Connecting issue

Part Number: AM5718
Other Parts Discussed in Thread: AM5728, TPD12S015, TPD12S016

Tool/software: Linux

Hai all,

We have one custom board where AM5718 is used. We are facing some strange errors if we connect different monitors to the board.

I have tested the same observation with EVM and it is working without any problem.

Scenario-1:

EVM and Custom boards connected to monitor (Dell U2413F) . I have run both modetest and kmscube, working fine.

Scenario-2:

EVM connected to  monitor (SAMSUNG LA40M81BM-It is a TV which supports HDMI connection). And works fine without any problem.

Scenario-3:

Custom board connected to  monitor (SAMSUNG LA40M81BM-It is a TV which supports HDMI connection).

1) If i connect the monitor after logging in, then started observing some prints on uart console like below line.

omap_i2c 48070000.i2c: controller timed out

omap_i2c 48070000.i2c: controller timed out

omap_i2c 48070000.i2c: controller timed out

cpu cpu0: vdd failed for 1060000uV[min 850000uV max 1500000uV]

cpufreq: __target_index: Failed to change cpu frequency: -110

omap_i2c 48070000.i2c: controller timed out

omap_i2c 48070000.i2c: controller timed out

omap_i2c 48070000.i2c: controller timed out

2) if monitor is connected during boot time and the after

omap_i2c 48072000.i2c: bus 1 rev0.12 at 400 kHz
[    3.586406] hctosys: unable to open rtc device (rtc0)
[    3.592124] ALSA device list:"

prints, booting is very slow and also it shows prints like below,

omap_i2c 48070000.i2c: controller timed out

omap_i2c 48070000.i2c: controller timed out

cpu cpu0: vdd failed for 1060000uV[min 850000uV max 1500000uV]

Can anyone please help regarding this issue??

Linux used: 4.14.67

SDK: 05.01.00.11

Regards,

Noufal P

  • Hi,

    I'd suggest you compare the dts settings of the display from the AM5728 EVM and your custom board. Also do the same for the hw connections. 

    It is possible that you have some timing issue or wrong dts configuration.

    Best Regards,
    Yordan

  • Hai Yordan,

    There is no changes in dts file but in HW, HPD pin is not connected for tpd12s015. For that we have changed the driver code for tpd12s015 to return always true in detect function.

    Thanks and Regards,

    Noufal P

  • Hai,

    Yordan,

    Rectified the above problem by connecting HPD pin and now we are not getting error like the above.

    After this, with both monitor(Samsung and Dell), we are not getting anything on the display when we run kmscube application. We have probed HDMI_DDC_SCL and HDMI_DDC_SDA, we are getting signals on the pins if we run the kmscube application.  We probed CLK and Data on HDMI side, we are not getting anything,

    Can anyone guide us to resolve the issue with displaying kmscube on monitor?

    Also one more observation in HW,

    In EVM HDMI1_DATA2Y is connected to AM57XX_HDMI_TX2+ and HDMI1_DATA2X to AM57XX_HDMI_TX2- as shown in below figure.

    But in our custom board,

    HDMI1_DATA2Y is connected to HDMI_D2_N and HDMI1_DATA2X to HDMI_D2_P. refer below figure. Even CLOCK also connected reverse compared to EVM.

    Does above changes make any differents?

    Regards,

    Noufal P 

  • Hi,

    If the evm works with the problematic monitor and your board does not, then I'd recommend to follow the EVM hw connections. I guess it matters how you connect the differential clock, because both AM57xx IDK and AM57xx EVM connect the datax to "-" and datay to "+".

    Looping the HW design team to confirm.

    Best Regards,
    Yordan

  • Hi Noufal,

    According to the documentation I have the polarity of the differential signals may be connected in either way. What is not clear is whether that switch is handled automatically. I don't think it is. I suspect that there is a register setting that defines the polarity of the differential signals for HDMI. Once I get more details on that setting I will post it here.

    Regards, Bill

  • Hi Noufal,

    There is a register that must be modified for the HDMI to operate correctly with the polarity swapped. This register is not documented in the current TRM. The register is at address 0x5804030C.

    There are four bits used to swap the polarity of the HDMI signals 

    bit30 - Swap polarity of channel D0  (reset = 0)

    bit29 - Swap polarity of channel D1  (reset = 0)

    bit28 - Swap polarity of channel D2  (reset = 0)

    bit27 - Swap polarity of channel CLK  (reset = 0)

    To change the polarity perform a Read-Modify-Write to this register and set these four bits to b1111. Do not change any of the other bits in the register to different values. 

    Regards, Bill

  • Hai Bill,

    Should i apply above register write in Driver?

    And in our case, HPD is also not connected to the HDMI. So can you please help in this. How can i bypass HPD logic in driver?

    if am not wrong, driver is reading edid based on the HPD status. How to make driver to read EDID without HPD?

    Regards,

    Noufal P

  • Hi Noufal,

    I have asked the Linux software team to respond to the software questions above. 

    Regards, Bill

  • Hi,

    AM57xx, uses tpd12s015 encoder, check the tpd_read_edid() in drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c. From AM57xx-idk-common.dtsi you can see that hpd is enabled through interrupt from GPIO7_12:
           tpd12s015: encoder@0 {
            compatible = "ti,tpd12s016", "ti,tpd12s015";

            gpios = <0>, /* optional CT_CP_HPD */
                <0>, /* optional LS_OE */
                <&gpio7 12 GPIO_ACTIVE_HIGH>;    /* HPD */

    Best Regards,
    Yordan

  • Hi,

    Thank you for the reply.

    But in our custom board, HPD is not connected. So how can bypass this?

    In the mentioned function, it is only calling hdmi read edid function.

    "

        struct panel_drv_data *ddata = to_panel_data(dssdev);
        struct omap_dss_device *in = ddata->in;

        if (!gpiod_get_value_cansleep(ddata->hpd_gpio))
            return -ENODEV;

        return in->ops.hdmi->read_edid(in, edid, len);

    "

    Regards,

    Noufal P

  • Hi Noufal,

    With regards to bypassing the HPD signal, I have reached out to our driver expert and I will keep you posted on any updates.  

    Regards,
    Krunal

  • Hi Noufal,

    Based on my discussion with our expert, the driver will not work properly without HPD. If HPD is always pulled-up, the driver thinks there's something connected, and tries to read the EDID from the monitor. However, this would fail if there's nothing there.

    Regards,
    Krunal