• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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