[PATCH edid-decode v2 2/2] Report broken CEA and DisplayID checksums.

Mark Ferry mark at cognomen.co.uk
Mon Feb 6 13:51:59 UTC 2017


---
 edid-decode.c | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/edid-decode.c b/edid-decode.c
index 15660dc..95e9c96 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -50,6 +50,8 @@ static int name_descriptor_terminated = 0;
 static int has_range_descriptor = 0;
 static int has_preferred_timing = 0;
 static int has_valid_checksum = 1;
+static int has_valid_cea_checksum = 1;
+static int has_valid_displayid_checksum = 1;
 static int has_valid_cvt = 1;
 static int has_valid_dummy_block = 1;
 static int has_valid_week = 0;
@@ -1289,7 +1291,7 @@ parse_cea(unsigned char *x)
 		detailed_block(detailed, 1);
     } while (0);
 
-    do_checksum(x, EDID_PAGE_SIZE);
+    has_valid_cea_checksum = do_checksum(x, EDID_PAGE_SIZE);
 
     return ret;
 }
@@ -1380,7 +1382,11 @@ parse_displayid(unsigned char *x)
     int i;
     printf("Length %d, version %d, extension count %d\n", length, version, ext_count);
 
-    do_checksum(x+1, length + 5);
+    /* DisplayID length field is number of following bytes
+     * but checksum is calculated over the entire structure
+     * (excluding DisplayID-in-EDID magic byte)
+     */
+    has_valid_displayid_checksum = do_checksum(x+1, length + 5);
 
     int offset = 5;
     while (length > 0) {
@@ -2048,7 +2054,7 @@ int main(int argc, char **argv)
 	has_valid_extension_count = 1;
     }
 
-    do_checksum(edid, EDID_PAGE_SIZE);
+    has_valid_checksum = do_checksum(edid, EDID_PAGE_SIZE);
 
     x = edid;
     for (edid_lines /= 8; edid_lines > 1; edid_lines--) {
@@ -2142,6 +2148,15 @@ int main(int argc, char **argv)
 	    printf("\tEDID 1.4 block does not set max dotclock\n");
     }
 
+    if (!has_valid_cea_checksum) {
+        printf("CEA extension block does not conform\n");
+        printf("\tBlock has broken checksum\n");
+    }
+    if (!has_valid_displayid_checksum) {
+        printf("DisplayID extension block does not conform\n");
+        printf("\tBlock has broken checksum\n");
+    }
+
     if (warning_excessive_dotclock_correction)
 	printf("Warning: CVT block corrects dotclock by more than 9.75MHz\n");
     if (warning_zero_preferred_refresh)
-- 
Cognomen Ltd
http://cognomen.co.uk
+44 7855 790184
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <https://lists.x.org/archives/xorg-devel/attachments/20170206/c17e4928/attachment.sig>


More information about the xorg-devel mailing list