1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef __EDID_UTILS_H__ 6 #define __EDID_UTILS_H__ 7 8 #include "stdio.h" 9 10 #ifdef __cplusplus 11 extern "C" { 12 #endif 13 14 /* These match the EDID encoding for Standard Timing block */ 15 #define ASPECT_16_10 0 16 #define ASPECT_4_3 1 17 #define ASPECT_5_4 2 18 #define ASPECT_16_9 3 19 #define N_ASPECTS 4 20 21 /* Defines based on EDID and CEA-861D descriptions */ 22 #define EDID_HDR 0 23 #define EDID_MFG_EID 0x8 24 #define EDID_MFG_PROD_LO 0x0A 25 #define EDID_MFG_PROD_HI 0x0B 26 #define EDID_MFG_SERIAL 0x0C 27 #define EDID_MFG_WEEK 0x10 28 #define EDID_MFG_YEAR 0x11 29 #define EDID_VERSION 0x12 30 #define EDID_REVISION 0x13 31 #define EDID_VIDEO_IN 0x14 32 #define EDID_MAX_HSIZE 0x15 33 #define EDID_MAX_VSIZE 0x16 34 #define EDID_GAMMA 0x17 35 #define EDID_FEATURES 0x18 36 37 #define EDID_ESTTIME1 0x23 38 #define EDID_ESTTIME2 0x24 39 #define EDID_MFGTIME 0x25 40 /* Next two repeat 8 times for standard timings 1-8 */ 41 #define EDID_STDTIMEH 0x26 42 #define EDID_STDTIMEV 0x27 43 #define EDID_N_STDTIME 8 44 45 /* There are 4 DTD blocks in the EDID */ 46 #define EDID_DTD_BASE 0x36 47 #define EDID_N_DTDS 4 48 49 #define EDID_EXT_FLAG 0x7E 50 #define EDID_CSUM 0x7F 51 #define EDID_SIZE 0x80 52 53 #define EEXT_TAG 0 54 #define EEXT_REV 1 55 #define EEXT_SIZE 0x80 56 57 #define EEDID_SIZE (EDID_SIZE + EEXT_SIZE) 58 59 /* 2 byte standard timing structure */ 60 #define STDTIME_HBASE 248 61 #define STDTIME_HMULT 8 62 #define STDTIME_VASPECT_SHIFT 6 63 #define STDTIME_VREFMINUS60_MASK 0x3f 64 #define STDTIME_SIZE 2 65 66 /* 18 byte DTD structure */ 67 #define DTD_PCLK_LO 0 68 #define DTD_PCLK_HI 1 69 #define DTD_HA_LO 2 70 #define DTD_HBL_LO 3 71 #define DTD_HABL_HI 4 72 #define DTD_VA_LO 5 73 #define DTD_VBL_LO 6 74 #define DTD_VABL_HI 7 75 #define DTD_HSO_LO 8 76 #define DTD_HSW_LO 9 77 #define DTD_VSX_LO 10 78 #define DTD_HVSX_HI 11 79 #define DTD_HSIZE_LO 12 80 #define DTD_VSIZE_LO 13 81 #define DTD_HVSIZE_HI 14 82 #define DTD_HBORDER 15 83 #define DTD_VBORDER 16 84 #define DTD_FLAGS 17 85 #define DTD_SIZE 18 86 87 /* These apply when PCLK is zero */ 88 #define DTD_TYPETAG 3 89 #define DTD_STRING 5 90 #define DTD_MINV_HZ 5 91 #define DTD_MAXV_HZ 6 92 #define DTD_MINH_kHZ 7 93 #define DTD_MAXH_kHZ 8 94 #define DTD_MAXCLK_100kHZ 9 95 96 /* Types in the TYPETAG field */ 97 #define DTDTYPE_MANUF 0x0f 98 #define DTDTYPE_STDTIME 0xfa 99 #define DTDTYPE_COLPOINT 0xfb 100 #define DTDTYPE_NAME 0xfc 101 #define DTDTYPE_LIMITS 0xfd 102 #define DTDTYPE_STRING 0xfe 103 #define DTDTYPE_SERIAL 0xff 104 105 /* This is the CEA extension version 3 */ 106 #define CEA_TAG 0 107 #define CEA_REV 1 108 #define CEA_DTD_OFFSET 2 109 /* Next two are low nibble, high nibble of same byte */ 110 #define CEA_NATIVE_DTDS 3 111 #define CEA_SUPPORT 3 112 #define CEA_DBC_START 4 113 /* Last DBC is at [CEA_DTD_OFFSET]-1, first DTD is at [CEA_DTD_OFFSET] */ 114 /* Padding needs min of two (gives PCLK=00 in DTD) */ 115 #define CEA_LAST_PAD 125 116 #define CEA_END_PAD 126 117 #define CEA_CHECKSUM 127 118 119 /* Data Block Collections */ 120 /* Same byte: upper 3 bits tag, low five length */ 121 #define DBC_TAG_LENGTH 0 122 #define DBC_LEN_MASK 0x1f 123 #define DBC_TAG_SHIFT 5 124 #define DBC_ETAG 1 125 126 #define DBCA_FORMAT 0 127 #define DBCA_RATE 1 128 #define DBCA_INFO 2 129 #define DBCA_SIZE 3 130 131 #define DBCA_FMT_LPCM 1 132 133 #define DBCV_CODE 0 134 #define DBCV_SIZE 1 135 136 #define DBCVND_IEEE_LO 0 137 #define DBCVND_IEEE_MID 1 138 #define DBCVND_IEEE_HI 2 139 140 #define DBCVHDMI_CEC_LO 3 141 #define DBCVHDMI_CEC_HI 4 142 #define DBCVHDMI_SUPPORT 5 143 #define DBCVHDMI_MAXTMDS_5MHz 6 144 #define DBCVHDMI_LATFLAGS 7 145 #define DBCVHDMI_VLAT 8 146 #define DBCVHDMI_ALAT 9 147 #define DBCVHDMI_IVLAT 10 148 #define DBCVHDMI_IALAT 11 149 150 #define DBCSP_ALLOC 0 151 #define DBCSP_SIZE 3 152 153 #define DBC_TAG_AUDIO 1 154 #define DBC_TAG_VIDEO 2 155 #define DBC_TAG_VENDOR 3 156 #define DBC_TAG_SPEAKER 4 157 #define DBC_TAG_VESA 5 158 #define DBC_TAG_EXTENDED 7 159 160 #define DBC_ETAG_VCDB 0 161 #define DBC_ETAG_VENDOR_VDB 1 162 #define DBC_ETAG_COL 5 163 164 #define VCDB_TAG 0 165 #define VCDB_ETAG 1 166 #define VCDB_FLAGS 2 167 #define VCDB_S_PT(x) (((x)&0x30) >> 4) 168 #define VCDB_S_IT(x) (((x)&0x0C) >> 2) 169 #define VCDB_S_CE(x) (((x)&0x03)) 170 171 #define COL_TAG 0 172 #define COL_ETAG 1 173 #define COL_FLAGS 2 174 #define COL_META 3 175 176 /* Number of test EDID arrays available to get/show_test_edid */ 177 #define N_TEST_EDIDS 6 178 179 int edid_valid(const unsigned char *edid_data); 180 int edid_has_hdmi_info(const unsigned char *edid_data, int ext); 181 int edid_lpcm_support(const unsigned char *edid_data, int ext); 182 void show_edid_data(FILE *outfile, unsigned char *edid_data, int items, 183 int base); 184 void show_edid(FILE *outfile, unsigned char *edid_data, int ext); 185 int find_aspect(int h, int v); 186 int find_aspect_fromisize(unsigned char *edid_data); 187 extern char *aspect_to_str[]; 188 int get_test_edid(int n, unsigned char *dst); 189 int show_test_edid(FILE *outfile, int n); 190 191 /* Gets monitor name from EDID. 192 * Args: 193 * edid_data - EDID data. 194 * buf - buffer to store monitor name. 195 * buf_size - buffer size. 196 */ 197 int edid_get_monitor_name(const unsigned char *edid_data, char *buf, 198 unsigned int buf_size); 199 200 #ifdef __cplusplus 201 } /* extern "C" */ 202 #endif 203 204 #endif 205