blob: b43a6bc8da1172a5ffb48b367995577155567437 [file] [log] [blame]
// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef __EDID_UTILS_H__
#define __EDID_UTILS_H__
#include "stdio.h"
#ifdef __cplusplus
extern "C" {
#endif
/* These match the EDID encoding for Standard Timing block */
#define ASPECT_16_10 0
#define ASPECT_4_3 1
#define ASPECT_5_4 2
#define ASPECT_16_9 3
#define N_ASPECTS 4
/* Defines based on EDID and CEA-861D descriptions */
#define EDID_HDR 0
#define EDID_MFG_EID 0x8
#define EDID_MFG_PROD_LO 0x0A
#define EDID_MFG_PROD_HI 0x0B
#define EDID_MFG_SERIAL 0x0C
#define EDID_MFG_WEEK 0x10
#define EDID_MFG_YEAR 0x11
#define EDID_VERSION 0x12
#define EDID_REVISION 0x13
#define EDID_VIDEO_IN 0x14
#define EDID_MAX_HSIZE 0x15
#define EDID_MAX_VSIZE 0x16
#define EDID_GAMMA 0x17
#define EDID_FEATURES 0x18
#define EDID_ESTTIME1 0x23
#define EDID_ESTTIME2 0x24
#define EDID_MFGTIME 0x25
/* Next two repeat 8 times for standard timings 1-8 */
#define EDID_STDTIMEH 0x26
#define EDID_STDTIMEV 0x27
#define EDID_N_STDTIME 8
/* There are 4 DTD blocks in the EDID */
#define EDID_DTD_BASE 0x36
#define EDID_N_DTDS 4
#define EDID_EXT_FLAG 0x7E
#define EDID_CSUM 0x7F
#define EDID_SIZE 0x80
#define EEXT_TAG 0
#define EEXT_REV 1
#define EEXT_SIZE 0x80
#define EEDID_SIZE (EDID_SIZE + EEXT_SIZE)
/* 2 byte standard timing structure */
#define STDTIME_HBASE 248
#define STDTIME_HMULT 8
#define STDTIME_VASPECT_SHIFT 6
#define STDTIME_VREFMINUS60_MASK 0x3f
#define STDTIME_SIZE 2
/* 18 byte DTD structure */
#define DTD_PCLK_LO 0
#define DTD_PCLK_HI 1
#define DTD_HA_LO 2
#define DTD_HBL_LO 3
#define DTD_HABL_HI 4
#define DTD_VA_LO 5
#define DTD_VBL_LO 6
#define DTD_VABL_HI 7
#define DTD_HSO_LO 8
#define DTD_HSW_LO 9
#define DTD_VSX_LO 10
#define DTD_HVSX_HI 11
#define DTD_HSIZE_LO 12
#define DTD_VSIZE_LO 13
#define DTD_HVSIZE_HI 14
#define DTD_HBORDER 15
#define DTD_VBORDER 16
#define DTD_FLAGS 17
#define DTD_SIZE 18
/* These apply when PCLK is zero */
#define DTD_TYPETAG 3
#define DTD_STRING 5
#define DTD_MINV_HZ 5
#define DTD_MAXV_HZ 6
#define DTD_MINH_kHZ 7
#define DTD_MAXH_kHZ 8
#define DTD_MAXCLK_100kHZ 9
/* Types in the TYPETAG field */
#define DTDTYPE_MANUF 0x0f
#define DTDTYPE_STDTIME 0xfa
#define DTDTYPE_COLPOINT 0xfb
#define DTDTYPE_NAME 0xfc
#define DTDTYPE_LIMITS 0xfd
#define DTDTYPE_STRING 0xfe
#define DTDTYPE_SERIAL 0xff
/* This is the CEA extension version 3 */
#define CEA_TAG 0
#define CEA_REV 1
#define CEA_DTD_OFFSET 2
/* Next two are low nibble, high nibble of same byte */
#define CEA_NATIVE_DTDS 3
#define CEA_SUPPORT 3
#define CEA_DBC_START 4
/* Last DBC is at [CEA_DTD_OFFSET]-1, first DTD is at [CEA_DTD_OFFSET] */
/* Padding needs min of two (gives PCLK=00 in DTD) */
#define CEA_LAST_PAD 125
#define CEA_END_PAD 126
#define CEA_CHECKSUM 127
/* Data Block Collections */
/* Same byte: upper 3 bits tag, low five length */
#define DBC_TAG_LENGTH 0
#define DBC_LEN_MASK 0x1f
#define DBC_TAG_SHIFT 5
#define DBC_ETAG 1
#define DBCA_FORMAT 0
#define DBCA_RATE 1
#define DBCA_INFO 2
#define DBCA_SIZE 3
#define DBCA_FMT_LPCM 1
#define DBCV_CODE 0
#define DBCV_SIZE 1
#define DBCVND_IEEE_LO 0
#define DBCVND_IEEE_MID 1
#define DBCVND_IEEE_HI 2
#define DBCVHDMI_CEC_LO 3
#define DBCVHDMI_CEC_HI 4
#define DBCVHDMI_SUPPORT 5
#define DBCVHDMI_MAXTMDS_5MHz 6
#define DBCVHDMI_LATFLAGS 7
#define DBCVHDMI_VLAT 8
#define DBCVHDMI_ALAT 9
#define DBCVHDMI_IVLAT 10
#define DBCVHDMI_IALAT 11
#define DBCSP_ALLOC 0
#define DBCSP_SIZE 3
#define DBC_TAG_AUDIO 1
#define DBC_TAG_VIDEO 2
#define DBC_TAG_VENDOR 3
#define DBC_TAG_SPEAKER 4
#define DBC_TAG_VESA 5
#define DBC_TAG_EXTENDED 7
#define DBC_ETAG_VCDB 0
#define DBC_ETAG_VENDOR_VDB 1
#define DBC_ETAG_COL 5
#define VCDB_TAG 0
#define VCDB_ETAG 1
#define VCDB_FLAGS 2
#define VCDB_S_PT(x) (((x)&0x30) >> 4)
#define VCDB_S_IT(x) (((x)&0x0C) >> 2)
#define VCDB_S_CE(x) (((x)&0x03))
#define COL_TAG 0
#define COL_ETAG 1
#define COL_FLAGS 2
#define COL_META 3
/* Number of test EDID arrays available to get/show_test_edid */
#define N_TEST_EDIDS 6
int edid_valid(const unsigned char *edid_data);
int edid_has_hdmi_info(const unsigned char *edid_data, int ext);
int edid_lpcm_support(const unsigned char *edid_data, int ext);
void show_edid_data(FILE *outfile, unsigned char *edid_data, int items,
int base);
void show_edid(FILE *outfile, unsigned char *edid_data, int ext);
int find_aspect(int h, int v);
int find_aspect_fromisize(unsigned char *edid_data);
extern char *aspect_to_str[];
int get_test_edid(int n, unsigned char *dst);
int show_test_edid(FILE *outfile, int n);
/* Gets monitor name from EDID.
* Args:
* edid_data - EDID data.
* buf - buffer to store monitor name.
* buf_size - buffer size.
*/
int edid_get_monitor_name(const unsigned char *edid_data, char *buf,
unsigned int buf_size);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif