@@ -2474,7 +2474,7 @@ static void cta_block(const unsigned char *x)
static int parse_cta(const unsigned char *x)
{
- int ret = 0;
+ int ret = 0; // 0 = conformant
unsigned version = x[1];
unsigned offset = x[2];
const unsigned char *detailed;
@@ -2483,7 +2483,7 @@ static int parse_cta(const unsigned char *x)
if (version >= 1) do {
if (version == 1 && x[3] != 0)
- ret = 1;
+ ret = 1; // 1 = nonconformant
if (offset < 4)
break;
@@ -2866,28 +2866,72 @@ static void extension_version(const unsigned char *x)
static int parse_extension(const unsigned char *x)
{
- int conformant_extension = 0;
+ int nonconformant_extension = 0;
printf("\n");
switch (x[0]) {
- case 0x02: printf("CTA Extension Block\n");
- extension_version(x);
- conformant_extension = parse_cta(x);
- break;
- case 0x10: printf("VTB Extension Block\n"); break;
- case 0x40: printf("DI Extension Block\n"); break;
- case 0x50: printf("LS Extension Block\n"); break;
- case 0x60: printf("DPVL Extension Block\n"); break;
- case 0x70: printf("DisplayID Extension Block\n");
- conformant_extension = parse_displayid(x);
- break;
- case 0xf0: printf("Block map\n"); break;
- case 0xff: printf("Manufacturer-specific Extension Block\n"); break;
- default: printf("Unknown Extension Block\n"); break;
+ case 0x02:
+ printf("CTA Extension Block\n");
+ extension_version(x);
+ nonconformant_extension = parse_cta(x);
+ break;
+ case 0x10:
+ printf("VTB Extension Block\n");
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0x40:
+ printf("DI Extension Block\n");
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0x50:
+ printf("LS Extension Block\n");
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0x60:
+ printf("DPVL Extension Block\n");
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0x70:
+ printf("DisplayID Extension Block\n");
+ nonconformant_extension = parse_displayid(x);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0xf0:
+ printf("Block map\n");
+ printf(" ");
+ hex_block(x + 1, 126);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ case 0xff:
+ printf("Manufacturer-specific Extension Block\n");
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
+ default:
+ printf("Unknown Extension Block (%02Xh)\n", x[0]);
+ extension_version(x);
+ printf(" ");
+ hex_block(x + 2, 125);
+ do_checksum(x, EDID_PAGE_SIZE);
+ break;
}
- return conformant_extension;
+ return nonconformant_extension;
}
static int edid_lines = 0;
- Extension blocks that are not decoded will at least have their contents output as hex. With this, two EDIDs with different data in an undecoded extension block will not be considered equal. - For unknown extension blocks, include the Extension Block tag number. - Renamed conformant_extension to nonconformant_extension in parse_extension because boolean value of 1 = nonconformant according to return result of parse_cta and parse_displayid; matches interpretation in edid_from_file. Signed-off-by: Joe van Tunen <joevt@shaw.ca> --- edid-decode.c | 80 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 18 deletions(-)