Pi Firmware: add support for YUV CPLD 4.x and 5.x

Change-Id: I4cde690eb8d7efb4c12fb30c3b5b8ac545efe2a6
spectrum2
David Banks 2019-12-28 14:08:45 +00:00
rodzic 404b1afeef
commit 4df394abd2
1 zmienionych plików z 41 dodań i 2 usunięć

Wyświetl plik

@ -29,6 +29,8 @@ typedef struct {
int dac_f; int dac_f;
int dac_g; int dac_g;
int dac_h; int dac_h;
int sub_c;
int alt_r;
} config_t; } config_t;
// Current calibration state for mode 0..6 // Current calibration state for mode 0..6
@ -54,6 +56,8 @@ static int frontend = 0;
static int supports_invert = 0; static int supports_invert = 0;
static int supports_separate = 0; static int supports_separate = 0;
static int supports_vsync = 0; static int supports_vsync = 0;
static int supports_sub_c = 0; /* Supports chroma subsampling */
static int supports_alt_r = 0; /* Supports R channel inversion on alternate lines */
// invert state (not part of config) // invert state (not part of config)
static int invert = 0; static int invert = 0;
@ -74,7 +78,9 @@ enum {
DAC_E, DAC_E,
DAC_F, DAC_F,
DAC_G, DAC_G,
DAC_H DAC_H,
SUB_C,
ALT_R
}; };
@ -91,6 +97,8 @@ static param_t params[] = {
{ DAC_F, "DAC-F (Sync)", "dac_g", 0, 255, 1 }, { DAC_F, "DAC-F (Sync)", "dac_g", 0, 255, 1 },
{ DAC_G, "DAC-G (Terminate)","dac_g", 0, 255, 1 }, { DAC_G, "DAC-G (Terminate)","dac_g", 0, 255, 1 },
{ DAC_H, "DAC-H (G/Y Clamp)","dac_h", 0, 255, 1 }, { DAC_H, "DAC-H (G/Y Clamp)","dac_h", 0, 255, 1 },
{ SUB_C, "Subsample C", "sub_c", 0, 1, 1 },
{ ALT_R, "Alternate Inv R", "alt_r", 0, 1, 1 },
{ -1, NULL, NULL, 0, 0, 0 } { -1, NULL, NULL, 0, 0, 0 }
}; };
@ -129,6 +137,14 @@ static void write_config(config_t *config) {
sp |= invert << scan_len; sp |= invert << scan_len;
scan_len++; scan_len++;
} }
if (supports_sub_c) {
sp |= config->sub_c << scan_len;
scan_len++;
}
if (supports_alt_r) {
sp |= config->alt_r << scan_len;
scan_len++;
}
for (int i = 0; i < scan_len; i++) { for (int i = 0; i < scan_len; i++) {
RPI_SetGpioValue(SP_DATA_PIN, sp & 1); RPI_SetGpioValue(SP_DATA_PIN, sp & 1);
@ -205,6 +221,20 @@ static void cpld_init(int version) {
supports_separate = 0; supports_separate = 0;
supports_vsync = 0; supports_vsync = 0;
} }
// CPLDv4 adds support for chroma subsampling
// CPLDv5 adds support for inversion of R on alternative lines
if (major >= 5) {
supports_sub_c = 1;
supports_alt_r = 1;
} else if (major >= 4) {
supports_sub_c = 1;
supports_alt_r = 0;
params[ALT_R].key = -1;
} else {
supports_sub_c = 0;
supports_alt_r = 0;
params[SUB_C].key = -1;
}
geometry_hide_pixel_sampling(); geometry_hide_pixel_sampling();
} }
@ -352,7 +382,10 @@ static int cpld_get_value(int num) {
return config->dac_g; return config->dac_g;
case DAC_H: case DAC_H:
return config->dac_h; return config->dac_h;
case SUB_C:
return config->sub_c;
case ALT_R:
return config->alt_r;
} }
return 0; return 0;
} }
@ -405,6 +438,12 @@ static void cpld_set_value(int num, int value) {
case DAC_H: case DAC_H:
config->dac_h = value; config->dac_h = value;
break; break;
case SUB_C:
config->sub_c = value;
break;
case ALT_R:
config->alt_r = value;
break;
} }
write_config(config); write_config(config);
} }