diff --git a/software/sys_controller/ossc/avconfig.h b/software/sys_controller/ossc/avconfig.h index d2aaf88..4cd7fce 100644 --- a/software/sys_controller/ossc/avconfig.h +++ b/software/sys_controller/ossc/avconfig.h @@ -89,6 +89,7 @@ typedef struct { alt_u8 pm_480i; alt_u8 pm_480p; alt_u8 pm_1080i; + alt_u8 pt_mode; alt_u8 l2_mode; alt_u8 l3_mode; alt_u8 l4_mode; diff --git a/software/sys_controller/ossc/firmware.h b/software/sys_controller/ossc/firmware.h index edaf51b..f402c11 100644 --- a/software/sys_controller/ossc/firmware.h +++ b/software/sys_controller/ossc/firmware.h @@ -24,10 +24,10 @@ #include "sysconfig.h" #define FW_VER_MAJOR 1 -#define FW_VER_MINOR 9 +#define FW_VER_MINOR 10 #define PROFILE_VER_MAJOR 1 -#define PROFILE_VER_MINOR 6 +#define PROFILE_VER_MINOR 10 #define INITCFG_VER_MAJOR 1 #define INITCFG_VER_MINOR 0 diff --git a/software/sys_controller/ossc/menu.c b/software/sys_controller/ossc/menu.c index f5c68b0..9ffa1cb 100644 --- a/software/sys_controller/ossc/menu.c +++ b/software/sys_controller/ossc/menu.c @@ -55,6 +55,7 @@ static const char *s480p_mode_desc[] = { LNG("Auto","オート"), "DTV 480p", "V static const char *s400p_mode_desc[] = { "VGA 640x400@70", "VGA 720x400@70" }; static const char *sync_lpf_desc[] = { LNG("2.5MHz (max)","2.5MHz (サイダイ)"), LNG("10MHz (med)","10MHz (チュウイ)"), LNG("33MHz (min)","33MHz (サイショウ)"), LNG("Off","オフ") }; static const char *stc_lpf_desc[] = { "4.8MHz (HDTV/PC)", "0.5MHz (SDTV)", "1.7MHz (EDTV)" }; +static const char *pt_mode_desc[] = {"Normal", "High samplerate", LNG("512x240 optim.","512x240 サイテキカ."), LNG("384x240 optim.","384x240 サイテキカ."), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; static const char *l3_mode_desc[] = { LNG("Generic 16:9","ジェネリック 16:9"), LNG("Generic 4:3","ジェネリック 4:3"), LNG("512x240 optim.","512x240 サイテキカ."), LNG("384x240 optim.","384x240 サイテキカ."), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; static const char *l2l4l5l6_mode_desc[] = { LNG("Generic 4:3","ジェネリック 4:3"), LNG("512x240 optim.","512x240 サイテキカ."), LNG("384x240 optim.","384x240 サイテキカ."), LNG("320x240 optim.","320x240 サイテキカ."), LNG("256x240 optim.","256x240 サイテキカ.") }; static const char *l5_fmt_desc[] = { "1920x1080", "1600x1200", "1920x1200" }; @@ -178,6 +179,7 @@ MENU(menu_output, P99_PROTECT({ \ { LNG("480i/576i proc","480i/576iショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_480i, OPT_WRAP, SETTING_ITEM(pm_480i_desc) } } }, { LNG("480p/576p proc","480p/576pショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_480p, OPT_WRAP, SETTING_ITEM(pm_480p_desc) } } }, { LNG("960i/1080i proc","960i/1080iショリ"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.pm_1080i, OPT_WRAP, SETTING_ITEM(pm_1080i_desc) } } }, + { "Passthru mode", OPT_AVCONFIG_SELECTION, { .sel = { &tc.pt_mode, OPT_WRAP, SETTING_ITEM(pt_mode_desc) } } }, { LNG("Line2x mode","Line2xモード"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.l2_mode, OPT_WRAP, SETTING_ITEM(l2l4l5l6_mode_desc) } } }, { LNG("Line3x mode","Line3xモード"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.l3_mode, OPT_WRAP, SETTING_ITEM(l3_mode_desc) } } }, { LNG("Line4x mode","Line4xモード"), OPT_AVCONFIG_SELECTION, { .sel = { &tc.l4_mode, OPT_WRAP, SETTING_ITEM(l2l4l5l6_mode_desc) } } }, diff --git a/software/sys_controller/ossc/video_modes.c b/software/sys_controller/ossc/video_modes.c index 2b292a1..511ac5b 100644 --- a/software/sys_controller/ossc/video_modes.c +++ b/software/sys_controller/ossc/video_modes.c @@ -135,7 +135,12 @@ int get_pure_lm_mode(avconfig_t *cc, mode_data_t *vm_in, mode_data_t *vm_out, vm { int i, diff_lines, diff_v_hz_x100, mindiff_id=0, mindiff_lines=1000, mindiff_v_hz_x100=10000; mode_data_t *mode_preset; - mode_flags valid_lm[] = { MODE_PT, (MODE_L2 | (MODE_L2<l2_mode)), (MODE_L3_GEN_16_9<l3_mode), (MODE_L4_GEN_4_3<l4_mode), (MODE_L5_GEN_4_3<l5_mode), (MODE_L6_GEN_4_3<l6_mode) }; + mode_flags valid_lm[] = { (MODE_PT | (cc->pt_mode ? (MODE_L5_GEN_4_3<<(cc->pt_mode-1)) : 0)), + (MODE_L2 | (MODE_L2<l2_mode)), + (MODE_L3_GEN_16_9<l3_mode), + (MODE_L4_GEN_4_3<l4_mode), + (MODE_L5_GEN_4_3<l5_mode), + (MODE_L6_GEN_4_3<l6_mode) }; mode_flags target_lm, mindiff_lm; uint8_t pt_only = 0; uint8_t upsample2x = cc->upsample2x; @@ -243,6 +248,10 @@ int get_pure_lm_mode(avconfig_t *cc, mode_data_t *vm_in, mode_data_t *vm_out, vm mindiff_lm &= mode_preset->flags; //ensure L2 mode uniqueness + // Set passthru flag for all passthru mode options + if (*group_ptr[mode_preset->group] == 0) + mindiff_lm = MODE_PT; + if (mindiff_lm >= MODE_L6_GEN_4_3) vm_conf->y_rpt = 5; else if (mindiff_lm >= MODE_L5_GEN_4_3) @@ -258,6 +267,13 @@ int get_pure_lm_mode(avconfig_t *cc, mode_data_t *vm_in, mode_data_t *vm_out, vm case MODE_PT: vm_out->vic = vm_in->vic; + if ((cc->pt_mode == 1) && ((mode_preset->group >= GROUP_384P) && (mode_preset->group <= GROUP_576P))) { + vmode_hv_mult(vm_in, 2, 1); + vmode_hv_mult(vm_out, 2, 1); + } else if ((cc->pt_mode >= 2) && (mode_preset->group >= GROUP_240P) && (mode_preset->group <= GROUP_288P)) { + vm_conf->x_rpt = vm_conf->h_skip = cc->pt_mode; + } + // multiply horizontal resolution if necessary to fulfill min. 25MHz TMDS clock requirement. Tweak infoframe pixel repetition indicator later to make sink treat it as original resolution. while ((((vm_out->timings.v_hz_x100*vm_out->timings.v_total)/100)*vm_out->timings.h_total*(vm_conf->h_skip+1))>>vm_out->timings.interlaced < 25000000UL) { vm_conf->x_rpt = vm_conf->h_skip = 2*(vm_conf->h_skip+1)-1;