diff --git a/Userland/Libraries/LibEDID/Definitions.h b/Userland/Libraries/LibEDID/Definitions.h new file mode 100644 index 0000000000..56b75bd1fc --- /dev/null +++ b/Userland/Libraries/LibEDID/Definitions.h @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2022, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace EDID { +namespace Definitions { + +struct [[gnu::packed]] StandardTimings { + u8 horizontal_8_pixels; + u8 ratio_and_refresh_rate; +}; + +struct [[gnu::packed]] DetailedTiming { + u16 pixel_clock; + u8 horizontal_addressable_pixels_low; + u8 horizontal_blanking_pixels_low; + u8 horizontal_addressable_and_blanking_pixels_high; + u8 vertical_addressable_lines_low; + u8 vertical_blanking_lines_low; + u8 vertical_addressable_and_blanking_lines_high; + u8 horizontal_front_porch_pixels_low; + u8 horizontal_sync_pulse_width_pixels_low; + u8 vertical_front_porch_and_sync_pulse_width_lines_low; + u8 horizontal_and_vertical_front_porch_sync_pulse_width_high; + u8 horizontal_addressable_image_size_mm_low; + u8 vertical_addressable_image_size_mm_low; + u8 horizontal_vertical_addressable_image_size_mm_high; + u8 right_or_left_horizontal_border_pixels; + u8 top_or_bottom_vertical_border_lines; + u8 features; +}; + +enum class DisplayDescriptorTag : u8 { + ManufacturerSpecified_First = 0x0, + ManufacturerSpecified_Last = 0xf, + Dummy = 0x10, + EstablishedTimings3 = 0xf7, + CVTTimingCodes = 0xf8, + DisplayColorManagementData = 0xf9, + StandardTimingIdentifications = 0xfa, + ColorPointData = 0xfb, + DisplayProductName = 0xfc, + DisplayRangeLimits = 0xfd, + AlphanumericDataString = 0xfe, + DisplayProductSerialNumber = 0xff +}; + +struct [[gnu::packed]] DisplayDescriptor { + u16 zero; + u8 reserved1; + u8 tag; + u8 reserved2; + union { + struct [[gnu::packed]] { + u8 ascii_name[13]; + } display_product_name; + struct [[gnu::packed]] { + u8 ascii_str[13]; + } display_product_serial_number; + struct [[gnu::packed]] { + u8 revision; + u8 dmt_bits[6]; + u8 reserved[6]; + } established_timings3; + struct [[gnu::packed]] { + u8 version; + u8 cvt[4][3]; + } coordinated_video_timings; + }; +}; + +static_assert(sizeof(DetailedTiming) == sizeof(DisplayDescriptor)); + +struct [[gnu::packed]] EDID { + u64 header; + struct [[gnu::packed]] { + u16 manufacturer_id; + u16 product_code; + u32 serial_number; + u8 week_of_manufacture; + u8 year_of_manufacture; + } vendor; + struct [[gnu::packed]] { + u8 version; + u8 revision; + } version; + struct [[gnu::packed]] { + u8 video_input_definition; + u8 horizontal_size_or_aspect_ratio; + u8 vertical_size_or_aspect_ratio; + u8 display_transfer_characteristics; + u8 feature_support; + } basic_display_parameters; + struct [[gnu::packed]] { + u8 red_green_low_order_bits; + u8 blue_white_low_order_bits; + u8 red_x_high_order_bits; + u8 red_y_high_order_bits; + u8 green_x_high_order_bits; + u8 green_y_high_order_bits; + u8 blue_x_high_order_bits; + u8 blue_y_high_order_bits; + u8 white_x_high_order_bits; + u8 white_y_high_order_bits; + } color_characteristics; + struct [[gnu::packed]] { + u8 timings_1; + u8 timings_2; + u8 manufacturer_reserved; + } established_timings; + StandardTimings standard_timings[8]; + union { + DetailedTiming detailed_timing; + DisplayDescriptor display_descriptor; + } detailed_timing_or_display_descriptors[4]; + u8 extension_block_count; + u8 checksum; +}; + +enum class ExtensionBlockTag : u8 { + CEA_861 = 0x2, + VideoTimingBlock = 0x10, + DisplayInformation = 0x40, + LocalizedString = 0x50, + DigitalPacketVideoLink = 0x60, + ExtensionBlockMap = 0xf0, + ManufacturerDefined = 0xff +}; + +struct [[gnu::packed]] ExtensionBlock { + u8 tag; + union { + struct [[gnu::packed]] { + u8 block_tags[126]; + } map; + struct [[gnu::packed]] { + u8 revision; + u8 bytes[125]; + } block; + struct [[gnu::packed]] { + u8 revision; + u8 dtd_start_offset; + u8 flags; + union { + u8 bytes[123]; + }; + } cea861extension; + }; + u8 checksum; +}; + +} + +static_assert(sizeof(Definitions::ExtensionBlock) == 128); + +} diff --git a/Userland/Libraries/LibEDID/EDID.cpp b/Userland/Libraries/LibEDID/EDID.cpp index 1c5a9ca772..d1f8f3b5a0 100644 --- a/Userland/Libraries/LibEDID/EDID.cpp +++ b/Userland/Libraries/LibEDID/EDID.cpp @@ -27,156 +27,7 @@ namespace EDID { # pragma clang diagnostic ignored "-Waddress-of-packed-member" #endif -namespace Definitions { - -struct [[gnu::packed]] StandardTimings { - u8 horizontal_8_pixels; - u8 ratio_and_refresh_rate; -}; - -struct [[gnu::packed]] DetailedTiming { - u16 pixel_clock; - u8 horizontal_addressable_pixels_low; - u8 horizontal_blanking_pixels_low; - u8 horizontal_addressable_and_blanking_pixels_high; - u8 vertical_addressable_lines_low; - u8 vertical_blanking_lines_low; - u8 vertical_addressable_and_blanking_lines_high; - u8 horizontal_front_porch_pixels_low; - u8 horizontal_sync_pulse_width_pixels_low; - u8 vertical_front_porch_and_sync_pulse_width_lines_low; - u8 horizontal_and_vertical_front_porch_sync_pulse_width_high; - u8 horizontal_addressable_image_size_mm_low; - u8 vertical_addressable_image_size_mm_low; - u8 horizontal_vertical_addressable_image_size_mm_high; - u8 right_or_left_horizontal_border_pixels; - u8 top_or_bottom_vertical_border_lines; - u8 features; -}; - -enum class DisplayDescriptorTag : u8 { - ManufacturerSpecified_First = 0x0, - ManufacturerSpecified_Last = 0xf, - Dummy = 0x10, - EstablishedTimings3 = 0xf7, - CVTTimingCodes = 0xf8, - DisplayColorManagementData = 0xf9, - StandardTimingIdentifications = 0xfa, - ColorPointData = 0xfb, - DisplayProductName = 0xfc, - DisplayRangeLimits = 0xfd, - AlphanumericDataString = 0xfe, - DisplayProductSerialNumber = 0xff -}; - -struct [[gnu::packed]] DisplayDescriptor { - u16 zero; - u8 reserved1; - u8 tag; - u8 reserved2; - union { - struct [[gnu::packed]] { - u8 ascii_name[13]; - } display_product_name; - struct [[gnu::packed]] { - u8 ascii_str[13]; - } display_product_serial_number; - struct [[gnu::packed]] { - u8 revision; - u8 dmt_bits[6]; - u8 reserved[6]; - } established_timings3; - struct [[gnu::packed]] { - u8 version; - u8 cvt[4][3]; - } coordinated_video_timings; - }; -}; - -static_assert(sizeof(DetailedTiming) == sizeof(DisplayDescriptor)); - -struct [[gnu::packed]] EDID { - u64 header; - struct [[gnu::packed]] { - u16 manufacturer_id; - u16 product_code; - u32 serial_number; - u8 week_of_manufacture; - u8 year_of_manufacture; - } vendor; - struct [[gnu::packed]] { - u8 version; - u8 revision; - } version; - struct [[gnu::packed]] { - u8 video_input_definition; - u8 horizontal_size_or_aspect_ratio; - u8 vertical_size_or_aspect_ratio; - u8 display_transfer_characteristics; - u8 feature_support; - } basic_display_parameters; - struct [[gnu::packed]] { - u8 red_green_low_order_bits; - u8 blue_white_low_order_bits; - u8 red_x_high_order_bits; - u8 red_y_high_order_bits; - u8 green_x_high_order_bits; - u8 green_y_high_order_bits; - u8 blue_x_high_order_bits; - u8 blue_y_high_order_bits; - u8 white_x_high_order_bits; - u8 white_y_high_order_bits; - } color_characteristics; - struct [[gnu::packed]] { - u8 timings_1; - u8 timings_2; - u8 manufacturer_reserved; - } established_timings; - StandardTimings standard_timings[8]; - union { - DetailedTiming detailed_timing; - DisplayDescriptor display_descriptor; - } detailed_timing_or_display_descriptors[4]; - u8 extension_block_count; - u8 checksum; -}; - -enum class ExtensionBlockTag : u8 { - CEA_861 = 0x2, - VideoTimingBlock = 0x10, - DisplayInformation = 0x40, - LocalizedString = 0x50, - DigitalPacketVideoLink = 0x60, - ExtensionBlockMap = 0xf0, - ManufacturerDefined = 0xff -}; - -struct [[gnu::packed]] ExtensionBlock { - u8 tag; - union { - struct [[gnu::packed]] { - u8 block_tags[126]; - } map; - struct [[gnu::packed]] { - u8 revision; - u8 bytes[125]; - } block; - struct [[gnu::packed]] { - u8 revision; - u8 dtd_start_offset; - u8 flags; - union { - u8 bytes[123]; - }; - } cea861extension; - }; - u8 checksum; -}; - -} - static_assert(sizeof(Definitions::EDID) == Parser::BufferSize); -static_assert(sizeof(Definitions::ExtensionBlock) == 128); class CEA861ExtensionBlock final { friend class Parser; diff --git a/Userland/Libraries/LibEDID/EDID.h b/Userland/Libraries/LibEDID/EDID.h index b70b4b9b9b..63a7f1a616 100644 --- a/Userland/Libraries/LibEDID/EDID.h +++ b/Userland/Libraries/LibEDID/EDID.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #ifdef KERNEL