main: print debug info

This commit is contained in:
King Kévin 2021-08-17 08:53:09 +02:00
parent 07e2df9fde
commit 1d78baf925
1 changed files with 22 additions and 0 deletions

22
main.c
View File

@ -119,31 +119,39 @@ structure shall also meet the requirements of CEA-861-D.
*/
static uint16_t edid_length(void)
{
puts("EDID check: ");
// check EDID 1.3/1.4 fixed pattern header
if (0x00 != edid[0] || 0xff != edid[1] || 0xff != edid[2] || 0xff != edid[3] || 0xff != edid[4] || 0xff != edid[5] || 0xff != edid[6] || 0x00 != edid[7]) {
puts("invalid header\r\n");
return 0;
}
if (1 == edid[18]) { // EDID 1.3/1.4 128-byte structure
if (checksum_ok(&edid[0], 128)) {
if (0 == edid[126]) { // no extension
puts("128 bytes\r\n");
return 128;
} else { // extension available
// the usual extension is CEA EDID Timing Extension (with extension tag 02), but we allow others
// no idea how more than 1 extension is supported
if (checksum_ok(&edid[128], 128)) {
puts("256 bytes (with extension)\r\n");
return 256;
} else {
puts("extension CRC error\r\n");
return 0; // EDID is broken
}
}
} else {
puts("CRC error\r\n");
return 0;
}
} else if (2 == edid[18]) { // EDID 2.0 256-byte structure
if (checksum_ok(&edid[0], 256)) {
puts("256 bytes (no extension)\r\n");
return 256;
} else {
puts("CRC error\r\n");
return 0;
}
}
@ -245,15 +253,23 @@ void main(void)
IWDG->PR.fields.PR = IWDG_PR_DIV256; // set prescale to longest time (1.02s)
IWDG->KR.fields.KEY = IWDG_KR_KEY_REFRESH; // reset watchdog
puts("\r\nCuVoodoo HDMI firewall programmer ready\r\n");
// erase saved EDID when button is pressed on boot
if (0 == (RW_BUTTON_PORT->IDR.reg & RW_BUTTON_PIN)) { // button is pressed while booting
for (uint16_t i = 0; i < ARRAY_LENGTH(edid); i++) {
edid[i] = 0; // create empty EDID
}
ram_eeprom_blockprog(edid, ARRAY_LENGTH(edid)); // erase EDID
puts("EEPROM EDID erased\r\n");
}
load_edid(); // load EDID from EEPROM
bool edid_valid = (0 != edid_length()); // verify if EDID is valid
if (edid_valid) {
puts("EEPROM EDID valid\r\n");
} else {
puts("EEPROM EDID not valid\r\n");
}
rim(); // re-enable interrupts
bool action = false; // if an action has been performed
@ -276,19 +292,24 @@ void main(void)
}
led_error = false; // reset error state
if (press_duration < 30) { // less than 3 sec
puts("read I²C EDID: ");
run_led_on(); // indicate we started
if (read_edid()) { // read EDID from I²C
puts(" OK\r\n");
edid_valid = (0 != edid_length()); // verify if EDID is valid
if (edid_valid) { // read EDID is valid
puts("I²C EDID valid\r\n");
IWDG_KR = IWDG_KR_KEY_REFRESH; // reset watchdog
led_error = !save_edid(); // save to EEPROM
IWDG_KR = IWDG_KR_KEY_REFRESH; // reset watchdog
} else { // read EDID is not valid
puts("I²C EDID not valid, reloading from EEPROM\r\n");
led_error = true; // indicate read error
load_edid(); // re-load EDID from EEPROM
edid_valid = (0 != edid_length()); // verify if EDID is valid
}
} else { // read error
puts("\r\n"); // error should have been printed
led_error = true; // indicate read error
load_edid(); // re-load EDID from EEPROM
edid_valid = (0 != edid_length()); // verify if EDID is valid
@ -299,6 +320,7 @@ void main(void)
if (edid_valid) {
led_error = !write_edid(); // write EDID to I²C EEPROM
} else {
puts("\r\n"); // error should have been printed
led_error = true; // we can't program an invalid EDID
}
}