read sink EDID

This commit is contained in:
King Kévin 2022-07-11 12:25:48 +02:00
parent 1770362588
commit 06c14750fc
1 changed files with 41 additions and 1 deletions

42
main.c
View File

@ -8,6 +8,7 @@
#include "stm8s.h"
#include "main.h"
#include "softi2c_master.h"
#define EEPROM_ADDR 0x4000 // EEPROM start address
// LED pin (sink for on)
@ -185,9 +186,48 @@ level pulse on the Hot Plug Detect pin. This pulse shall be at least 100 msec.
}
rim(); // re-enable interrupts
// even if we don't pull up HPD ourself, we should be able to respond to I²C within 20 ms
puts("I²C ready\r\n");
// read sink EDID
if (!i2c_fwd) { // ensure we are the only master on the I²C sink lines
IWDG_KR = IWDG_KR_KEY_REFRESH; // reset watchdog
puts("reading sink EDID: ");
softi2c_master_setup(100); // start the I²C master to talk to sink
bool i2c_success = false; // if the complete read succeeded
if (!softi2c_master_start()) { // start transaction
goto i2c_end;
}
if (!softi2c_master_select_slave(0x50, true)) { // select EDID
goto i2c_end;
}
const uint8_t edid_addr = 0x00; // EDID address to read
if (!softi2c_master_write(&edid_addr, 1)) { // write address to read
goto i2c_end;
}
if (!softi2c_master_start()) { // re-start transaction
goto i2c_end;
}
if (!softi2c_master_select_slave(0x50, false)) { // re-select EDID
goto i2c_end;
}
uint8_t edid_sink[256]; // buffer for sink EDID
if (!softi2c_master_read(edid_sink, ARRAY_LENGTH(edid_sink))) { // read EDID
goto i2c_end;
}
i2c_success = true; // complete read succeeded
i2c_end:
softi2c_master_stop();
if (i2c_success) {
puts("success\r\n");
} else {
puts("fail\r\n");
}
}
bool action = false; // if an action has been performed
LED_PORT->ODR.reg &= ~LED_PIN; // switch LED on to indicate we are ready
puts("ready\r\n");
puts("loop\r\n");
while (true) {
IWDG_KR = IWDG_KR_KEY_REFRESH; // reset watchdog
if (i2c_transaction_new) { // an I²C transaction started