Part Number: AM5728
Other Parts Discussed in Thread: TPD12S521
Tool/software: Linux
Question:
HDMI output don't work in our custom am5728 board,
Who triggers HDMI_IRQ_LINK_CONNECT bit or HDMI_IRQ_LINK_DISCONNECT bit of HDMI_IRQ_STATUS in HDMI interrupt?
Develop environment in custom board:
1 cpu is AM5728
2 sdk is Processor SDK 03.03.00.04 Linux
3 hdmi esd is TPD12S521
Status of our custom board:
1 I2C of HMDI don't work in our custom board ,so we don't read edid, remove reading edid code, use the basic resolution 640x480, EVM board work in this condition.
2 HPD signal is normal in our board.
3 after startup we detect that there is nothing in the HDMI_CLOCK+ in our board, but there is signal in HDMI_CLOCK+ in EVM.
4 VDDA_HDMI is good in our board.
5 there are the same kernel and dts and file system between our custom board and EVM board in the experiment.
We find it’s different in function hdmi_irq_handler in hdmi5.c.
static irqreturn_t hdmi_irq_handler(int irq, void *data)
{
struct hdmi_wp_data *wp = data;
u32 irqstatus;
irqstatus = hdmi_wp_get_irqstatus(wp);
hdmi_wp_set_irqstatus(wp, irqstatus);
if ((irqstatus & HDMI_IRQ_LINK_CONNECT) &&
irqstatus & HDMI_IRQ_LINK_DISCONNECT) {
u32 v;
/*
* If we get both connect and disconnect interrupts at the same
* time, turn off the PHY, clear interrupts, and restart, which
* raises connect interrupt if a cable is connected, or nothing
* if cable is not connected.
*/
printk("hdmi_irq_handler 0\n"); //our custom come here after startup
hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_OFF);
/*
* We always get bogus CONNECT & DISCONNECT interrupts when
* setting the PHY to LDOON. To ignore those, we force the RXDET
* line to 0 until the PHY power state has been changed.
*/
v = hdmi_read_reg(hdmi.phy.base, HDMI_TXPHY_PAD_CFG_CTRL);
v = FLD_MOD(v, 1, 15, 15); /* FORCE_RXDET_HIGH */
v = FLD_MOD(v, 0, 14, 7); /* RXDET_LINE */
hdmi_write_reg(hdmi.phy.base, HDMI_TXPHY_PAD_CFG_CTRL, v);
hdmi_wp_set_irqstatus(wp, HDMI_IRQ_LINK_CONNECT |
HDMI_IRQ_LINK_DISCONNECT);
hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON);
REG_FLD_MOD(hdmi.phy.base, HDMI_TXPHY_PAD_CFG_CTRL, 0, 15, 15);
} else if (irqstatus & HDMI_IRQ_LINK_CONNECT) {
printk("hdmi_irq_handler connect 1\n"); //EVM come here after startup
hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_TXON);
} else if (irqstatus & HDMI_IRQ_LINK_DISCONNECT) {
printk("hdmi_irq_handler disconnect 2\n");
hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON);
}
return IRQ_HANDLED;
}
After startup, both of our board and EVM board can enter hdmi_irq_handler, but result are deferent.
The result of hdmi_wp_get_irqstatus(wp) in EVM board is HDMI_IRQ_LINK_CONNECT, but it is HDMI_IRQ_LINK_CONNECT and HDMI_IRQ_LINK_DISCONNECT in our board.
In addition, when hmdi cable is connected with display, we turn on and off the power of display, EVM can enter hdmi_irq_handler , but our board can’t enter hdmi_irq_handler.
The HDMI interrupt is:
96 HDMI_IRQ HDMI interrupt
Register:
hdmi.h
HDMI_IRQ_STATUS 0x58060028
#define HDMI_IRQ_LINK_CONNECT (1 << 25)
#define HDMI_IRQ_LINK_DISCONNECT (1 << 26)
About document:
There is not detailed information about hdmi in 11.3 High-Definition Multimedia Interface of am5728 TRM spruhz6i.pdf.
We find a little in 8168 TRM, but it's not enough to understand the details.
our question :
Who triggers HDMI_IRQ_LINK_CONNECT bit or HDMI_IRQ_LINK_DISCONNECT bit of HDMI_IRQ_STATUS in HDMI interrupt?
Is it HPD signal of HDMI?
Is there more detailed document about HDMI of am5728?
Thank you.