check if HPD is forwarded
This commit is contained in:
parent
06c14750fc
commit
2859bb7a09
43
main.c
43
main.c
|
@ -26,6 +26,7 @@ static bool i2c_fwd = false; // if the I²C source lines are connected to sink
|
||||||
// hot plug detect pull up
|
// hot plug detect pull up
|
||||||
#define HPD_PORT GPIO_PC
|
#define HPD_PORT GPIO_PC
|
||||||
#define HPD_PIN PC6
|
#define HPD_PIN PC6
|
||||||
|
static bool hpd_fwd = false; // if the I²C source line is connected to sink
|
||||||
// copy EDID setting
|
// copy EDID setting
|
||||||
#define EDID_PORT GPIO_PC
|
#define EDID_PORT GPIO_PC
|
||||||
#define EDID_PIN PC7
|
#define EDID_PIN PC7
|
||||||
|
@ -136,13 +137,16 @@ void main(void)
|
||||||
SCL_PU_PORT->ODR.reg |= SCL_PU_PIN; // pull up SCL line
|
SCL_PU_PORT->ODR.reg |= SCL_PU_PIN; // pull up SCL line
|
||||||
}
|
}
|
||||||
|
|
||||||
// configure external EEPROM (actually not used)
|
|
||||||
WP_PORT->DDR.reg |= WP_PIN; // switch pin to output
|
|
||||||
WP_PORT->CR1.reg &= ~WP_PIN; // switch pin to open drain
|
|
||||||
WP_PORT->ODR.reg |= WP_PIN; // let write protect pulled up
|
|
||||||
|
|
||||||
// configure I²C
|
// configure I²C
|
||||||
if (!i2c_fwd) { // we will act as I²C slave EEPROM
|
if (!i2c_fwd) { // we will act as I²C slave EEPROM
|
||||||
|
/*
|
||||||
|
HDMI 1.3 spec:
|
||||||
|
The Sink shall be capable of responding with EDID 1.3 data and up to 255 extension blocks, each 128 bytes long (up to 32K bytes total E-EDID memory) whenever the Hot Plug Detect signal is asserted.
|
||||||
|
The Sink should be capable of providing E-EDID information over the Enhanced DDC channel whenever the +5V Power signal is provided. This should be available within 20msec after the +5V Power signal is provided.
|
||||||
|
|
||||||
|
firewall:
|
||||||
|
we will only be able to provide 1 extension block since we can only respond to one I²C address 0x50 for the EDID, and not to the 0x30 Segment Pointer (for the other pages/extension blocks)
|
||||||
|
*/
|
||||||
GPIO_PB->CR1.reg |= (PB4 | PB5); // enable internal pull-up on SCL/SDA
|
GPIO_PB->CR1.reg |= (PB4 | PB5); // enable internal pull-up on SCL/SDA
|
||||||
GPIO_PB->DDR.reg &= ~(PB4 | PB5); // set SCL/SDA as input before it is used as alternate function by the peripheral
|
GPIO_PB->DDR.reg &= ~(PB4 | PB5); // set SCL/SDA as input before it is used as alternate function by the peripheral
|
||||||
I2C_CR1 |= I2C_CR1_PE; // enable I²C peripheral (must be done before any other register is written)
|
I2C_CR1 |= I2C_CR1_PE; // enable I²C peripheral (must be done before any other register is written)
|
||||||
|
@ -159,20 +163,25 @@ void main(void)
|
||||||
I2C_ITR |= (I2C_ITR_ITBUFEN | I2C_ITR_ITEVTEN); // enable buffer and event interrupts
|
I2C_ITR |= (I2C_ITR_ITBUFEN | I2C_ITR_ITEVTEN); // enable buffer and event interrupts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// configure external EEPROM (actually not used)
|
||||||
|
WP_PORT->DDR.reg |= WP_PIN; // switch pin to output
|
||||||
|
WP_PORT->CR1.reg &= ~WP_PIN; // switch pin to open drain
|
||||||
|
WP_PORT->ODR.reg |= WP_PIN; // let write protect pulled up
|
||||||
|
|
||||||
// configure hot plug detect
|
// configure hot plug detect
|
||||||
HPD_PORT->DDR.reg |= HPD_PIN; // switch pin to output
|
HPD_PORT->DDR.reg |= HPD_PIN; // switch pin to output
|
||||||
HPD_PORT->CR1.reg |= HPD_PIN; // switch pin to push pull
|
HPD_PORT->CR1.reg &= ~HPD_PIN; // switch pin to open drain
|
||||||
HPD_PORT->ODR.reg |= HPD_PIN; // pull up HPD line to indicate EDID is ready
|
HPD_PORT->ODR.reg &= ~HPD_PIN; // drain line
|
||||||
// TODO check if connected to sink/monitor
|
wait_10us(0); // wait shortly to clear tristate
|
||||||
|
HPD_PORT->DDR.reg &= ~HPD_PIN; // switch pin to input (already floating)
|
||||||
/*
|
if (HPD_PORT->IDR.reg & HPD_PIN) { // line is pulled up
|
||||||
The Sink shall be capable of responding with EDID 1.3 data and up to 255 extension blocks, each
|
hpd_fwd = true; // remember the HPD line is pulled up
|
||||||
128 bytes long (up to 32K bytes total E-EDID memory) whenever the Hot Plug Detect signal is
|
}
|
||||||
asserted.
|
if (!hpd_fwd) { // we have to pull up
|
||||||
The Sink should be capable of providing E-EDID information over the Enhanced DDC channel
|
HPD_PORT->DDR.reg |= HPD_PIN; // switch pin to output
|
||||||
whenever the +5V Power signal is provided. This should be available within 20msec after the +5V
|
HPD_PORT->CR1.reg |= HPD_PIN; // switch pin to push pull
|
||||||
Power signal is provided.
|
HPD_PORT->ODR.reg |= HPD_PIN; // pull up HPD line to indicate EDID is ready
|
||||||
*/
|
}
|
||||||
|
|
||||||
// check if EDID should be copied
|
// check if EDID should be copied
|
||||||
EDID_PORT->DDR.reg &= ~EDID_PIN; // switch pin to output
|
EDID_PORT->DDR.reg &= ~EDID_PIN; // switch pin to output
|
||||||
|
|
Loading…
Reference in New Issue