Files
ossc/software/sys_controller/inc/video_modes.h
T
Peter YooandClaude Opus 5 b2fd00d439 Add fixed-refresh preset group for workstation modes
get_pure_lm_mode() picks the preset with the nearest total line count.
Several workstation display modes share line counts with each other or with
VESA modes while having one fixed refresh rate (e.g. Sun 1152x900 is 937
lines at both 66 Hz and 76.6 Hz on cg6 boards, and Sun 1280x1024@76 has the
1066 lines of VESA 1280x1024).

Add GROUP_FIXED_VHZ. Presets in this group are candidates only when the
measured refresh is within +-0.3 Hz of the preset (the measured refresh is
exact to about 0.01 Hz). They are appended at the end of the table, so the
early exit of the search loop is replaced by a flag that skips the
remaining regular presets exactly as before but still lets fixed-refresh
presets take part, including the existing equal-line refresh tie-break
(group >= GROUP_720P). Group-indexed arrays in video_modes.c and
controls.c get the extra entry.

No preset uses the group yet, so behaviour is unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WiXHy7Jhh5yTdsBaenucgw
2026-09-18 22:10:33 +09:00

192 lines
4.9 KiB
C

//
// Copyright (C) 2015-2023 Markus Hiienkari <mhiienka@niksula.hut.fi>
//
// This file is part of Open Source Scan Converter project.
//
// 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 3 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, see <http://www.gnu.org/licenses/>.
//
#ifndef VIDEO_MODES_H_
#define VIDEO_MODES_H_
#include <stdint.h>
#include "sysconfig.h"
#include "avconfig.h"
#include "it6613_sys.h"
#define DEF_PHASE 0x10
#define H_TOTAL_MIN 300
#define H_TOTAL_MAX 3200
#define H_TOTAL_ADJ_MAX 19
#define H_SYNCLEN_MIN 10
#define H_SYNCLEN_MAX 255
#define H_BPORCH_MIN 0
#define H_BPORCH_MAX 511
#define H_ACTIVE_MIN 200
#define H_ACTIVE_MAX 3000
#define H_ACTIVE_SMP_MAX 2048
#define V_SYNCLEN_MIN 1
#define V_SYNCLEN_MAX 15
#define V_BPORCH_MIN 0
#define V_BPORCH_MAX 511
#define V_ACTIVE_MIN 160
#define V_ACTIVE_MAX 1728
typedef enum {
FORMAT_RGBS = 0,
FORMAT_RGBHV = 1,
FORMAT_RGsB = 2,
FORMAT_YPbPr = 3
} video_format;
typedef enum {
VIDEO_SDTV = (1<<0),
VIDEO_EDTV = (1<<1),
VIDEO_HDTV = (1<<2),
VIDEO_PC = (1<<3),
} video_type;
typedef enum {
GROUP_NONE = 0,
GROUP_240P = 1,
GROUP_288P = 2,
GROUP_384P = 3,
GROUP_480I = 4,
GROUP_576I = 5,
GROUP_480P = 6,
GROUP_576P = 7,
GROUP_720P = 8,
GROUP_1080I = 9,
GROUP_1080P = 10,
GROUP_FIXED_VHZ = 11, // fixed-refresh workstation modes: only matched when the input refresh is within FIXED_VHZ_TOL_X100
} video_group;
#define FIXED_VHZ_TOL_X100 30 // +-0.30 Hz (measured refresh is exact to ~0.01 Hz)
typedef enum {
MODE_INTERLACED = (1<<0), //deprecated
MODE_CRT = (1<<1),
//at least one of the flags below must be set for each P-LM mode
MODE_PT = (1<<2),
MODE_L2 = (1<<3),
MODE_L2_512_COL = (1<<4),
MODE_L2_384_COL = (1<<5),
MODE_L2_320_COL = (1<<6),
MODE_L2_256_COL = (1<<7),
MODE_L2_240x360 = (1<<8),
MODE_L3_GEN_16_9 = (1<<9),
MODE_L3_GEN_4_3 = (1<<10),
MODE_L3_512_COL = (1<<11),
MODE_L3_384_COL = (1<<12),
MODE_L3_320_COL = (1<<13),
MODE_L3_256_COL = (1<<14),
MODE_L3_240x360 = (1<<15),
MODE_L4_GEN_4_3 = (1<<16),
MODE_L4_512_COL = (1<<17),
MODE_L4_384_COL = (1<<18),
MODE_L4_320_COL = (1<<19),
MODE_L4_256_COL = (1<<20),
MODE_L5_GEN_4_3 = (1<<21),
MODE_L5_512_COL = (1<<22),
MODE_L5_384_COL = (1<<23),
MODE_L5_320_COL = (1<<24),
MODE_L5_256_COL = (1<<25),
MODE_L6_GEN_4_3 = (1<<26),
MODE_L6_512_COL = (1<<27),
MODE_L6_384_COL = (1<<28),
MODE_L6_320_COL = (1<<29),
MODE_L6_256_COL = (1<<30),
} mode_flags;
typedef enum {
VMODE_480p = 24,
} vmode_t;
typedef struct {
uint16_t h_active;
uint16_t v_active;
uint16_t v_hz_x100;
uint16_t h_total;
uint8_t h_total_adj;
uint16_t v_total;
uint16_t h_backporch;
uint16_t v_backporch;
uint8_t h_synclen;
uint8_t v_synclen;
uint8_t interlaced;
} sync_timings_t;
typedef struct {
uint8_t h;
uint8_t v;
} aspect_ratio_t;
typedef struct {
uint8_t h;
uint8_t v;
} mask_t;
typedef enum {
TX_1X = 0,
TX_2X = 1,
TX_4X = 2
} HDMI_pixelrep_t;
typedef struct {
char name[11];
HDMI_Video_Type vic;
sync_timings_t timings;
uint8_t sampler_phase;
union {
aspect_ratio_t ar;
mask_t mask;
};
video_type type;
video_group group;
mode_flags flags;
} mode_data_t;
typedef struct {
int8_t x_rpt;
int8_t y_rpt;
uint8_t h_skip;
uint8_t h_sample_sel;
int16_t x_offset;
int16_t y_offset;
uint16_t x_size;
uint16_t y_size;
uint16_t framesync_line;
uint8_t x_start_lb;
int8_t y_start_lb;
uint8_t framelock;
uint8_t tx_pixelrep;
uint8_t hdmitx_pixr_ifr;
// for generation from 27MHz clock
int8_t si_pclk_mult;
} vm_proc_config_t;
void set_default_vm_table();
uint32_t estimate_dotclk(mode_data_t *vm_in, uint32_t h_hz);
uint32_t calculate_pclk(uint32_t src_clk_hz, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
int get_pure_lm_mode(avconfig_t *cc, mode_data_t *vm_in, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
int get_vmode(vmode_t vmode_id, mode_data_t *vm_in, mode_data_t *vm_out, vm_proc_config_t *vm_conf);
#endif /* VIDEO_MODES_H_ */