1/*
2 * Copyright 2003, Thomas Kurschel. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _EDID_H
6#define _EDID_H
7
8//!	Extended Display Identification Data (EDID)
9
10#include "edid_raw.h"
11
12
13// vendor info
14typedef struct {
15	char manufacturer[4];
16	uint16 prod_id;
17	uint32 serial;
18	uint8 week;
19	uint16 year;
20} edid1_vendor;
21
22// version info
23typedef struct {
24	uint8 version;
25	uint8 revision;
26} edid1_version;
27
28// analog input parameters
29typedef struct {
30	uint8 input_voltage;	// 0=0.7V/0.3V, 1=0.714V/0.286,
31				// 2=1V/0.4V, 3=0.7V/0V
32	bool setup;		// true if voltage configurable
33	bool sep_sync;
34	bool comp_sync;
35	bool sync_on_green;
36	bool sync_serr;
37} edid1_analog_params;
38
39
40// digital input parameters
41typedef struct {
42	uint8 bit_depth;
43	uint8 interface;
44} edid1_digital_params;
45
46// display info
47typedef struct {
48	uint8 input_type;
49	edid1_analog_params analog_params;
50	edid1_digital_params digital_params;
51
52	uint8 h_size;
53	uint8 v_size;
54	uint8 gamma;	// (x+100)/100
55	BBITFIELD8_7 (
56		dpms_standby : 1,
57		dpms_suspend : 1,
58		dpms_off : 1,
59		display_type : 2,	// 0=mono, 1=rgb, 2=multicolour
60		// since EDID version 1.1
61		std_colour_space : 1,
62		preferred_timing_mode : 1,
63		gtf_supported : 1
64	);
65	uint16 red_x;		// all colours are 0.10 fixed point
66	uint16 red_y;
67	uint16 green_x;
68	uint16 green_y;
69	uint16 blue_x;
70	uint16 blue_y;
71	uint16 white_x;
72	uint16 white_y;
73} edid1_display;
74
75// standard timing data
76typedef struct {
77	uint16 h_size;
78	uint16 v_size;
79	uint16 id;
80	uint8 ratio;
81	uint8 refresh;
82} edid1_std_timing;
83
84// additional whitepoint
85typedef struct {
86	uint8 index;
87	uint16 white_x;
88	uint16 white_y;
89	uint8 gamma;	// (x+100)/100
90} edid1_whitepoint;
91
92// detailed timing description
93typedef struct {
94	uint16 pixel_clock; // in 10 kHz
95	uint16 h_active;
96	uint16 h_blank;
97	uint16 v_active;
98	uint16 v_blank;
99	uint16 h_sync_off;
100	uint16 h_sync_width;
101	uint16 v_sync_off;
102	uint16 v_sync_width;
103	uint16 h_size;
104	uint16 v_size;
105	uint16 h_border;
106	uint16 v_border;
107	BBITFIELD8_4 (
108		interlaced : 1,
109		stereo : 2,		// upper bit set - left on sync
110						// lower bit set - right on sync
111		sync : 2,
112		misc : 2
113	);
114} edid1_detailed_timing;
115
116// detailed monitor description
117typedef struct {
118	uint8 monitor_desc_type;
119	union {
120		char serial_number[EDID1_EXTRA_STRING_LEN];
121		char ascii_data[EDID1_EXTRA_STRING_LEN];
122		edid1_monitor_range monitor_range;
123		char monitor_name[EDID1_EXTRA_STRING_LEN];
124		edid1_whitepoint whitepoint[EDID1_NUM_EXTRA_WHITEPOINTS];
125		edid1_std_timing std_timing[EDID1_NUM_EXTRA_STD_TIMING];
126		edid1_detailed_timing detailed_timing;
127	} data;
128} edid1_detailed_monitor;
129
130// CTA data block
131typedef struct cta_info {
132	uint8 tag;
133	uint8 revision;
134	uint8 num_native_detailed;
135	bool ycbcr422_supported;
136	bool ycbcr444_supported;
137	bool audio_supported;
138	bool underscan;
139	edid1_detailed_timing detailed_timing[6];
140	uint8 num_data_blocks;
141	cta_data_block data_blocks[8];
142} cta_info;
143
144
145// DisplayID data block
146typedef struct displayid_info {
147	uint8 tag;
148	uint8 version;
149	uint8 extension_count;
150} displayid_info;
151
152// EDID data block
153typedef struct edid1_info {
154	edid1_vendor vendor;
155	edid1_version version;
156	edid1_display display;
157	edid1_established_timing established_timing;
158	edid1_std_timing std_timing[EDID1_NUM_STD_TIMING];
159
160	// since EDID version 1.2
161	edid1_detailed_monitor detailed_monitor[EDID1_NUM_DETAILED_MONITOR_DESC];
162
163	uint8 num_sections;
164
165	// optional
166	cta_info cta_block;
167	displayid_info displayid_block;
168} edid1_info;
169
170
171#define EDID_VERSION_1 1
172
173#ifdef __cplusplus
174extern "C" {
175#endif
176
177void edid_decode(edid1_info *edid, const edid1_raw *raw);
178void edid_dump(edid1_info *edid);
179
180#ifdef __cplusplus
181}
182#endif
183
184#endif	// _EDID_H
185