• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef EDID_H
2 #define EDID_H
3 
4 /**
5  * Private header for the low-level EDID API.
6  */
7 
8 #include <stdbool.h>
9 #include <stdint.h>
10 #include <stdio.h>
11 
12 #include <libdisplay-info/edid.h>
13 
14 #include "cta.h"
15 #include "displayid.h"
16 
17 /**
18  * The maximum number of EDID blocks (including the base block), defined in
19  * section 2.2.1.
20  */
21 #define EDID_MAX_BLOCK_COUNT 256
22 /**
23  * The maximum number of EDID standard timings, defined in section 3.9.
24  */
25 #define EDID_MAX_STANDARD_TIMING_COUNT 8
26 /**
27  * The number of EDID byte descriptors, defined in section 3.10.
28  */
29 #define EDID_BYTE_DESCRIPTOR_COUNT 4
30 /**
31  * The size of an EDID byte descriptor, defined in section 3.10.
32  */
33 #define EDID_BYTE_DESCRIPTOR_SIZE 18
34 /**
35  * The maximum number of standard timings in an EDID display descriptor, defined
36  * in section 3.10.3.6.
37  */
38 #define EDID_MAX_DESCRIPTOR_STANDARD_TIMING_COUNT 6
39 /**
40  * The maximum number of color points in an EDID color point descriptor, defined
41  * in section 3.10.3.5.
42  */
43 #define EDID_MAX_DESCRIPTOR_COLOR_POINT_COUNT 2
44 /**
45  * The maximum number of established timings III in an EDID display descriptor,
46  * defined in section 3.10.3.9.
47  */
48 #define EDID_MAX_DESCRIPTOR_ESTABLISHED_TIMING_III_COUNT 44
49 /**
50  * The maximum number of CVT timing codes in an EDID display descriptor,
51  * defined in section 3.10.3.8.
52  */
53 #define EDID_MAX_DESCRIPTOR_CVT_TIMING_CODES_COUNT 4
54 
55 struct di_edid_detailed_timing_def_priv {
56 	struct di_edid_detailed_timing_def base;
57 	struct di_edid_detailed_timing_analog_composite analog_composite;
58 	struct di_edid_detailed_timing_bipolar_analog_composite bipolar_analog_composite;
59 	struct di_edid_detailed_timing_digital_composite digital_composite;
60 	struct di_edid_detailed_timing_digital_separate digital_separate;
61 };
62 
63 struct di_edid {
64 	struct di_edid_vendor_product vendor_product;
65 	int version, revision;
66 
67 	bool is_digital;
68 	struct di_edid_video_input_analog video_input_analog;
69 	struct di_edid_video_input_digital video_input_digital;
70 	struct di_edid_screen_size screen_size;
71 	float gamma;
72 	struct di_edid_dpms dpms;
73 	enum di_edid_display_color_type display_color_type;
74 	struct di_edid_color_encoding_formats color_encoding_formats;
75 	struct di_edid_misc_features misc_features;
76 
77 	struct di_edid_chromaticity_coords chromaticity_coords;
78 	struct di_edid_established_timings_i_ii established_timings_i_ii;
79 
80 	/* NULL-terminated */
81 	struct di_edid_standard_timing *standard_timings[EDID_MAX_STANDARD_TIMING_COUNT + 1];
82 	size_t standard_timings_len;
83 
84 	/* NULL-terminated */
85 	struct di_edid_detailed_timing_def_priv *detailed_timing_defs[EDID_BYTE_DESCRIPTOR_COUNT + 1];
86 	size_t detailed_timing_defs_len;
87 
88 	/* NULL-terminated */
89 	struct di_edid_display_descriptor *display_descriptors[EDID_BYTE_DESCRIPTOR_COUNT + 1];
90 	size_t display_descriptors_len;
91 
92 	/* NULL-terminated, doesn't include the base block */
93 	struct di_edid_ext *exts[EDID_MAX_BLOCK_COUNT];
94 	size_t exts_len;
95 
96 	struct di_logger *logger;
97 };
98 
99 struct di_edid_display_range_limits_priv {
100 	struct di_edid_display_range_limits base;
101 	struct di_edid_display_range_limits_secondary_gtf secondary_gtf;
102 	struct di_edid_display_range_limits_cvt cvt;
103 };
104 
105 struct di_edid_display_descriptor {
106 	enum di_edid_display_descriptor_tag tag;
107 	/* Used for PRODUCT_SERIAL, DATA_STRING and PRODUCT_NAME,
108 	 * zero-terminated */
109 	char str[14];
110 	/* Used for RANGE_LIMITS */
111 	struct di_edid_display_range_limits_priv range_limits;
112 	/* Used for STD_TIMING_IDS, NULL-terminated */
113 	struct di_edid_standard_timing *standard_timings[EDID_MAX_DESCRIPTOR_STANDARD_TIMING_COUNT + 1];
114 	size_t standard_timings_len;
115 	/* Used for COLOR_POINT, NULL-terminated */
116 	struct di_edid_color_point *color_points[EDID_MAX_DESCRIPTOR_COLOR_POINT_COUNT + 1];
117 	size_t color_points_len;
118 	/* Used for ESTABLISHED_TIMINGS_III, NULL-terminated */
119 	const struct di_dmt_timing *established_timings_iii[EDID_MAX_DESCRIPTOR_ESTABLISHED_TIMING_III_COUNT + 1];
120 	size_t established_timings_iii_len;
121 	/* Used for DCM_DATA */
122 	struct di_edid_color_management_data dcm_data;
123 	/* Used for CVT_TIMING_CODES, NULL-terminated */
124 	struct di_edid_cvt_timing_code *cvt_timing_codes[EDID_MAX_DESCRIPTOR_CVT_TIMING_CODES_COUNT + 1];
125 	size_t cvt_timing_codes_len;
126 };
127 
128 struct di_edid_ext {
129 	enum di_edid_ext_tag tag;
130 	/* Used for DI_EDID_EXT_CEA */
131 	struct di_edid_cta cta;
132 	/* Used for DI_EDID_EXT_DISPLAYID */
133 	struct di_displayid displayid;
134 };
135 
136 /**
137  * Create an EDID data structure.
138  *
139  * Callers do not need to keep the provided data pointer valid after calling
140  * this function. Callers should destroy the returned pointer via
141  * di_edid_destroy().
142  */
143 struct di_edid *
144 _di_edid_parse(const void *data, size_t size, FILE *failure_msg_file);
145 
146 /**
147  * Destroy an EDID data structure.
148  */
149 void
150 _di_edid_destroy(struct di_edid *edid);
151 
152 /**
153  * Parse an EDID detailed timing definition.
154  */
155 struct di_edid_detailed_timing_def_priv *
156 _di_edid_parse_detailed_timing_def(const uint8_t data[static EDID_BYTE_DESCRIPTOR_SIZE]);
157 
158 #endif
159