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
14typedef 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
32typedef 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
52typedef struct {
53    uint8_t header[8];                          /* Header */
54    uint8_t id_mfg[2];                          /* ID Manfucturer 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 tranfser 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
76bool edid_has_extension(const uint8_t* edid_buf);
77zx_status_t edid_get_num_dtd(const uint8_t* edid_buf, uint8_t* num_dtd);
78zx_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);
80zx_status_t edid_parse_std_display_timing(const uint8_t* edid_buf, detailed_timing_t* raw_dtd,
81                                        disp_timing_t* disp_timing);