blob: 98881998b415db43390c990da71754390fa616d1 [file] [log] [blame]
// Copyright 2024 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/graphics/display/lib/designware-dsi/dpi-video-timing.h"
#include <gtest/gtest.h>
#include "src/graphics/display/lib/api-types/cpp/display-timing.h"
namespace designware_dsi {
namespace {
TEST(DpiVideoTimingTest, Valid) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
// Calculated so that the frame rate is 30 fps.
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_TRUE(kTiming.IsValid());
static constexpr int64_t kValidDphyDataLaneBytesPerSecondMin = 61682040;
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecondMin));
static constexpr int64_t kValidDphyDataLaneBytesPerSecond2 = int64_t{61682040} * 2;
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond2));
}
TEST(DpiVideoTimingTest, ValidWhenDataLaneBytesPerSecondIsMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x044,
.horizontal_front_porch_px = 0x003,
.horizontal_sync_width_px = 0x002,
.horizontal_back_porch_px = 0x001,
.vertical_active_lines = 0x055,
.vertical_front_porch_lines = 0x006,
.vertical_sync_width_lines = 0x007,
.vertical_back_porch_lines = 0x008,
// Calculated so that the frame rate is 60 fps.
.pixel_clock_frequency_hz = 470640,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kValidDphyDataLaneBytesPerSecondMax =
kTiming.pixel_clock_frequency_hz * 256;
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecondMax));
}
TEST(InvalidDpiVideoTimingTest, DisplayTimingIsNotValid) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = -1, // Invalid
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_FALSE(kTiming.IsValid());
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, InterlacedFrame) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kInterlaced, // Unsupported
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_TRUE(kTiming.IsValid());
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, PixelRepeated) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 1, // Unsupported
};
EXPECT_TRUE(kTiming.IsValid());
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, PixelClockFrequencyNotDivisibleByDataLaneBytesPerSecond) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
// `kTiming.pixel_clock_frequency_hz` is not divisible by
// `kDphyDataLaneBytesPerSecond`.
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682041;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, ClockFrequencyRatioLowerThanMinimum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kDphyDataLaneBytesPerSecondOverlyLow = int64_t{61682040} * -1;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecondOverlyLow));
}
TEST(InvalidDpiVideoTimingTest, ClockFrequencyRatioExceedsMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kDphyDataLaneBytesPerSecondOverlyHigh = int64_t{61682040} * 257;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecondOverlyHigh));
}
TEST(InvalidDpiVideoTimingTest, HorizontalBackPorchExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x1000, // Exceeds the size limit
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.horizontal_back_porch_px, kMaxHorizontalBackPorchPx);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalSyncWidthExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x1000, // Exceeds the size limit
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.horizontal_sync_width_px, kMaxHorizontalSyncWidthPx);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalTotalExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
// Picked so that horizontal_total_px() equals to 0x8000.
.horizontal_active_px = 0x7f9a,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
// Exceeds the size limit of horizontal_total_px().
EXPECT_EQ(kTiming.horizontal_total_px(), 0x8000);
EXPECT_GT(kTiming.horizontal_total_px(), kMaxHorizontalTotalPx);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, VerticalActiveExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x4000, // Exceeds the limit
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.vertical_active_lines, kMaxVerticalActiveLines);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, VerticalFrontPorchExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x400, // Exceeds the limit
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.vertical_front_porch_lines, kMaxVerticalFrontPorchLines);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, VerticalSyncWidthExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x400, // Exceeds the limit
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.vertical_sync_width_lines, kMaxVerticalSyncWidthLines);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, VerticalBackPorchExceedsLimit) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x400, // Exceeds the limit
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_GT(kTiming.vertical_back_porch_lines, kMaxVerticalBackPorchLines);
static constexpr int64_t kDphyDataLaneBytesPerSecond = 61682040;
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalSyncTimeLaneByteClockCyclesDoesNotExceedMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x400,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = kTiming.pixel_clock_frequency_hz * 3;
const int32_t horizontal_sync_time_lane_byte_clock_cycles = DpiPixelToDphyLaneByteClockCycle(
kTiming.horizontal_sync_width_px, kTiming.pixel_clock_frequency_hz,
kValidDphyDataLaneBytesPerSecond);
EXPECT_LE(horizontal_sync_time_lane_byte_clock_cycles, kMaxHorizontalSyncTimeLaneByteClockCycles);
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalSyncTimeLaneByteClockCyclesExceedsMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x400,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kInvalidDphyDataLaneBytesPerSecond =
kTiming.pixel_clock_frequency_hz * 4;
const int32_t horizontal_sync_time_lane_byte_clock_cycles = DpiPixelToDphyLaneByteClockCycle(
kTiming.horizontal_sync_width_px, kTiming.pixel_clock_frequency_hz,
kInvalidDphyDataLaneBytesPerSecond);
EXPECT_GT(horizontal_sync_time_lane_byte_clock_cycles, kMaxHorizontalSyncTimeLaneByteClockCycles);
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kInvalidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalBackPorchTimeLaneByteClockCyclesDoesNotExceedMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x400,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = kTiming.pixel_clock_frequency_hz * 3;
const int32_t horizontal_back_porch_time_lane_byte_clock_cycles =
DpiPixelToDphyLaneByteClockCycle(kTiming.horizontal_back_porch_px,
kTiming.pixel_clock_frequency_hz,
kValidDphyDataLaneBytesPerSecond);
EXPECT_LE(horizontal_back_porch_time_lane_byte_clock_cycles,
kMaxHorizontalBackPorchTimeLaneByteClockCycles);
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalBackPorchTimeLaneByteClockCyclesExceedsMaximum) {
static constexpr display::DisplayTiming kTiming = {
.horizontal_active_px = 0x444,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x400,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
static constexpr int64_t kInvalidDphyDataLaneBytesPerSecond =
kTiming.pixel_clock_frequency_hz * 4;
const int32_t horizontal_back_porch_time_lane_byte_clock_cycles =
DpiPixelToDphyLaneByteClockCycle(kTiming.horizontal_back_porch_px,
kTiming.pixel_clock_frequency_hz,
kInvalidDphyDataLaneBytesPerSecond);
EXPECT_GT(horizontal_back_porch_time_lane_byte_clock_cycles,
kMaxHorizontalBackPorchTimeLaneByteClockCycles);
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kInvalidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalTotalTimeLaneByteClockCyclesDoesNotExceedMaximum) {
static constexpr display::DisplayTiming kTiming = {
// Picked so that horizontal_total_px() equals to 0x1000.
.horizontal_active_px = 0xf9a,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_EQ(kTiming.horizontal_total_px(), 0x1000);
static constexpr int64_t kValidDphyDataLaneBytesPerSecond = kTiming.pixel_clock_frequency_hz * 7;
const int32_t horizontal_total_time_lane_byte_clock_cycles = DpiPixelToDphyLaneByteClockCycle(
kTiming.horizontal_total_px(), kTiming.pixel_clock_frequency_hz,
kValidDphyDataLaneBytesPerSecond);
EXPECT_LE(horizontal_total_time_lane_byte_clock_cycles,
kMaxHorizontalTotalTimeLaneByteClockCycles);
EXPECT_TRUE(IsValidDpiVideoTiming(kTiming, kValidDphyDataLaneBytesPerSecond));
}
TEST(InvalidDpiVideoTimingTest, HorizontalTotalTimeLaneByteClockCyclesExceedsMaximum) {
static constexpr display::DisplayTiming kTiming = {
// Picked so that horizontal_total_px() equals to 0x1000.
.horizontal_active_px = 0xf9a,
.horizontal_front_porch_px = 0x033,
.horizontal_sync_width_px = 0x022,
.horizontal_back_porch_px = 0x011,
.vertical_active_lines = 0x555,
.vertical_front_porch_lines = 0x066,
.vertical_sync_width_lines = 0x077,
.vertical_back_porch_lines = 0x088,
.pixel_clock_frequency_hz = 61682040,
.fields_per_frame = display::FieldsPerFrame::kProgressive,
.hsync_polarity = display::SyncPolarity::kNegative,
.vsync_polarity = display::SyncPolarity::kNegative,
.vblank_alternates = false,
.pixel_repetition = 0,
};
EXPECT_EQ(kTiming.horizontal_total_px(), 0x1000);
static constexpr int64_t kInvalidDphyDataLaneBytesPerSecond =
kTiming.pixel_clock_frequency_hz * 8;
const int32_t horizontal_total_time_lane_byte_clock_cycles = DpiPixelToDphyLaneByteClockCycle(
kTiming.horizontal_total_px(), kTiming.pixel_clock_frequency_hz,
kInvalidDphyDataLaneBytesPerSecond);
EXPECT_GT(horizontal_total_time_lane_byte_clock_cycles,
kMaxHorizontalTotalTimeLaneByteClockCycles);
EXPECT_FALSE(IsValidDpiVideoTiming(kTiming, kInvalidDphyDataLaneBytesPerSecond));
}
} // namespace
} // namespace designware_dsi