[edid-decode] [PATCH 2/2] Calculate DisplayID checksums. Refactor do_checksum.
Mark Ferry
mark at cognomen.co.uk
Fri Dec 9 17:39:23 UTC 2016
---
edid-decode.c | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/edid-decode.c b/edid-decode.c
index c18697f..6df2b6e 100644
--- a/edid-decode.c
+++ b/edid-decode.c
@@ -47,6 +47,7 @@ static int has_range_descriptor = 0;
static int has_preferred_timing = 0;
static int has_valid_checksum = 1;
static int has_valid_cvt = 1;
+static int has_valid_displayid_checksum = 1;
static int has_valid_dummy_block = 1;
static int has_valid_week = 0;
static int has_valid_year = 0;
@@ -560,23 +561,27 @@ detailed_block(unsigned char *x, int in_extension)
return 1;
}
-static void
-do_checksum(unsigned char *x)
+static unsigned char
+do_checksum(unsigned char *x, size_t len)
{
- printf("Checksum: 0x%hx", x[0x7f]);
- {
- unsigned char sum = 0;
- int i;
- for (i = 0; i < 128; i++)
- sum += x[i];
- if (sum) {
- printf(" (should be 0x%hx)", (unsigned char)(x[0x7f] - sum));
- has_valid_checksum = 0;
- } else printf(" (valid)");
- }
+ unsigned char sum = 0;
+ int i;
+
+ printf("Checksum: 0x%hx", x[len -1]);
+
+ for (i = 0; i < len; i++)
+ sum += x[i];
+
+ if (sum) {
+ printf(" (should be 0x%hx)", (unsigned char)(x[len-1] - sum));
+ } else printf(" (valid)");
+
printf("\n");
+
+ return sum;
}
+
/* CEA extension */
static const char *
@@ -1281,7 +1286,7 @@ parse_cea(unsigned char *x)
detailed_block(detailed, 1);
} while (0);
- do_checksum(x);
+ (void) do_checksum(x, 128);
return ret;
}
@@ -1371,6 +1376,9 @@ parse_displayid(unsigned char *x)
int ext_count = x[4];
int i;
printf("Length %d, version %d, extension count %d\n", length, version, ext_count);
+
+ has_valid_displayid_checksum = (do_checksum(x+1, length + 5) == 0x0);
+
int offset = 5;
while (length > 0) {
int tag = x[offset];
@@ -2037,7 +2045,7 @@ int main(int argc, char **argv)
has_valid_extension_count = 1;
}
- do_checksum(edid);
+ (void) do_checksum(edid, 128);
x = edid;
for (edid_lines /= 8; edid_lines > 1; edid_lines--) {
@@ -2127,6 +2135,8 @@ int main(int argc, char **argv)
printf("\tInvalid detailed timing descriptor ordering\n");
if (!has_valid_range_descriptor)
printf("\tRange descriptor contains garbage\n");
+ if (!has_valid_displayid_checksum)
+ printf("\tBlock has broken DisplayID checksum\n");
if (!has_valid_max_dotclock)
printf("\tEDID 1.4 block does not set max dotclock\n");
}
--
2.5.0
More information about the xorg-devel
mailing list