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