From a9403e7f461d17a1b101a405853ca1fc4c4f4b6c Mon Sep 17 00:00:00 2001 From: Hans Verkuil Date: Mon, 11 Jan 2021 11:02:43 +0100 Subject: edid-decode: incorporated DisplayID v2.0 Errata E7 changes Added support for Display Device Theme Preference. Signed-off-by: Hans Verkuil --- edid-decode.1 | 2 ++ edid-decode.h | 2 +- parse-displayid-block.cpp | 20 +++++++++++++++----- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/edid-decode.1 b/edid-decode.1 index a481b7c..58e81bf 100644 --- a/edid-decode.1 +++ b/edid-decode.1 @@ -113,6 +113,8 @@ DisplayID 1.3: VESA Display Identification Data (DisplayID) Standard, Version 1. .TP DisplayID 2.0: VESA DisplayID Standard, Version 2.0 .TP +DisplayID 2.0: VESA DisplayID v2.0 Errata E7 +.TP DI-EXT: VESA Display Information Extension Block Standard, Release A .TP LS-EXT: VESA Enhanced EDID Localized String Extension Standard, Release A diff --git a/edid-decode.h b/edid-decode.h index 2f3589e..faa65c2 100644 --- a/edid-decode.h +++ b/edid-decode.h @@ -298,7 +298,7 @@ struct edid_state { std::string product_type(unsigned char x, bool heading); void parse_displayid_interface_features(const unsigned char *x); void parse_displayid_parameters(const unsigned char *x); - void parse_displayid_parameters_v2(const unsigned char *x); + void parse_displayid_parameters_v2(const unsigned char *x, unsigned block_rev); void parse_displayid_display_intf(const unsigned char *x); void parse_displayid_color_characteristics(const unsigned char *x); void parse_displayid_transfer_characteristics(const unsigned char *x); diff --git a/parse-displayid-block.cpp b/parse-displayid-block.cpp index 96c8191..312b9c3 100644 --- a/parse-displayid-block.cpp +++ b/parse-displayid-block.cpp @@ -1084,10 +1084,9 @@ static std::string ieee7542d(unsigned short fp) // tag 0x21 -void edid_state::parse_displayid_parameters_v2(const unsigned char *x) +void edid_state::parse_displayid_parameters_v2(const unsigned char *x, + unsigned block_rev) { - check_displayid_datablock_revision(x[1]); - if (!check_displayid_datablock_length(x, 29, 29)) return; @@ -1145,7 +1144,9 @@ void edid_state::parse_displayid_parameters_v2(const unsigned char *x) printf(" Native Minimum Luminance: %s\n", ieee7542d(x[0x1c] | (x[0x1d] << 8)).c_str()); printf(" Native Color Depth: "); - if (bpc444[x[0x1e] & 0x07]) + if (!(x[0x1e] & 0x07)) + printf("Not defined\n"); + else if (bpc444[x[0x1e] & 0x07]) printf("%s bpc\n", bpc444[x[0x1e] & 0x07]); else printf("Reserved\n"); @@ -1156,6 +1157,9 @@ void edid_state::parse_displayid_parameters_v2(const unsigned char *x) case 0x02: printf("Organic LED\n"); break; default: printf("Reserved\n"); break; } + if (block_rev) + printf(" Display Device Theme Preference: %s\n", + (x[0x1e] & 0x80) ? "Dark Theme Preferred" : "No Preference"); if (x[0x1f] != 0xff) printf(" Native Gamma EOTF: %.2f\n", (100 + x[0x1f]) / 100.0); @@ -1733,7 +1737,13 @@ void edid_state::parse_displayid_block(const unsigned char *x) parse_displayid_type_6_timing(&x[offset + 3 + i]); break; case 0x20: parse_displayid_product_id(x + offset); break; - case 0x21: parse_displayid_parameters_v2(x + offset); break; + case 0x21: + if (block_rev >= 1) + check_displayid_datablock_revision(x[offset + 1], 0x80, 1); + else + check_displayid_datablock_revision(x[offset + 1], 0x80, 0); + parse_displayid_parameters_v2(x + offset, block_rev); + break; case 0x22: { unsigned sz = 20; -- cgit v1.2.1