diff options
author | Jernej Skrabec <jernej.skrabec@siol.net> | 2017-04-29 14:43:36 +0200 |
---|---|---|
committer | Anatolij Gustschin <agust@denx.de> | 2017-05-15 20:32:12 +0200 |
commit | 43c6bdd0209ca31be84d572278485ed604582730 (patch) | |
tree | 36079aa166a2ef266c016b38fcb8e4f14109968f /common | |
parent | dc8cae4df3c016cbcb6eb8a841a7a94ff36b9e0b (diff) | |
download | u-boot-43c6bdd0209ca31be84d572278485ed604582730.tar.gz u-boot-43c6bdd0209ca31be84d572278485ed604582730.tar.bz2 u-boot-43c6bdd0209ca31be84d572278485ed604582730.zip |
edid: Add HDMI flag to timing info
Some DVI monitors don't show anything in HDMI mode since audio stream
confuses them. To solve this situation, this commit adds HDMI flag in
timing data and sets it accordingly during edid parsing.
First existence of extension block is checked. If it exists and it is
CEA861 extension, then data blocks are checked for presence of HDMI
vendor specific data block. If it is present, HDMI flag is set.
Signed-off-by: Jernej Skrabec <jernej.skrabec@siol.net>
Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/edid.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/common/edid.c b/common/edid.c index ab7069fdcd..19410aa4fc 100644 --- a/common/edid.c +++ b/common/edid.c @@ -136,6 +136,39 @@ static void decode_timing(u8 *buf, struct display_timing *timing) va + vbl, vborder); } +/** + * Check if HDMI vendor specific data block is present in CEA block + * @param info CEA extension block + * @return true if block is found + */ +static bool cea_is_hdmi_vsdb_present(struct edid_cea861_info *info) +{ + u8 end, i = 0; + + /* check for end of data block */ + end = info->dtd_offset; + if (end == 0) + end = 127; + if (end < 4 || end > 127) + return false; + end -= 4; + + while (i < end) { + /* Look for vendor specific data block of appropriate size */ + if ((EDID_CEA861_DB_TYPE(*info, i) == EDID_CEA861_DB_VENDOR) && + (EDID_CEA861_DB_LEN(*info, i) >= 5)) { + u8 *db = &info->data[i + 1]; + u32 oui = db[0] | (db[1] << 8) | (db[2] << 16); + + if (oui == HDMI_IEEE_OUI) + return true; + } + i += EDID_CEA861_DB_LEN(*info, i) + 1; + } + + return false; +} + int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, int *panel_bits_per_colourp) { @@ -181,6 +214,15 @@ int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, ((edid->video_input_definition & 0x70) >> 3) + 4; } + timing->hdmi_monitor = false; + if (edid->extension_flag && (buf_size >= EDID_EXT_SIZE)) { + struct edid_cea861_info *info = + (struct edid_cea861_info *)(buf + sizeof(*edid)); + + if (info->extension_tag == EDID_CEA861_EXTENSION_TAG) + timing->hdmi_monitor = cea_is_hdmi_vsdb_present(info); + } + return 0; } |