summaryrefslogtreecommitdiff
path: root/cras/src/common/edid_utils.h
blob: b43a6bc8da1172a5ffb48b367995577155567437 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// 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