#ifndef _EDID_RAW_H
#define _EDID_RAW_H
#include "bendian_bitfield.h"
#define EDID1_NUM_DETAILED_MONITOR_DESC 4
#define EDID1_NUM_STD_TIMING 8
#define EDID1_NUM_EXTRA_STD_TIMING 6
#define EDID1_EXTRA_STRING_LEN 13
#define EDID1_NUM_EXTRA_WHITEPOINTS 2
typedef struct _PACKED {
int8 pad[8];
} edid1_header_raw;
typedef struct _PACKED {
BBITFIELD8_3 (
pad : 1,
c1 : 5,
c2_high : 2
);
BBITFIELD8_2 (
c2_low : 3,
c3 : 5
);
uint16 prod_id;
uint32 serial;
uint8 week;
uint8 year;
} edid1_vendor_raw;
typedef struct _PACKED {
uint8 version;
uint8 revision;
} edid1_version_raw;
typedef struct _PACKED {
BBITFIELD8_7 (
input_type : 1,
input_voltage : 2,
setup : 1,
sep_sync : 1,
comp_sync : 1,
sync_on_green : 1,
sync_serr : 1
);
} edid1_analog_params_raw;
typedef struct _PACKED {
BBITFIELD8_3 (
input_type : 1,
bit_depth : 3,
interface : 4
);
} edid1_digital_params_raw;
typedef struct _PACKED {
union {
edid1_analog_params_raw analog_params;
edid1_digital_params_raw digital_params;
};
uint8 h_size;
uint8 v_size;
uint8 gamma;
BBITFIELD8_7 (
dpms_standby : 1,
dpms_suspend : 1,
dpms_off : 1,
display_type : 2,
std_colour_space : 1,
preferred_timing_mode : 1,
gtf_supported : 1
);
BBITFIELD8_4 (
red_x_low : 2,
red_y_low : 2,
green_x_low : 2,
green_y_low : 2
);
BBITFIELD8_4 (
blue_x_low : 2,
blue_y_low : 2,
white_x_low : 2,
white_y_low : 2
);
uint8 red_x;
uint8 red_y;
uint8 green_x;
uint8 green_y;
uint8 blue_x;
uint8 blue_y;
uint8 white_x;
uint8 white_y;
} edid1_display_raw;
typedef union _PACKED {
struct _PACKED {
uint8 h_size;
BBITFIELD8_2 (
ratio : 2,
refresh : 6
);
} timing;
uint16 id;
} edid1_std_timing_raw;
typedef struct _PACKED {
BBITFIELD8_8 (
res_720x400x70 : 1,
res_720x400x88 : 1,
res_640x480x60 : 1,
res_640x480x67 : 1,
res_640x480x72 : 1,
res_640x480x75 : 1,
res_800x600x56 : 1,
res_800x600x60 : 1
);
BBITFIELD8_8 (
res_800x600x72 : 1,
res_800x600x75 : 1,
res_832x624x75 : 1,
res_1024x768x87i : 1,
res_1024x768x60 : 1,
res_1024x768x70 : 1,
res_1024x768x75 : 1,
res_1280x1024x75 : 1
);
BBITFIELD8_2 (
res_1152x870x75 : 1,
pad : 7
);
} edid1_established_timing;
enum {
EDID1_SERIAL_NUMBER = 0xff,
EDID1_ASCII_DATA = 0xfe,
EDID1_MONITOR_RANGES = 0xfd,
EDID1_MONITOR_NAME = 0xfc,
EDID1_ADD_COLOUR_POINTER = 0xfb,
EDID1_ADD_STD_TIMING = 0xfa,
EDID1_IS_DETAILED_TIMING = 1
};
typedef struct _PACKED {
uint8 min_v;
uint8 max_v;
uint8 min_h;
uint8 max_h;
uint8 max_clock;
} edid1_monitor_range;
typedef struct _PACKED {
uint8 index1;
BBITFIELD8_3 (
pad1 : 4,
white_x1_low : 2,
white_y1_low : 2
);
uint8 white_x1;
uint8 white_y1;
uint8 gamma1;
uint8 index2;
BBITFIELD8_3 (
pad2 : 4,
white_x2_low : 2,
white_y2_low : 2
);
uint8 white_x2;
uint8 white_y2;
uint8 gamma2;
} edid1_whitepoint_raw;
typedef struct _PACKED {
uint16 pixel_clock;
uint8 h_active;
uint8 h_blank;
BBITFIELD8_2 (
h_active_high : 4,
h_blank_high : 4
);
uint8 v_active;
uint8 v_blank;
BBITFIELD8_2 (
v_active_high : 4,
v_blank_high : 4
);
uint8 h_sync_off;
uint8 h_sync_width;
BBITFIELD8_2 (
v_sync_off : 4,
v_sync_width : 4
);
BBITFIELD8_4 (
h_sync_off_high : 2,
h_sync_width_high : 2,
v_sync_off_high : 2,
v_sync_width_high : 2
);
uint8 h_size;
uint8 v_size;
BBITFIELD8_2 (
h_size_high : 4,
v_size_high : 4
);
uint8 h_border;
uint8 v_border;
BBITFIELD8_5 (
interlaced : 1,
stereo : 2,
sync : 2,
misc : 2,
stereo_il : 1
);
} edid1_detailed_timing_raw;
typedef union _PACKED {
edid1_detailed_timing_raw detailed_timing;
struct _PACKED {
uint8 zero_0[3];
uint8 monitor_desc_type;
uint8 zero_4;
union _PACKED {
uint8 serial_number[EDID1_EXTRA_STRING_LEN];
uint8 ascii_data[EDID1_EXTRA_STRING_LEN];
uint8 monitor_name[EDID1_EXTRA_STRING_LEN];
edid1_monitor_range monitor_range;
edid1_whitepoint_raw whitepoint;
edid1_std_timing_raw std_timing[EDID1_NUM_EXTRA_STD_TIMING];
} data;
} extra;
} edid1_detailed_monitor_raw;
typedef struct _PACKED {
edid1_header_raw header;
edid1_vendor_raw vendor;
edid1_version_raw version;
edid1_display_raw display;
edid1_established_timing established_timing;
edid1_std_timing_raw std_timing[EDID1_NUM_STD_TIMING];
edid1_detailed_monitor_raw detailed_monitor[EDID1_NUM_DETAILED_MONITOR_DESC];
uint8 num_sections;
uint8 check_sum;
} edid1_raw;
typedef union _PACKED {
struct _PACKED {
BBITFIELD8_3 (
reserved : 1,
format_code : 4,
reserved2 : 3
);
} descr;
struct _PACKED {
BBITFIELD8_3 (
reserved : 1,
format_code : 4,
max_channels : 3
);
BBITFIELD8_8 (
reserved2 : 1,
can_192khz : 1,
can_176khz : 1,
can_96khz : 1,
can_88khz : 1,
can_48khz : 1,
can_44khz : 1,
can_32khz : 1
);
BBITFIELD8_4 (
reserved3 : 5,
can_24bit : 1,
can_20bit : 1,
can_16bit : 1
);
} descr_1;
struct _PACKED {
BBITFIELD8_3 (
reserved : 1,
format_code : 4,
max_channels : 3
);
BBITFIELD8_8 (
reserved2 : 1,
can_192khz : 1,
can_176khz : 1,
can_96khz : 1,
can_88khz : 1,
can_48khz : 1,
can_44khz : 1,
can_32khz : 1
);
uint8 maximum_bitrate;
} descr_2_8;
} audio_descr;
#if !defined(__GNUC__) || __GNUC__ < 3
#define FLEXIBLE_ARRAY_LENGTH 0
#else
#define FLEXIBLE_ARRAY_LENGTH
#endif
typedef struct _PACKED {
BBITFIELD8_2 (
tag_code : 3,
length : 5
);
union _PACKED {
uint8 extended_tag_code;
struct _PACKED {
uint8 vic0;
uint8 vic[FLEXIBLE_ARRAY_LENGTH];
} video;
struct _PACKED {
audio_descr desc0;
audio_descr desc[FLEXIBLE_ARRAY_LENGTH];
} audio;
struct _PACKED {
uint8 ouinum0;
uint8 ouinum1;
uint8 ouinum2;
union _PACKED {
struct _PACKED {
struct _PACKED {
BBITFIELD8_2 (
a : 4,
b : 4
);
BBITFIELD8_2 (
c : 4,
d : 4
);
} source_physical_address;
BBITFIELD8_7 (
supports_ai : 1,
dc_48bit : 1,
dc_36bit : 1,
dc_30bit : 1,
dc_y444 : 1,
reserved : 2,
dvi_dual : 1
);
uint8 max_tmds_clock;
uint8 reserved2[2];
BBITFIELD8_2 (
vic_length : 3,
length_3d : 5
);
uint8 vic[FLEXIBLE_ARRAY_LENGTH];
} hdmi;
struct _PACKED {
uint8 version;
uint8 max_tmds_rate;
BBITFIELD8_8 (
scdc_present : 1,
scdc_read_request_capable : 1,
supports_cable_status : 1,
supports_color_content_bits : 1,
supports_scrambling : 1,
supports_3d_independent : 1,
supports_3d_dual_view : 1,
supports_3d_osd_disparity : 1
);
BBITFIELD8_5 (
max_frl_rate : 4,
supports_uhd_vic : 1,
supports_16bit_deep_color_4_2_0 : 1,
supports_12bit_deep_color_4_2_0 : 1,
supports_10bit_deep_color_4_2_0 : 1
);
} hdmi_forum;
};
} vendor_specific;
struct _PACKED {
BBITFIELD8_8 (
FLW_FRW : 1,
RLC_RRC : 1,
FLC_FRC : 1,
BC : 1,
BL_BR : 1,
FC : 1,
LFE : 1,
FL_FR : 1
);
BBITFIELD8_8 (
TpSiL_TpSiR : 1,
SiL_SiR : 1,
TpBC : 1,
LFE2 : 1,
LS_RS : 1,
TpFC : 1,
TpC : 1,
TpFL_TpFH : 1
);
BBITFIELD8_6 (
reserved: 3,
LSd_RSd : 1,
TpLS_TpRS : 1,
BtFL_BtFR : 1,
BtFC : 1,
TpBL_TpBR : 1
);
} speaker_allocation_map;
struct _PACKED {
uint8 extended_tag_code;
BBITFIELD8_8 (
BT2020RGB : 1,
BT2020YCC : 1,
BT2020cYCC : 1,
opRGB : 1,
opYCC601 : 1,
sYCC601 : 1,
xvYCC709 : 1,
xvYCC601 : 1
);
BBITFIELD8_2 (
DCIP3 : 1,
reserved : 7
);
} colorimetry;
struct _PACKED {
uint8 extended_tag_code;
uint8 bitmap[FLEXIBLE_ARRAY_LENGTH];
} YCbCr_4_2_0_capability_map;
struct _PACKED {
uint8 extended_tag_code;
BBITFIELD8_5 (
QY : 1,
QS : 1,
S_PT : 2,
S_IT : 2,
S_CE : 2
);
} video_capability;
struct _PACKED {
uint8 extended_tag_code;
BBITFIELD8_7 (
reserved : 2,
ET_5 : 1,
ET_4 : 1,
ET_3 : 1,
ET_2 : 1,
ET_1 : 1,
ET_0 : 1
);
BBITFIELD8_8 (
SM_7 : 1,
SM_6 : 1,
SM_5 : 1,
SM_4 : 1,
SM_3 : 1,
SM_2 : 1,
SM_1 : 1,
SM_0 : 1
);
uint8 desired_content_max_luminance;
uint8 desired_content_max_frame_average_luminance;
uint8 desired_content_min_luminance;
} hdr_static_metadata;
struct _PACKED {
uint8 extended_tag_code;
} hdr_dyn_metadata;
uint8 buffer[127];
};
} cta_data_block;
typedef struct _PACKED {
uint8 tag;
uint8 revision;
uint8 offset;
BBITFIELD8_5 (
underscan : 1,
audio : 1,
ycbcr444 : 1,
ycbcr422 : 1,
num_native_detailed : 4
);
cta_data_block data_blocks[0];
uint8 reserved[123];
uint8 check_sum;
} cta_raw;
typedef struct _PACKED {
uint8 tag;
uint8 version;
uint8 length;
uint8 reserved;
uint8 extension_count;
uint8 reserved2[123];
} displayid_raw;
#endif