diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-04-22 00:35:53 -0300 | 
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2024-04-22 00:35:53 -0300 | 
| commit | 5f01c706267c595de92406a32e7f31ef5056c2d0 (patch) | |
| tree | d1e74ef54efc41ada622900fe3e2a50dee44a237 /deps/sysobj_early/include/util_edid.h | |
| parent | 09fcc751ef158898c315ebc9299a0fa3a722d914 (diff) | |
New upstream version 2.0.3preupstream/2.0.3pre
Diffstat (limited to 'deps/sysobj_early/include/util_edid.h')
| -rw-r--r-- | deps/sysobj_early/include/util_edid.h | 268 | 
1 files changed, 268 insertions, 0 deletions
| diff --git a/deps/sysobj_early/include/util_edid.h b/deps/sysobj_early/include/util_edid.h new file mode 100644 index 00000000..5bb4b932 --- /dev/null +++ b/deps/sysobj_early/include/util_edid.h @@ -0,0 +1,268 @@ +/* + * sysobj - https://github.com/bp0/verbose-spork + * Copyright (C) 2018  Burt P. <pburt0@gmail.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. + * + */ + +#ifndef __UTIL_EDID_H__ +#define __UTIL_EDID_H__ + +#define _GNU_SOURCE +#include <stdint.h>  /* for *int*_t types */ +#include <glib.h> + +typedef struct _edid edid; + +typedef struct { +    edid *e; +    uint32_t offset; +} edid_addy; + +/* OUI is stored in EDID as 24-bit little-endian, + * but lookup file from IEEE expects big-endian. + * .oui_str is .oui rendered into big-endian for + * easy lookup. */ +typedef struct { +    union { +        char pnp[7]; /* only needs 3+null */ +        char oui_str[7]; /* needs 6+null */ +    }; +    uint32_t oui; +    uint8_t type; /* enum VEN_TYPE_* */ +} edid_ven; + +typedef struct { +    char *str; +    uint16_t len; +    uint8_t is_product_name; +    uint8_t is_serial; +} DisplayIDString; + +typedef struct { +    uint8_t version; +    uint8_t extension_length; +    uint8_t primary_use_case; +    uint8_t extension_count; +    uint16_t blocks; +    uint8_t checksum_ok; +} DisplayIDMeta; + +typedef struct { +    edid_addy addy; +    union { +        uint8_t tag; +        uint8_t type; +    }; +    uint8_t revision; +    uint8_t len; +    uint8_t bounds_ok; + +    /* for vendor specific block */ +    edid_ven ven; +} DisplayIDBlock; + +typedef struct { +    edid_addy addy; +    uint8_t interface; +    uint8_t supports_hdcp; +    uint8_t exists; +} DIExtData; + +/* order by rising priority */ +enum { +    OUTSRC_INVALID = -1, +    OUTSRC_EDID    =  0, +    OUTSRC_ETB, +    OUTSRC_STD, +    OUTSRC_DTD, +    OUTSRC_CEA_DTD, +    OUTSRC_SVD, + +    OUTSRC_DID_TYPE_I, +    OUTSRC_DID_TYPE_VI, +    OUTSRC_DID_TYPE_VII, +}; + +typedef struct { +    float horiz_cm, vert_cm; +    float diag_cm, diag_in; +    int horiz_blanking, vert_blanking; +    int horiz_pixels, vert_lines, vert_pixels; +    float vert_freq_hz; +    uint8_t is_interlaced; +    uint8_t is_preferred; +    int stereo_mode; +    uint64_t pixel_clock_khz; +    int src; /* enum OUTSRC_* */ +    uint64_t pixels; /* h*v: easier to compare */ +    char class_inch[12]; +} edid_output; + +struct edid_std { +    uint8_t *ptr; +    edid_output out; +}; + +struct edid_dtd { +    edid_addy addy; +    uint8_t cea_ext; /* in a CEA block vs one of the regular EDID descriptors */ +    edid_output out; +    uint8_t bounds_ok; +}; + +struct edid_svd { +    uint8_t v; +    uint8_t is_native; +    edid_output out; +}; + +struct edid_sad { +    uint8_t v[3]; +    uint8_t format, channels, freq_bits; +    int depth_bits; /* format 1 */ +    int max_kbps;   /* formats 2-8 */ +}; + +struct edid_cea_block { +    edid_addy addy; +    int type, len; +    uint8_t bounds_ok; + +    /* for vendor specific block */ +    edid_ven ven; +}; + +struct edid_descriptor { +    edid_addy addy; +    uint8_t type; +    char text[14]; +}; + +struct edid_manf_date { +    uint8_t week; +    uint8_t is_model_year; /* ignore week */ +    uint16_t year; +    int std; /* enum STD_* */ +}; + +enum { +    VEN_TYPE_INVALID = 0, +    VEN_TYPE_PNP, +    VEN_TYPE_OUI, +}; + +enum { +    STD_EDID         = 0, +    STD_EEDID        = 1, +    STD_EIACEA861    = 2, +    STD_DISPLAYID    = 3, +    STD_DISPLAYID20  = 4, +}; + +typedef struct _edid { +    union { +        void* data; +        uint8_t* u8; +        uint16_t* u16; +    }; +    unsigned int len; + +    /* enum STD_* */ +    int std; + +    uint8_t ver_major, ver_minor; +    uint8_t checksum_ok; /* first 128-byte block only */ +    uint8_t ext_blocks, ext_blocks_ok, ext_blocks_fail; +    uint8_t *ext_ok; + +    int etb_count; +    edid_output etbs[24]; + +    int std_count; +    struct edid_std stds[8]; + +    int dtd_count; +    struct edid_dtd *dtds; + +    int cea_block_count; +    struct edid_cea_block *cea_blocks; + +    int svd_count; +    struct edid_svd *svds; + +    int sad_count; +    struct edid_sad *sads; + +    edid_ven ven; +    struct edid_descriptor d[4]; +    /* point into d[].text */ +    char *name; +    char *serial; +    char *ut1; +    char *ut2; + +    uint8_t a_or_d; /* 0 = analog, 1 = digital */ +    uint8_t interface; /* digital interface */ +    uint8_t bpc;       /* digital bpc */ +    uint16_t product; +    uint32_t n_serial; +    struct edid_manf_date dom; +    edid_output img; +    edid_output img_svd; +    edid_output img_max; +    uint32_t speaker_alloc_bits; + +    DIExtData di; + +    DisplayIDMeta did; +    int did_block_count; +    DisplayIDBlock *did_blocks; +    int did_string_count; +    DisplayIDString *did_strings; + +    int didt_count; +    edid_output *didts; + +    GString *msg_log; +} edid; +edid *edid_new(const char *data, unsigned int len); +edid *edid_new_from_hex(const char *hex_string); +edid *edid_new_from_file(const char *path); +void edid_free(edid *e); +char *edid_dump_hex(edid *e, int tabs, int breaks); + +const char *edid_standard(int std); +const char *edid_output_src(int src); +const char *edid_interface(int type); +const char *edid_di_interface(int type); +const char *edid_descriptor_type(int type); +const char *edid_ext_block_type(int type); +const char *edid_cea_block_type(int type); +const char *edid_cea_audio_type(int type); + +char *edid_output_describe(edid_output *out); +char *edid_base_descriptor_describe(struct edid_descriptor *d); +char *edid_dtd_describe(struct edid_dtd *dtd, int dump_bytes); +char *edid_cea_block_describe(struct edid_cea_block *blk); +char *edid_cea_audio_describe(struct edid_sad *sad); +char *edid_cea_speaker_allocation_describe(int bitfield, int short_version); +const char *edid_did_block_type(int type); +char *edid_did_block_describe(DisplayIDBlock *blk); + +char *edid_dump2(edid *e); + +#endif | 
