1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #include <ddk/device.h>
8 #include <ddk/io-buffer.h>
9 #include <ddk/protocol/platform/device.h>
10 #include <zircon/listnode.h>
11 #include <zircon/types.h>
12 #include <threads.h>
13 
14 typedef struct {
15     uint16_t pixel_clk;
16     uint16_t HActive;
17     uint16_t HBlanking;
18     uint16_t VActive;
19     uint16_t VBlanking;
20     uint16_t HSyncOffset;
21     uint16_t HSyncPulseWidth;
22     uint8_t VSyncOffset;
23     uint8_t VSyncPulseWidth;
24     uint16_t HImageSize;
25     uint16_t VImageSize;
26     uint8_t HBorder;
27     uint8_t VBorder;
28     uint8_t Flags;
29     uint8_t align[9];
30 } __attribute__((__packed__)) disp_timing_t;
31 
32 typedef struct {
33     uint8_t raw_pixel_clk[2];                       /* LSB first */
34     uint8_t raw_Hact;
35     uint8_t raw_HBlank;
36     uint8_t raw_Hact_HBlank;
37     uint8_t raw_Vact;
38     uint8_t raw_VBlank;
39     uint8_t raw_Vact_VBlank;
40     uint8_t raw_HSyncOff;
41     uint8_t raw_HSyncPW;
42     uint8_t raw_VSyncOff_VSyncPW;
43     uint8_t raw_HSync_VSync_OFF_PW;
44     uint8_t raw_HImageSize;
45     uint8_t raw_VImageSize;
46     uint8_t raw_H_V_ImageSize;
47     uint8_t raw_HBorder;
48     uint8_t raw_VBorder;
49     uint8_t raw_Flags;
50 } detailed_timing_t;
51 
52 typedef struct {
53     uint8_t header[8];                          /* Header */
54     uint8_t id_mfg[2];                          /* ID Manufacturer Name */
55     uint8_t id_pcode[2];                        /* ID Produce Code */
56     uint8_t id_serial[4];                       /* ID Serial Number */
57     uint8_t wom;                                /* Week of Manufacture */
58     uint8_t yom;                                /* Year of Manufacture */
59     uint8_t version;                            /* Version #*/
60     uint8_t revision;                           /* Revision */
61     uint8_t vid_input_def;                      /* Video Input Definition */
62     uint8_t max_hoz_img_size;                   /* cm */
63     uint8_t max_ver_img_size;                   /* cm */
64     uint8_t gamma;                              /* Display transfer characteristics */
65     uint8_t feature_support;
66     uint8_t color_char[10];                     /* Color Characteristics */
67     uint8_t established_timings1;
68     uint8_t established_timings2;
69     uint8_t mfg_reserved_timings;
70     uint8_t std_timing_id[16];
71     detailed_timing_t detailed_timing_desc[4];  /* 4 x 18B*/
72     uint8_t ext_flag;
73     uint8_t cksum;
74 } edid_t;
75 
76 bool edid_has_extension(const uint8_t* edid_buf);
77 zx_status_t edid_get_num_dtd(const uint8_t* edid_buf, uint8_t* num_dtd);
78 zx_status_t edid_parse_display_timing(const uint8_t* edid_buf, detailed_timing_t* raw_dtd,
79                                         disp_timing_t* disp_timing, uint8_t num_dtd);
80 zx_status_t edid_parse_std_display_timing(const uint8_t* edid_buf, detailed_timing_t* raw_dtd,
81                                         disp_timing_t* disp_timing);
82