| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #include <stdlib.h> |
| #include <tests/test.h> |
| #include <edid.h> |
| #include <assert.h> |
| #include <string.h> |
| #include <tests/lib/edid.h> |
| |
| struct test_state { |
| int data_size; |
| void *data; |
| }; |
| |
| static uint8_t get_raw_edid_checksum(const unsigned char *x) |
| { |
| unsigned char sum = 0; |
| int i; |
| for (i = 0; i < 127; ++i) |
| sum += x[i]; |
| |
| return 256 - sum; |
| } |
| |
| static void edid_raw_calc_checksum(struct edid_raw *raw) |
| { |
| raw->checksum = get_raw_edid_checksum((const unsigned char *)raw); |
| } |
| |
| static void test_decode_edid_no_edid(void **state) |
| { |
| assert_int_equal(EDID_ABSENT, decode_edid(NULL, 0, NULL)); |
| } |
| |
| static void test_decode_edid_invalid_header(void **state) |
| { |
| struct edid_raw raw = {.header = EDID_HEADER_INVALID_RAW}; |
| raw.checksum = get_raw_edid_checksum((const unsigned char *)&raw); |
| |
| assert_int_equal(EDID_ABSENT, decode_edid((unsigned char *)&raw, sizeof(raw), NULL)); |
| } |
| |
| /* Frame is modified example of an LCD Desktop IT display |
| from VESA E-EDID Standard Release A2. */ |
| static int setup_decode_edid_basic_frame(void **state) |
| { |
| struct edid_raw raw = { |
| EDID_RAW_DEFAULT_PARAMS, |
| .video_input_type = |
| EDID_ANALOG_VSI |
| | EDID_SIGNAL_LEVEL_0 |
| | EDID_VIDEO_SETUP_BLANK_EQ_BLACK |
| | EDID_SEPARATE_SYNC_H_AND_V(1) |
| | EDID_COMPOSITE_SYNC_H(1) |
| | EDID_COMPOSITE_SYNC_ON_GREEN(1) |
| | EDID_SERRATION_VSYNC(1), |
| .horizontal_size = 43, /* [cm] */ |
| .vertical_size = 32, /* [cm] */ |
| .display_gamma = 120, /* 220% */ |
| .supported_features = |
| EDID_STANDBY_MODE(0) |
| | EDID_SUSPEND_MODE(0) |
| | EDID_ACTIVE_OFF(1) |
| | EDID_COLOR_FORMAT_RGB444 |
| | EDID_SRGB_SUPPORTED(0) |
| | EDID_PREFERRED_TIMING_EXTENDED_INFO |
| | EDID_DISPLAY_FREQUENCY_CONTINUOUS, |
| .established_supported_timings = { |
| [0] = EDID_ESTABLISHED_TIMINGS_1_720x400_70Hz |
| | EDID_ESTABLISHED_TIMINGS_1_720x400_88Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_60Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_67Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_72Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_75Hz |
| | EDID_ESTABLISHED_TIMINGS_1_800x600_56Hz |
| | EDID_ESTABLISHED_TIMINGS_1_800x600_60Hz, |
| [1] = EDID_ESTABLISHED_TIMINGS_2_800x600_72Hz |
| | EDID_ESTABLISHED_TIMINGS_2_800x600_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_832x624_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_80HzI |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_60Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_70Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1280x1024_75Hz, |
| }, |
| .manufacturers_reserved_timing = EDID_MANUFACTURERS_TIMINGS_1152x870_75Hz, |
| .standard_timings_supported = { |
| [0] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1600), |
| [1] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [2] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1600), |
| [3] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(75), |
| |
| [4] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1600), |
| [5] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(70), |
| |
| [6] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1600), |
| [7] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(65), |
| |
| [8] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [9] = EDID_ASPECT_RATIO_5_4 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [10] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [11] = EDID_ASPECT_RATIO_5_4 | EDID_FIELD_REFRESH_RATE(60), |
| |
| [12] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1024), |
| [13] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [14] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(800), |
| [15] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(85), |
| }, |
| .descriptor_block_1 = { |
| [0] = EDID_PIXEL_CLOCK(162000000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(162000000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1600px, |
| Horizontal Blanking is 560px. */ |
| [2] = 0x40, |
| [3] = 0x30, |
| [4] = 0x62, |
| |
| /* Vertical Addressable Video is 1200 lines, |
| Vertical Blanking is 50 lines. */ |
| [5] = 0xB0, |
| [6] = 0x32, |
| [7] = 0x40, |
| |
| [8] = 64u, /* Horizontal Front Porch in pixels. */ |
| [9] = 192u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 0x13, /* Vertical Front Porch is 1 line. */ |
| [11] = 0x00, /* Vertical Sync Pulse Width is 3 lines. */ |
| |
| /* Horizontal Addressable Image Size is 427mm, |
| Vertical Addressable Image Size is 320mm. */ |
| [12] = 0xAB, |
| [13] = 0x40, |
| [14] = 0x11, |
| |
| [15] = 0x00, /* Horizontal Border Size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate syncs are requires. */ |
| [17] = 0x1E, |
| }, |
| .descriptor_block_2 = { |
| /* Display Range Limits Block Tag */ |
| [0] = 0, |
| [1] = 0, |
| [2] = 0, |
| [3] = 0xFD, |
| |
| [4] = 0, /* Horizontal and Vertical Rate Offsets are zero. */ |
| [5] = 50u, /* Minimum Vertical Freq is 50Hz. */ |
| [6] = 90u, /* Maximum Vertical Freq is 90Hz. */ |
| |
| [7] = 30u, /* Minimum Horizontal Freq is 30kHz. */ |
| [8] = 110u, /* Maximum Horizontal Freq is 110kHz. */ |
| [9] = 23u, /* Maximum Pixel Clock Freq is 230MHz. */ |
| [10] = 0x4, /* Begin CVT Support Info */ |
| [11] = 0x11, /* Compatible with CVT Version 1.1 */ |
| [12] = 0, /* Maximum Pixel Clock Freq remains at 230MHz. */ |
| [13] = 200, /* Maximum Active Pixels per Line is 1600. */ |
| [14] = 0x90, /* Supported aspect ratios: 4:3, 5:4. */ |
| |
| /* Preferred Aspect Ratio is 4:3, Standard CVT Blanking is supported. */ |
| [15] = 0, |
| [16] = 0x50, /* H. & V. Stretch are supported and Shrinks are not. */ |
| [17] = 60u, /* Preferred Refresh Rate is 60Hz. */ |
| }, |
| .descriptor_block_3 = { |
| /* Established Timings III Block Tag */ |
| [0] = 0, |
| [1] = 0, |
| [2] = 0, |
| [3] = 0xF7, |
| [4] = 0, |
| |
| [5] = 10u, /* VESA DMT Standard Version #10 */ |
| /* |
| * 640x350@85Hz, |
| * 640x400@85Hz, |
| * 720x400@85Hz, |
| * 640x480@85Hz, |
| * 800x600@85Hz, |
| * 1024x768@85Hz, |
| * 1152x864@75Hz are supported. |
| */ |
| [6] = 0x7F, |
| |
| /* |
| * 1280x960@60Hz, |
| * 1280x960@85Hz, |
| * 1280x1024@60Hz, |
| * 1280x1024@85Hz are supported. |
| */ |
| [7] = 0x0F, |
| |
| /* |
| * 1400x1050@60Hz (Normal Blanking), |
| * 1400x1050@75Hz are supported. |
| */ |
| [8] = 0x03, |
| |
| /* |
| * 1400x1050@85Hz, |
| * 1600x1200@60Hz, |
| * 1600x1200@65Hz, |
| * 1600x1200@70Hz are supported. |
| */ |
| [9] = 0x87, |
| |
| /* |
| * 1600x1200@75Hz, |
| * 1600x1200@85Hz are supported. |
| */ |
| [10] = 0xC0, |
| |
| /* 1920 timings not supported. */ |
| [11] = 0x0, |
| |
| [12 ... 17] = 0, |
| }, |
| .descriptor_block_4 = { |
| /* Display Product Name Block Tag */ |
| [0] = 0, |
| [1] = 0, |
| [2] = 0, |
| [3] = 0xFC, |
| [4] = 0, |
| |
| /* Product name */ |
| [5] = 'A', |
| [6] = 'B', |
| [7] = 'C', |
| [8] = ' ', |
| [9] = 'L', |
| [10] = 'C', |
| [11] = 'D', |
| [12] = '2', |
| [13] = '1', |
| [14] = '\n', |
| [15] = ' ', |
| [16] = ' ', |
| [17] = ' ', |
| }, |
| .extension_flag = 0x0, /* No extensions */ |
| }; |
| |
| edid_raw_calc_checksum(&raw); |
| |
| *state = malloc(sizeof(struct test_state)); |
| |
| struct test_state ts = {.data_size = sizeof(struct edid_raw), |
| .data = malloc(sizeof(struct edid_raw))}; |
| |
| memcpy(ts.data, &raw, sizeof(raw)); |
| memcpy(*state, &ts, sizeof(ts)); |
| |
| return 0; |
| } |
| |
| /* Test decoding of EDID frame without extensions. */ |
| static void test_decode_edid_basic_frame(void **state) |
| { |
| struct edid out; |
| struct test_state *ts = *state; |
| |
| /* In real-life situations frames often are not 100% conformant, |
| but are at least correct when it comes to key data fields. */ |
| assert_int_equal(EDID_CONFORMANT, |
| decode_edid((unsigned char *)ts->data, ts->data_size, &out)); |
| |
| assert_int_equal(32, out.framebuffer_bits_per_pixel); |
| assert_int_equal(0, out.panel_bits_per_color); |
| assert_int_equal(0, out.panel_bits_per_pixel); |
| assert_int_equal(0, out.link_clock); |
| assert_int_equal(1600, out.x_resolution); |
| assert_int_equal(1200, out.y_resolution); |
| assert_int_equal(6400, out.bytes_per_line); |
| assert_int_equal(0, out.hdmi_monitor_detected); |
| assert_int_equal(0, strnlen(out.ascii_string, ARRAY_SIZE(out.ascii_string))); |
| assert_string_equal(out.manufacturer_name, EDID_MANUFACTURER_NAME); |
| |
| /* Mode */ |
| assert_null(out.mode.name); |
| assert_int_equal(162000, out.mode.pixel_clock); |
| assert_int_equal(1, out.mode.lvds_dual_channel); |
| assert_int_equal(0, out.mode.refresh); |
| assert_int_equal(1600, out.mode.ha); |
| assert_int_equal(560, out.mode.hbl); |
| assert_int_equal(64, out.mode.hso); |
| assert_int_equal(192, out.mode.hspw); |
| assert_int_equal(0, out.mode.hborder); |
| assert_int_equal(1200, out.mode.va); |
| assert_int_equal(50, out.mode.vbl); |
| assert_int_equal(1, out.mode.vso); |
| assert_int_equal(0, out.mode.vborder); |
| assert_int_equal(43, out.mode.phsync); |
| assert_int_equal(43, out.mode.pvsync); |
| assert_int_equal(0, out.mode.x_mm); |
| assert_int_equal(0, out.mode.y_mm); |
| |
| assert_int_equal(1, out.mode_is_supported[EDID_MODE_640x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_720x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1280x720_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1920x1080_60Hz]); |
| } |
| |
| /* Frame is modified example of base EDID frame with CEA861 extension |
| for DTV Display from VESA E-EDID Standard Release A2. */ |
| static int setup_decode_edid_dtv_frame_with_extension(void **state) |
| { |
| struct edid_raw raw = { |
| EDID_RAW_DEFAULT_PARAMS, |
| .video_input_type = |
| EDID_DIGITAL_VSI |
| | EDID_INTERFACE_HDMI_A |
| | EDID_COLOR_BIT_DEPTH_8B, |
| .horizontal_size = 16, /* Aspect ratio 16:9 in landscape. */ |
| .vertical_size = 0, /* Landscape flag */ |
| .display_gamma = 120, /* 220% */ |
| .supported_features = |
| EDID_STANDBY_MODE(0) |
| | EDID_SUSPEND_MODE(0) |
| | EDID_ACTIVE_OFF(0) |
| | EDID_COLOR_FORMAT_RGB444_YCRCB422_YCRCB422 |
| | EDID_SRGB_SUPPORTED(1) |
| | EDID_PREFERRED_TIMING_EXTENDED_INFO |
| | EDID_DISPLAY_FREQUENCY_NON_CONTINUOUS, |
| |
| .established_supported_timings = { |
| [0] = EDID_ESTABLISHED_TIMINGS_1_640x480_60Hz, |
| [1] = 0, |
| }, |
| .manufacturers_reserved_timing = 0, |
| .standard_timings_supported = { |
| [0 ... 15] = 0, |
| }, |
| .descriptor_block_1 = { |
| [0] = EDID_PIXEL_CLOCK(148500000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(148500000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1920px, |
| Horizontal Blanking is 280px. */ |
| [2] = 0x80, |
| [3] = 0x18, |
| [4] = 0x71, |
| |
| /* Vertical Addressable Video is 1080 lines, |
| Vertical Blanking is 45 lines. */ |
| [5] = 0x38, |
| [6] = 0x2D, |
| [7] = 0x40, |
| |
| [8] = 88u, /* Horizontal Front Porch in pixels. */ |
| [9] = 44u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 4u, /* Vertical Front Porch is 4 lines. */ |
| [11] = 5u, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Horizontal Addressable Image Size is 1039mm, |
| Vertical Addressable Image Size is 584mm. */ |
| [12] = 0x0F, |
| [13] = 0x48, |
| [14] = 0x42, |
| |
| [15] = 0x00, /* Horizontal Border Size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate and syncs are requires. */ |
| [17] = 0x1E, |
| }, |
| .descriptor_block_2 = { |
| [0] = EDID_PIXEL_CLOCK(74250000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(74250000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1920px, |
| Horizontal Blanking is 280px. */ |
| [2] = 0x80, |
| [3] = 0x18, |
| [4] = 0x71, |
| |
| /* Vertical Addressable Video is 540 lines, |
| Vertical Blanking is 22 lines. */ |
| [5] = 0x1C, |
| [6] = 0x16, |
| [7] = 0x20, |
| |
| [8] = 88u, /* Horizontal Front Porch in pixels. */ |
| [9] = 44u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 0x25, /* Vertical Front Porch is 2 lines. */ |
| [11] = 0x00, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Horizontal Addressable Image Size is 1039mm, |
| Vertical Addressable Image Size is 584mm. */ |
| [12] = 0x0F, |
| [13] = 0x48, |
| [14] = 0x42, |
| |
| [15] = 0x00, /* Horizontal Border Size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate and syncs are requires. */ |
| [17] = 0x9E, |
| }, |
| .descriptor_block_3 = { |
| [0] = EDID_PIXEL_CLOCK(74250000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(74250000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1280px, |
| Horizontal Blanking is 370px. */ |
| [2] = 0x00, |
| [3] = 0x72, |
| [4] = 0x51, |
| |
| /* Vertical Addressable Video is 720 lines, |
| Vertical Blanking is 30 lines. */ |
| [5] = 0xD0, |
| [6] = 0x1E, |
| [7] = 0x20, |
| |
| [8] = 110u, /* Horizontal Front Porch in pixels. */ |
| [9] = 40u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 0x55u, /* Vertical Front Porch is 5 lines. */ |
| [11] = 0x00, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Horizontal Addressable Image Size is 1039mm, |
| Vertical Addressable Image Size is 584mm. */ |
| [12] = 0x0F, |
| [13] = 0x48, |
| [14] = 0x42, |
| |
| [15] = 0x00, /* Horizontal Border Size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate syncs are requires. */ |
| [17] = 0x1E, |
| }, |
| .descriptor_block_4 = { |
| /* Display Product Name Block Tag */ |
| [0] = 0, |
| [1] = 0, |
| [2] = 0, |
| [3] = 0xFC, |
| [4] = 0, |
| |
| /* Product name */ |
| [5] = 'A', |
| [6] = 'B', |
| [7] = 'C', |
| [8] = ' ', |
| [9] = 'L', |
| [10] = 'C', |
| [11] = 'D', |
| [12] = '4', |
| [13] = '7', |
| [14] = 'w', |
| [15] = '\n', |
| [16] = ' ', |
| [17] = ' ', |
| }, |
| .extension_flag = 0x0, /* No extensions */ |
| }; |
| |
| edid_raw_calc_checksum(&raw); |
| |
| unsigned char ext[128] = { |
| [0] = 0x02, /* CEA 861 Extension Block Tag Code */ |
| [1] = 0x03, /* CEA 861 Block Version */ |
| |
| [2] = 0x18, /* Detail Timing Descriptors start 0x18 bytes from here. */ |
| |
| /* Underscan is not supported, |
| Basic Audio is supported, |
| YCbCr 4:4:4 & YCbCr 4:2:2 are supported, |
| Number of native formats: 2. */ |
| [3] = 0x72, |
| |
| /* Video Data Block Tag Code is 2, |
| Number of Short Video Descriptor Bytes is 7. */ |
| [4] = 0x47, |
| |
| /* 1920x1080p 59.94/60 Hz 16 : 9 AR (CEA Format #16) |
| is a supported Native Format. */ |
| [5] = 0x90, |
| |
| /* 1920x1080i 59.94/60 Hz 16 : 9 AR (CEA Format #5) |
| is a supported Native Format. */ |
| [6] = 0x85, |
| |
| /* 1280x720p 59.94/60 Hz 16 : 9 AR (CEA Format #4) is a supported format. */ |
| [7] = 0x04, |
| |
| /* 720x480p 59.94/60 Hz 16 : 9 AR (CEA Format #3) is a supported format. */ |
| [8] = 0x03, |
| |
| /* 720x480p 59.94/60 Hz 4 : 3 AR (CEA Format #2) is a supported format. */ |
| [9] = 0x02, |
| |
| /* 720x480i 59.94/60 Hz 16 : 9 AR (CEA Format #7) is a supported format. */ |
| [10] = 0x07, |
| |
| /* 720x480i 59.94/60 Hz 4 : 3 AR (CEA Format #6) is a supported format. */ |
| [11] = 0x06, |
| |
| /* Audio Data Block Tag Code is 1, |
| Number of Short Audio Descriptor Bytes is 3. */ |
| [12] = 0x23, |
| |
| /* Audio Format Tag Code is 1 --- LPCM is supported, |
| Maximum number of audio channels is 2. */ |
| [13] = 0x09, |
| |
| /* Supported Sampling Frequencies include: 48kHz; 44.1kHz & 32kHz. */ |
| [14] = 0x07, |
| |
| /* Supported Sampling Bit Rates include: 24 bit; 20 bit & 16 bit. */ |
| [15] = 0x07, |
| |
| /* Speaker Allocation Block Tag Code is 4, |
| Number of Speaker Allocation Descriptor Bytes is 3. */ |
| [16] = 0x83, |
| |
| /* Speaker Allocation is Front-Left & Front-Right. */ |
| [17] = 0x01, |
| |
| /* Reserved */ |
| [18 ... 19] = 0, |
| |
| /* Vendor Specific Data Block Tag Code is 3, |
| Number of Vendor Specific Data Bytes is 5. */ |
| [20] = 0x65, |
| |
| /* 24bit IEEE registration Identifier is 0x000C03. */ |
| [21] = 0x03, |
| [22] = 0x0C, |
| [23] = 0x00, |
| |
| /* Vendor Specific Data is 0x10000. */ |
| [24] = 0x01, |
| [25] = 0x00, |
| |
| /* Descriptor Block 5 [18 Bytes] */ |
| |
| [26] = EDID_PIXEL_CLOCK(27027000u) & 0xFF, |
| [27] = (EDID_PIXEL_CLOCK(27027000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 720px, |
| Horizontal Blanking is 138 px. */ |
| [28] = 0xD0, |
| [29] = 0x8A, |
| [30] = 0x20, |
| |
| /* Vertical Addressable Video is 480 lines, |
| Vertical Blanking is 45 lines. */ |
| [31] = 0xE0, |
| [32] = 0x2D, |
| [33] = 0x10, |
| |
| [34] = 16u, /* Horizontal Front Porch in pixels. */ |
| [35] = 62u, /* Horizontal Sync Pulse Width in pixels. */ |
| [36] = 0x96, /* Vertical Front Porch is 9 lines. */ |
| [37] = 0x00, /* Vertical Sync Pulse Width is 6 lines. */ |
| |
| /* Displayed Image Aspect Ratio is 16:9 */ |
| [38] = 16u, |
| [39] = 9u, |
| [40] = 0u, |
| |
| /* Horizontal and Vertical Border Size is 0 px */ |
| [41] = 0u, |
| [42] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [43] = 0x18, |
| |
| /* Descriptor Block 6 [18 Bytes] */ |
| |
| [44] = EDID_PIXEL_CLOCK(27027000u) & 0xFF, |
| [45] = (EDID_PIXEL_CLOCK(27027000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 720px, |
| Horizontal Blanking is 138 px. */ |
| [46] = 0xD0, |
| [47] = 0x8A, |
| [48] = 0x20, |
| |
| /* Vertical Addressable Video is 480 lines, |
| Vertical Blanking is 45 lines. */ |
| [49] = 0xE0, |
| [50] = 0x2D, |
| [51] = 0x10, |
| |
| [52] = 16u, /* Horizontal Front Porch in pixels. */ |
| [53] = 62u, /* Horizontal Sync Pulse Width in pixels. */ |
| [54] = 0x96, /* Vertical Front Porch is 9 lines. */ |
| [55] = 0x00, /* Vertical Sync Pulse Width is 6 lines. */ |
| |
| /* Displayed Image Aspect Ratio is 4:3. */ |
| [56] = 4u, |
| [57] = 3u, |
| [58] = 0u, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [59] = 0u, |
| [60] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [61] = 0x18, |
| |
| /* Descriptor Block 7 [18 Bytes] */ |
| |
| [62] = EDID_PIXEL_CLOCK(27027000u) & 0xFF, |
| [63] = (EDID_PIXEL_CLOCK(27027000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1440px, |
| Horizontal Blanking is 276 px. */ |
| [64] = 0xA0, |
| [65] = 0x14, |
| [66] = 0x51, |
| |
| /* Vertical Addressable Video is 240 lines, |
| Vertical Blanking is 23 lines. */ |
| [67] = 0xF0, |
| [68] = 0x16, |
| [69] = 0x00, |
| |
| [70] = 38u, /* Horizontal Front Porch in pixels. */ |
| [71] = 124u, /* Horizontal Sync Pulse Width in pixels. */ |
| [72] = 0x43, /* Vertical Front Porch is 9 lines. */ |
| [73] = 0x00, /* Vertical Sync Pulse Width is 6 lines. */ |
| |
| /* Displayed Image Aspect Ratio is 16:9 */ |
| [74] = 16u, |
| [75] = 9u, |
| [76] = 0u, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [77] = 0u, |
| [78] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [79] = 0x98, |
| |
| /* Descriptor Block 8 [18 Bytes] */ |
| |
| [80] = EDID_PIXEL_CLOCK(27027000u) & 0xFF, |
| [81] = (EDID_PIXEL_CLOCK(27027000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1440px, |
| Horizontal Blanking is 276 px. */ |
| [82] = 0xA0, |
| [83] = 0x14, |
| [84] = 0x51, |
| |
| /* Vertical Addressable Video is 240 lines, |
| Vertical Blanking is 23 lines. */ |
| [85] = 0xF0, |
| [86] = 0x16, |
| [87] = 0x00, |
| |
| [88] = 38u, /* Horizontal Front Porch in pixels. */ |
| [89] = 124u, /* Horizontal Sync Pulse Width in pixels. */ |
| [90] = 0x43, /* Vertical Front Porch is 9 lines. */ |
| [91] = 0x00, /* Vertical Sync Pulse Width is 6 lines. */ |
| |
| /* Displayed Image Aspect Ratio is 4:3. */ |
| [92] = 4u, |
| [93] = 3u, |
| [94] = 0u, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [95] = 0u, |
| [96] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [97] = 0x98, |
| |
| [99 ... 126] = 0}; |
| |
| ext[127] = get_raw_edid_checksum(ext); |
| |
| *state = malloc(sizeof(struct test_state)); |
| |
| struct test_state ts = {.data_size = sizeof(raw) + sizeof(ext), |
| .data = malloc(sizeof(raw) + sizeof(ext))}; |
| |
| memcpy(ts.data, &raw, sizeof(raw)); |
| memcpy(ts.data + sizeof(raw), &ext[0], sizeof(ext)); |
| |
| memcpy(*state, &ts, sizeof(ts)); |
| |
| return 0; |
| } |
| |
| /* Test decoding of EDID frame with one extension. */ |
| static void test_decode_edid_dtv_frame_with_extension(void **state) |
| { |
| struct edid out; |
| struct test_state *ts = *state; |
| |
| /* In real-life situations frames often are not 100% conformant, |
| but are at least correct when it comes to key data fields. */ |
| assert_int_equal(EDID_CONFORMANT, |
| decode_edid((unsigned char *)ts->data, ts->data_size, &out)); |
| |
| assert_int_equal(32, out.framebuffer_bits_per_pixel); |
| assert_int_equal(8, out.panel_bits_per_color); |
| assert_int_equal(24, out.panel_bits_per_pixel); |
| assert_int_equal(0, out.link_clock); |
| assert_int_equal(1920, out.x_resolution); |
| assert_int_equal(1080, out.y_resolution); |
| assert_int_equal(7680, out.bytes_per_line); |
| assert_int_equal(1, out.hdmi_monitor_detected); |
| assert_int_equal(0, strnlen(out.ascii_string, ARRAY_SIZE(out.ascii_string))); |
| assert_string_equal(out.manufacturer_name, EDID_MANUFACTURER_NAME); |
| |
| /* Mode */ |
| assert_null(out.mode.name); |
| assert_int_equal(148500, out.mode.pixel_clock); |
| assert_int_equal(1, out.mode.lvds_dual_channel); |
| assert_int_equal(0, out.mode.refresh); |
| assert_int_equal(1920, out.mode.ha); |
| assert_int_equal(280, out.mode.hbl); |
| assert_int_equal(88, out.mode.hso); |
| assert_int_equal(44, out.mode.hspw); |
| assert_int_equal(0, out.mode.hborder); |
| assert_int_equal(1080, out.mode.va); |
| assert_int_equal(45, out.mode.vbl); |
| assert_int_equal(16, out.mode.vso); |
| assert_int_equal(0, out.mode.vborder); |
| assert_int_equal(43, out.mode.phsync); |
| assert_int_equal(43, out.mode.pvsync); |
| assert_int_equal(0, out.mode.x_mm); |
| assert_int_equal(0, out.mode.y_mm); |
| |
| assert_int_equal(1, out.mode_is_supported[EDID_MODE_640x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_720x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1280x720_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1920x1080_60Hz]); |
| } |
| |
| |
| /* Test decoding of EDID frame with one extension. Tested frame is modified |
| example of base EDID frame with CEA861 extension for IT/DTV Display from |
| VESA E-EDID Standard Release A2. */ |
| static int setup_decode_edid_it_dtv_frame_with_extension(void **state) |
| { |
| struct edid_raw raw = { |
| EDID_RAW_DEFAULT_PARAMS, |
| .video_input_type = |
| EDID_DIGITAL_VSI |
| | EDID_INTERFACE_HDMI_A |
| | EDID_COLOR_BIT_DEPTH_8B, |
| .horizontal_size = 121, /* Aspect ratio 16:9 in landscape */ |
| .vertical_size = 68, /* Landscape flag */ |
| .display_gamma = 120, /* 220% */ |
| .supported_features = |
| EDID_STANDBY_MODE(0) |
| | EDID_SUSPEND_MODE(0) |
| | EDID_ACTIVE_OFF(0) |
| | EDID_COLOR_FORMAT_RGB444_YCRCB422_YCRCB422 |
| | EDID_SRGB_SUPPORTED(1) |
| | EDID_PREFERRED_TIMING_EXTENDED_INFO |
| | EDID_DISPLAY_FREQUENCY_NON_CONTINUOUS, |
| .established_supported_timings = { |
| [0] = EDID_ESTABLISHED_TIMINGS_1_800x600_60Hz |
| | EDID_ESTABLISHED_TIMINGS_1_800x600_56Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_75Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_72Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_67Hz |
| | EDID_ESTABLISHED_TIMINGS_1_640x480_60Hz |
| | EDID_ESTABLISHED_TIMINGS_1_720x400_88Hz |
| | EDID_ESTABLISHED_TIMINGS_1_720x400_70Hz, |
| [1] = EDID_ESTABLISHED_TIMINGS_2_1280x1024_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_70Hz |
| | EDID_ESTABLISHED_TIMINGS_2_1024x768_60Hz |
| | EDID_ESTABLISHED_TIMINGS_2_832x624_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_800x600_75Hz |
| | EDID_ESTABLISHED_TIMINGS_2_800x600_72Hz, |
| }, |
| .manufacturers_reserved_timing = EDID_MANUFACTURERS_TIMINGS_1152x870_75Hz, |
| .standard_timings_supported = { |
| [0] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [1] = EDID_ASPECT_RATIO_5_4 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [2] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [3] = EDID_ASPECT_RATIO_5_4 | EDID_FIELD_REFRESH_RATE(60), |
| |
| [4] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [5] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [6] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1280), |
| [7] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(60), |
| |
| [8] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(1024), |
| [9] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(85), |
| |
| [10] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(848), |
| [11] = EDID_ASPECT_RATIO_16_9 | EDID_FIELD_REFRESH_RATE(60), |
| |
| [12] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(800), |
| [13] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(60), |
| |
| [14] = EDID_HORIZONTAL_ACCESSIBLE_PIXELS(640), |
| [15] = EDID_ASPECT_RATIO_4_3 | EDID_FIELD_REFRESH_RATE(60), |
| }, |
| .descriptor_block_1 = { |
| [0] = EDID_PIXEL_CLOCK(85500000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(85500000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1360px, |
| Horizontal Blanking is 432px. */ |
| [2] = 0x50, |
| [3] = 0xB0, |
| [4] = 0x51, |
| |
| /* Vertical Addressable Video is 768 lines, |
| Vertical Blanking is 27 lines. */ |
| [5] = 0x00, |
| [6] = 0x1B, |
| [7] = 0x30, |
| |
| [8] = 64u, /* Horizontal Front Porch in pixels. */ |
| [9] = 112u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 0x36, /* Vertical Front Porch is 3 lines. */ |
| [11] = 0u, /* Vertical Sync Pulse Width is 6 lines. */ |
| |
| /* Horizontal Addressable Image Size is 1214mm, |
| Vertical Addressable Image Size is 683mm. */ |
| [12] = 0xBE, |
| [13] = 0xAB, |
| [14] = 0x42, |
| |
| [15] = 0x00, /* Horizontal border size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate and syncs are requires. */ |
| [17] = 0x1E, |
| }, |
| .descriptor_block_2 = { |
| [0] = EDID_PIXEL_CLOCK(74250000u) & 0xFF, |
| [1] = (EDID_PIXEL_CLOCK(74250000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1280px, |
| Horizontal Blanking is 370px. */ |
| [2] = 0x00, |
| [3] = 0x72, |
| [4] = 0x51, |
| |
| /* Vertical Addressable Video is 720 lines, |
| Vertical Blanking is 30 lines. */ |
| [5] = 0xD0, |
| [6] = 0x1E, |
| [7] = 0x20, |
| |
| [8] = 110u, /* Horizontal Front Porch in pixels. */ |
| [9] = 40u, /* Horizontal Pulse Sync Width in pixels. */ |
| [10] = 0x55, /* Vertical Front Porch is 5 lines. */ |
| [11] = 0x00, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Horizontal Addressable Image Size is 1214mm, |
| Vertical Addressable Image Size is 683mm. */ |
| [12] = 0xBE, |
| [13] = 0xAB, |
| [14] = 0x42, |
| |
| [15] = 0x00, /* Horizontal border size is 0px. */ |
| [16] = 0x00, /* Vertical Border Size is 0px. */ |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital separate and syncs are required. */ |
| [17] = 0x1E, |
| }, |
| .descriptor_block_3 = { |
| /* Established timings III Block Tag */ |
| [0 ... 2] = 0u, |
| [3] = 0xF7, |
| [4] = 0u, |
| |
| /* VESA DMT Standard Version #10 */ |
| [5] = 10u, |
| |
| /* |
| * 640x350@85Hz, |
| * 640x400@85Hz, |
| * 720x400@85Hz, |
| * 640x480@85Hz, |
| * 800x600@85Hz, |
| * 1024x768@85Hz, |
| * 1152x864@75Hz are supported. |
| */ |
| [6] = 0x7F, |
| |
| /* |
| * 1280x960@60Hz, |
| * 1280x960@85Hz, |
| * 1280x1024@60Hz, |
| * 1280x1024@85Hz |
| */ |
| [7] = 0x0F, |
| |
| /* |
| * 1400x1050@60Hz (Normal Blanking), |
| * 1400x1050@75Hz are supported. |
| */ |
| [8] = 0x03, |
| |
| /* |
| * 1400x1050@85Hz, |
| * 1600x1200@60Hz, |
| * 1600x1200@65Hz, |
| * 1600x1200@70Hz are supported. |
| */ |
| [9] = 0x87, |
| |
| /* |
| * 1600x1200@75Hz, |
| * 1600x1200@85Hz are supported. |
| */ |
| [10] = 0xC0, |
| |
| /* 1920 PC Timings are not supported. */ |
| [11] = 0u, |
| |
| /* Reserved */ |
| [12 ... 17] = 0, |
| }, |
| .descriptor_block_4 = { |
| /* Display Product Name Block Tag */ |
| [0] = 0, |
| [1] = 0, |
| [2] = 0, |
| [3] = 0xFC, |
| [4] = 0, |
| |
| /* Product name */ |
| [5] = 'A', |
| [6] = 'B', |
| [7] = 'C', |
| [8] = ' ', |
| [9] = 'P', |
| [10] = 'L', |
| [11] = 'A', |
| [12] = '5', |
| [13] = '5', |
| [14] = '\n', |
| [15] = ' ', |
| [16] = ' ', |
| [17] = ' ', |
| }, |
| .extension_flag = 0x0, /* No extensions */ |
| }; |
| |
| edid_raw_calc_checksum(&raw); |
| |
| unsigned char ext[128] = { |
| [0] = 0x02, /* CEA 861 Extension Block Tag Code */ |
| [1] = 0x03, /* CEA 861 Block Version */ |
| [2] = 0x17, /* Detail Timing Descriptors start 0x17 bytesfrom here */ |
| |
| /* Underscan is supported, |
| Basic Audio is supported, |
| YCbCr 4:4:4 & YCbCr 4:2:2 are supported, |
| Number of native formats: 0. */ |
| [3] = 0xF0, |
| |
| /* Video Data Block Tag Code is 2. |
| Number of Short Video Descriptor Bytes is 6. */ |
| [4] = 0x46, |
| |
| /* 1920x1080i 59.94/60 Hz 16 : 9 AR (CEA Format #5) is a supported format. */ |
| [5] = 0x05, |
| |
| /* 1280x720p 59.94/60 Hz 16 : 9 AR (CEA Format #4) is a supported format. */ |
| [6] = 0x04, |
| |
| /* 720x480p 59.94/60 Hz 16 : 9 AR (CEA Format #3) is a supported format. */ |
| [7] = 0x03, |
| |
| /* 720x480p 59.94/60 Hz 4 : 3 AR (CEA Format #2) is a supported format. */ |
| [8] = 0x02, |
| |
| /* 720x480i 59.94/60 Hz 16 : 9 AR (CEA Format #7) is a supported format. */ |
| [9] = 0x07, |
| |
| /* 720x480i 59.94/60 Hz 4 : 3 AR (CEA Format #6) is a supported format. */ |
| [10] = 0x06, |
| |
| /* Audio Data Block Tag Code is 1, |
| Number of Short Audio Descriptor Bytes is 3. */ |
| [11] = 0x23, |
| |
| /* Audio Format Tag Code is 1 --- LPCM is supported, |
| Maximum number of audio channels is 2. */ |
| [12] = 0x09, |
| |
| /* Supported Sampling Frequencies include: 48kHz; 44.1kHz & 32kHz. */ |
| [13] = 0x07, |
| |
| /* Supported Sampling Bit Rates include: 24 bit; 20 bit & 16 bit. */ |
| [14] = 0x07, |
| |
| /* Speaker Allocation Block Tag Code is 4, |
| Number of Speaker Allocation Descriptor Bytes is 3. */ |
| [15] = 0x83, |
| |
| /* Speaker Allocation is Front-Left & Front-Right */ |
| [16] = 0x01, |
| |
| /* Reserved */ |
| [17 ... 18] = 0, |
| |
| /* Vendor Specific Data Block Tag Code is 3, |
| Number of Vendor Specific Data Bytes is 5. */ |
| [19] = 0x65, |
| |
| /* 24bit IEEE registration Identifier is 0x000C03. */ |
| [20] = 0x03, |
| [21] = 0x0C, |
| [22] = 0x00, |
| |
| /* Vendor Specific Data is 0x10000. */ |
| [23] = 0x01, |
| [24] = 0x00, |
| |
| /* Descriptor Block 5 [18 Bytes] */ |
| |
| [25] = EDID_PIXEL_CLOCK(74250000u) & 0xFF, |
| [26] = (EDID_PIXEL_CLOCK(74250000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1920px, |
| Horizontal Blanking is 280px. */ |
| [27] = 0x80, |
| [28] = 0x18, |
| [29] = 0x71, |
| |
| /* Vertical Addressable Video is 540 lines, |
| Vertical Blanking is 22 lines. */ |
| [30] = 0x1C, |
| [31] = 0x16, |
| [32] = 0x20, |
| |
| [33] = 88u, /* Horizontal Front Porch in pixels. */ |
| [34] = 44u, /* Horizontal Sync Pulse Width in pixels. */ |
| [35] = 0x25, /* Vertical Front Porch is 2 lines. */ |
| [36] = 0x00, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Image size: 1039mm x 584mm */ |
| [37] = 0x0F, |
| [38] = 0x48, |
| [39] = 0x42, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [40] = 0u, |
| [41] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [42] = 0x9E, |
| |
| /* Descriptor Block 6 [18 Bytes] */ |
| |
| [43] = EDID_PIXEL_CLOCK(74250000u) & 0xFF, |
| [44] = (EDID_PIXEL_CLOCK(74250000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1280px, |
| Horizontal Blanking is 370 px. */ |
| [45] = 0x00, |
| [46] = 0x72, |
| [47] = 0x51, |
| |
| /* Vertical Addressable Video is 720 lines, |
| Vertical Blanking is 30 lines. */ |
| [48] = 0xD0, |
| [49] = 0x1E, |
| [50] = 0x20, |
| |
| [51] = 110u, /* Horizontal Front Porch in pixels. */ |
| [52] = 40u, /* Horizontal Sync Pulse Width in pixels. */ |
| [53] = 0x55, /* Vertical Front Porch is 5 lines. */ |
| [54] = 0x00, /* Vertical Sync Pulse Width is 5 lines. */ |
| |
| /* Image size: 1039mm x 584mm */ |
| [55] = 0x0F, |
| [56] = 0x48, |
| [57] = 0x42, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [58] = 0u, |
| [59] = 0u, |
| |
| /* Timing is Non-Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [60] = 0x1E, |
| |
| /* Descriptor Block 7 [18 Bytes] */ |
| |
| [61] = EDID_PIXEL_CLOCK(27000000u) & 0xFF, |
| [62] = (EDID_PIXEL_CLOCK(27000000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1440px, |
| Horizontal Blanking is 276 px. */ |
| [63] = 0xA0, |
| [64] = 0x14, |
| [65] = 0x51, |
| |
| /* Vertical Addressable Video is 240 lines, |
| Vertical Blanking is 23 lines. */ |
| [66] = 0xF0, |
| [67] = 0x16, |
| [68] = 0x00, |
| |
| [69] = 38u, /* Horizontal Front Porch in pixels. */ |
| [70] = 124u, /* Horizontal Sync Pulse Width in pixels. */ |
| [71] = 0x43, /* Vertical Front Porch is 4 lines. */ |
| [72] = 0x00, /* Vertical Sync Pulse Width is 3 lines. */ |
| |
| /* Image size: 1039mm x 584mm */ |
| [73] = 0x0F, |
| [74] = 0x48, |
| [75] = 0x42, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [76] = 0u, |
| [77] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [78] = 0x18, |
| |
| /* Descriptor Block 8 [18 Bytes] */ |
| |
| [79] = EDID_PIXEL_CLOCK(27027000u) & 0xFF, |
| [80] = (EDID_PIXEL_CLOCK(27027000u) >> 8) & 0xFF, |
| |
| /* Horizontal Addressable Video is 1440px, |
| Horizontal Blanking is 276 px. */ |
| [81] = 0xA0, |
| [82] = 0x14, |
| [83] = 0x51, |
| |
| /* Vertical Addressable Video is 240 lines, |
| Vertical Blanking is 23 lines. */ |
| [84] = 0xF0, |
| [85] = 0x16, |
| [86] = 0x00, |
| |
| [87] = 38u, /* Horizontal Front Porch in pixels. */ |
| [88] = 124u, /* Horizontal Sync Pulse Width in pixels. */ |
| [89] = 0x43, /* Vertical Front Porch is 4 lines. */ |
| [90] = 0x00, /* Vertical Sync Pulse Width is 3 lines. */ |
| |
| /* Image size: 1039mm x 584mm */ |
| [91] = 0x0F, |
| [92] = 0x48, |
| [93] = 0x42, |
| |
| /* Horizontal and Vertical Border Size is 0px. */ |
| [94] = 0u, |
| [95] = 0u, |
| |
| /* Timing is Interlaced Video, |
| Stereo Video is not supported, |
| Digital Separate Syncs are required. */ |
| [96] = 0x98, |
| |
| [97 ... 126] = 0, |
| }; |
| |
| ext[127] = get_raw_edid_checksum(ext); |
| |
| *state = malloc(sizeof(struct test_state)); |
| |
| struct test_state ts = {.data_size = sizeof(raw) + sizeof(ext), |
| .data = malloc(sizeof(raw) + sizeof(ext))}; |
| |
| memcpy(ts.data, &raw, sizeof(raw)); |
| memcpy(ts.data + sizeof(raw), &ext[0], sizeof(ext)); |
| |
| memcpy(*state, &ts, sizeof(ts)); |
| |
| return 0; |
| } |
| |
| static void test_decode_edid_it_dtv_frame_with_extension(void **state) |
| { |
| struct edid out; |
| struct test_state *ts = *state; |
| |
| /* In real-life situations frames often are not 100% conformant, |
| but are at least correct when it comes to key data fields. */ |
| assert_int_equal(EDID_CONFORMANT, |
| decode_edid((unsigned char *)ts->data, ts->data_size, &out)); |
| |
| assert_int_equal(32, out.framebuffer_bits_per_pixel); |
| assert_int_equal(8, out.panel_bits_per_color); |
| assert_int_equal(24, out.panel_bits_per_pixel); |
| assert_int_equal(0, out.link_clock); |
| assert_int_equal(1360, out.x_resolution); |
| assert_int_equal(768, out.y_resolution); |
| assert_int_equal(5440, out.bytes_per_line); |
| assert_int_equal(1, out.hdmi_monitor_detected); |
| assert_int_equal(0, strnlen(out.ascii_string, ARRAY_SIZE(out.ascii_string))); |
| assert_string_equal(out.manufacturer_name, EDID_MANUFACTURER_NAME); |
| |
| /* Mode */ |
| assert_null(out.mode.name); |
| assert_int_equal(85500, out.mode.pixel_clock); |
| assert_int_equal(0, out.mode.lvds_dual_channel); |
| assert_int_equal(0, out.mode.refresh); |
| assert_int_equal(1360, out.mode.ha); |
| assert_int_equal(432, out.mode.hbl); |
| assert_int_equal(64, out.mode.hso); |
| assert_int_equal(112, out.mode.hspw); |
| assert_int_equal(0, out.mode.hborder); |
| assert_int_equal(768, out.mode.va); |
| assert_int_equal(27, out.mode.vbl); |
| assert_int_equal(3, out.mode.vso); |
| assert_int_equal(0, out.mode.vborder); |
| assert_int_equal(43, out.mode.phsync); |
| assert_int_equal(43, out.mode.pvsync); |
| assert_int_equal(0, out.mode.x_mm); |
| assert_int_equal(0, out.mode.y_mm); |
| |
| assert_int_equal(1, out.mode_is_supported[EDID_MODE_640x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_720x480_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1280x720_60Hz]); |
| assert_int_equal(0, out.mode_is_supported[EDID_MODE_1920x1080_60Hz]); |
| } |
| |
| static int teardown_edid_test(void **state) |
| { |
| struct test_state *ts; |
| |
| if (*state == NULL) |
| return 0; |
| |
| ts = (struct test_state *)*state; |
| |
| free(ts->data); |
| free(ts); |
| |
| return 0; |
| } |
| |
| static void test_edid_set_framebuffer_bits_per_pixel(void **state) |
| { |
| struct edid out; |
| struct test_state *ts = *state; |
| |
| decode_edid((unsigned char *)ts->data, ts->data_size, &out); |
| |
| edid_set_framebuffer_bits_per_pixel(&out, 16, 2); |
| |
| assert_int_equal(16, out.framebuffer_bits_per_pixel); |
| assert_int_equal(out.mode.ha * 2, out.bytes_per_line); |
| assert_int_equal(out.bytes_per_line / (16 / 8), out.x_resolution); |
| assert_int_equal(out.mode.va, out.y_resolution); |
| |
| edid_set_framebuffer_bits_per_pixel(&out, 24, 4); |
| |
| assert_int_equal(24, out.framebuffer_bits_per_pixel); |
| assert_int_equal(out.mode.ha * 3, out.bytes_per_line); |
| assert_int_equal(out.bytes_per_line / (24 / 8), out.x_resolution); |
| assert_int_equal(out.mode.va, out.y_resolution); |
| |
| edid_set_framebuffer_bits_per_pixel(&out, 32, 4); |
| |
| assert_int_equal(32, out.framebuffer_bits_per_pixel); |
| assert_int_equal(out.mode.ha * 4, out.bytes_per_line); |
| assert_int_equal(out.bytes_per_line / (32 / 8), out.x_resolution); |
| assert_int_equal(out.mode.va, out.y_resolution); |
| } |
| |
| int main(void) |
| { |
| const struct CMUnitTest tests[] = { |
| cmocka_unit_test(test_decode_edid_no_edid), |
| cmocka_unit_test(test_decode_edid_invalid_header), |
| cmocka_unit_test_setup_teardown(test_decode_edid_basic_frame, |
| setup_decode_edid_basic_frame, |
| teardown_edid_test), |
| cmocka_unit_test_setup_teardown(test_decode_edid_dtv_frame_with_extension, |
| setup_decode_edid_dtv_frame_with_extension, |
| teardown_edid_test), |
| cmocka_unit_test_setup_teardown(test_decode_edid_it_dtv_frame_with_extension, |
| setup_decode_edid_it_dtv_frame_with_extension, |
| teardown_edid_test), |
| cmocka_unit_test_setup_teardown(test_edid_set_framebuffer_bits_per_pixel, |
| setup_decode_edid_basic_frame, |
| teardown_edid_test), |
| }; |
| |
| return cb_run_group_tests(tests, NULL, NULL); |
| } |
| |