diff --git a/main.c b/main.c index 3747d8a..8f3d154 100644 --- a/main.c +++ b/main.c @@ -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 } }