1 #ifndef DISPLAYID_H 2 #define DISPLAYID_H 3 4 /** 5 * Private header for the low-level DisplayID API. 6 */ 7 8 #include <stdbool.h> 9 #include <stddef.h> 10 #include <stdint.h> 11 12 #include <libdisplay-info/displayid.h> 13 14 #include "log.h" 15 16 /** 17 * The maximum number of data blocks in a DisplayID section. 18 * 19 * A DisplayID section has a payload size of 251 bytes, and each data block has 20 * a minimum size of 3 bytes. 21 */ 22 #define DISPLAYID_MAX_DATA_BLOCKS 83 23 /** 24 * The maximum number of type I timings in a data block. 25 * 26 * A DisplayID data block has a maximum payload size of 248 bytes, and each type 27 * I timing takes up 20 bytes. 28 */ 29 #define DISPLAYID_MAX_TYPE_I_TIMINGS 12 30 /** 31 * The maximum number of type II timings in a data block. 32 * 33 * A DisplayID data block has a maximum payload size of 248 bytes, and each type 34 * I timing takes up 11 bytes. 35 */ 36 #define DISPLAYID_MAX_TYPE_II_TIMINGS 22 37 /** 38 * The maxiumum number of type III timings in a data block. 39 * 40 * A DisplayID data block has a maximum payload size of 248 bytes, and each type 41 * III timing takes up 3 bytes. 42 */ 43 #define DISPLAYID_MAX_TYPE_III_TIMINGS 82 44 45 struct di_displayid { 46 int version, revision; 47 enum di_displayid_product_type product_type; 48 49 struct di_displayid_data_block *data_blocks[DISPLAYID_MAX_DATA_BLOCKS + 1]; 50 size_t data_blocks_len; 51 52 struct di_logger *logger; 53 }; 54 55 struct di_displayid_display_params_priv { 56 struct di_displayid_display_params base; 57 struct di_displayid_display_params_features features; 58 }; 59 60 struct di_displayid_tiled_topo_priv { 61 struct di_displayid_tiled_topo base; 62 struct di_displayid_tiled_topo_caps caps; 63 struct di_displayid_tiled_topo_bezel bezel; 64 }; 65 66 struct di_displayid_data_block { 67 enum di_displayid_data_block_tag tag; 68 69 /* Used for TYPE_I_TIMING, NULL-terminated */ 70 struct di_displayid_type_i_ii_vii_timing *type_i_timings[DISPLAYID_MAX_TYPE_I_TIMINGS + 1]; 71 size_t type_i_timings_len; 72 73 /* Used for TYPE_II_TIMING, NULL-terminated */ 74 struct di_displayid_type_i_ii_vii_timing *type_ii_timings[DISPLAYID_MAX_TYPE_II_TIMINGS + 1]; 75 size_t type_ii_timings_len; 76 77 /* Used for TYPE_III_TIMING, NULL-terminated */ 78 struct di_displayid_type_iii_timing *type_iii_timings[DISPLAYID_MAX_TYPE_III_TIMINGS + 1]; 79 size_t type_iii_timings_len; 80 81 /* Used for DISPLAY_PARAMS */ 82 struct di_displayid_display_params_priv display_params; 83 84 /* Used for TILED_DISPLAY_TOPO */ 85 struct di_displayid_tiled_topo_priv tiled_topo; 86 }; 87 88 bool 89 _di_displayid_parse(struct di_displayid *displayid, const uint8_t *data, 90 size_t size, struct di_logger *logger); 91 92 void 93 _di_displayid_finish(struct di_displayid *displayid); 94 95 bool 96 _di_displayid_parse_type_1_7_timing(struct di_displayid_type_i_ii_vii_timing *timing, 97 struct di_logger *logger, 98 const char *prefix, 99 const uint8_t *data, 100 bool is_type7); 101 102 #endif 103