Add new input coupling option with AC/DC 75R & high impedance combinations. Also support issue 2 & 3 analog board

pull/144/head
IanSB 2020-02-22 05:34:51 +00:00
rodzic 56c229196d
commit aa006058ec
4 zmienionych plików z 161 dodań i 34 usunięć

Wyświetl plik

@ -34,12 +34,7 @@ typedef struct {
int dac_h; int dac_h;
} config_t; } config_t;
static const char *rate_names[] = {
"3 Bits Per Pixel",
"6 Bits Per Pixel",
"Half-Odd (3BPP)",
"Half-Even (3BPP)"
};
// Current calibration state for mode 0..6 // Current calibration state for mode 0..6
static config_t default_config; static config_t default_config;
@ -126,12 +121,33 @@ enum {
DAC_H DAC_H
}; };
static const char *rate_names[] = {
"3 Bits Per Pixel",
"6 Bits Per Pixel",
"Half-Odd (3BPP)",
"Half-Even (3BPP)"
};
static const char *cpld_setup_names[] = { static const char *cpld_setup_names[] = {
"Normal", "Normal",
"Set Delay" "Set Delay"
}; };
static const char *termination_names[] = {
"DC/High Impedance",
"DC/75R Termination",
"AC/High Impedance",
"AC/75R Termination"
};
enum {
RGB_INPUT_DC_HI,
RGB_INPUT_DC_TERM,
RGB_INPUT_AC_HI,
RGB_INPUT_AC_TERM,
NUM_RGB_INPUT
};
enum { enum {
CPLD_SETUP_NORMAL, CPLD_SETUP_NORMAL,
CPLD_SETUP_DELAY, CPLD_SETUP_DELAY,
@ -152,15 +168,15 @@ static param_t params[] = {
{ DELAY, "Delay", "delay", 0, 15, 1 }, { DELAY, "Delay", "delay", 0, 15, 1 },
{ RATE, "Sample Mode", "sample_mode", 0, 3, 1 }, { RATE, "Sample Mode", "sample_mode", 0, 3, 1 },
{ MUX, "Input Mux", "input_mux", 0, 1, 1 }, { MUX, "Input Mux", "input_mux", 0, 1, 1 },
{ TERMINATE, "Terminate", "terminate", 0, 1, 1 }, { TERMINATE, "Input Coupling", "coupling", 0, NUM_RGB_INPUT-1, 1 },
{ DAC_A, "DAC-A: G Hi", "dac_a", 0, 255, 1 }, { DAC_A, "DAC-A: G Hi", "dac_a", 0, 255, 1 },
{ DAC_B, "DAC-B: G Lo", "dac_b", 0, 255, 1 }, { DAC_B, "DAC-B: G Lo", "dac_b", 0, 255, 1 },
{ DAC_C, "DAC-C: RB Hi", "dac_c", 0, 255, 1 }, { DAC_C, "DAC-C: RB Hi", "dac_c", 0, 255, 1 },
{ DAC_D, "DAC-D: RB Lo", "dac_d", 0, 255, 1 }, { DAC_D, "DAC-D: RB Lo", "dac_d", 0, 255, 1 },
{ DAC_E, "DAC-E: G Mid/VS", "dac_f", 0, 255, 1 }, { DAC_E, "DAC-E: G Mid/VS", "dac_f", 0, 255, 1 },
{ DAC_F, "DAC-F: Sync", "dac_g", 0, 255, 1 }, { DAC_F, "DAC-F: Sync", "dac_g", 0, 255, 1 },
{ DAC_G, "DAC-G: Spare", "dac_g", 0, 255, 1 }, { DAC_G, "DAC-G: G Clamp", "dac_g", 0, 255, 1 },
{ DAC_H, "DAC-H: G Clamp", "dac_h", 0, 255, 1 }, { DAC_H, "DAC-H: Spare", "dac_h", 0, 255, 1 },
{ -1, NULL, NULL, 0, 0, 1 } { -1, NULL, NULL, 0, 0, 1 }
}; };
@ -182,16 +198,41 @@ static void sendDAC(int dac, int value)
if (value < 2) value = 2; // prevent sync being just high frequency noise when no sync input if (value < 2) value = 2; // prevent sync being just high frequency noise when no sync input
old_dac = 2; old_dac = 2;
break; break;
case 6: case 7:
old_dac = 3; old_dac = 3;
value = (config->terminate == 0) ? 0 : 255; //substitute termination state for value of DAC-G
break; break;
default: default:
break; break;
} }
if (frontend == FRONTEND_ANALOG_ISSUE2_5259) {
switch (dac) {
case 6:
dac = 7;
break;
case 7:
{
dac = 6;
switch (config->terminate) {
default:
case RGB_INPUT_DC_HI:
case RGB_INPUT_AC_HI:
value = 0; //high impedance
break;
case RGB_INPUT_DC_TERM:
case RGB_INPUT_AC_TERM:
value = 255; //termination
break;
}
}
break;
default:
break;
}
}
switch (frontend) { switch (frontend) {
case FRONTEND_ANALOG_5259: // max5259 case FRONTEND_ANALOG_ISSUE3_5259: // max5259
case FRONTEND_ANALOG_ISSUE2_5259:
{ {
int packet = (dac << 11) | 0x600 | value; int packet = (dac << 11) | 0x600 | value;
RPI_SetGpioValue(STROBE_PIN, 0); RPI_SetGpioValue(STROBE_PIN, 0);
@ -208,7 +249,7 @@ static void sendDAC(int dac, int value)
} }
break; break;
case FRONTEND_ANALOG_UA1: // tlc5260 or tlv5260 case FRONTEND_ANALOG_ISSUE1_UA1: // tlc5260 or tlv5260
{ {
if (old_dac >= 0) { if (old_dac >= 0) {
int packet = old_dac << 9 | value; int packet = old_dac << 9 | value;
@ -230,7 +271,7 @@ static void sendDAC(int dac, int value)
} }
break; break;
case FRONTEND_ANALOG_UB1: // dac084s085 case FRONTEND_ANALOG_ISSUE1_UB1: // dac084s085
{ {
if (old_dac >= 0) { if (old_dac >= 0) {
int packet = (old_dac << 14) | 0x1000 | (value << 4); int packet = (old_dac << 14) | 0x1000 | (value << 4);
@ -309,10 +350,31 @@ static void write_config(config_t *config) {
sendDAC(6, config->dac_g); sendDAC(6, config->dac_g);
sendDAC(7, config->dac_h); sendDAC(7, config->dac_h);
RPI_SetGpioValue(SP_CLKEN_PIN, config->terminate > 0 ? 1 : 0); switch (config->terminate) {
default:
case RGB_INPUT_DC_HI:
RPI_SetGpioValue(SP_DATA_PIN, 0); //ac-dc
RPI_SetGpioValue(SP_CLKEN_PIN, 0); //termination
break;
case RGB_INPUT_DC_TERM:
RPI_SetGpioValue(SP_DATA_PIN, 0);
RPI_SetGpioValue(SP_CLKEN_PIN, 1);
break;
case RGB_INPUT_AC_HI:
RPI_SetGpioValue(SP_DATA_PIN, 1);
RPI_SetGpioValue(SP_CLKEN_PIN, 0);
break;
case RGB_INPUT_AC_TERM:
RPI_SetGpioValue(SP_DATA_PIN, 1);
RPI_SetGpioValue(SP_CLKEN_PIN, 1);
break;
}
} else {
RPI_SetGpioValue(SP_DATA_PIN, 0);
RPI_SetGpioValue(SP_CLKEN_PIN, 0);
} }
RPI_SetGpioValue(SP_DATA_PIN, 0);
RPI_SetGpioValue(MUX_PIN, config->mux); RPI_SetGpioValue(MUX_PIN, config->mux);
} }
@ -825,6 +887,9 @@ static const char *cpld_get_value_string(int num) {
if (num == CPLD_SETUP_MODE) { if (num == CPLD_SETUP_MODE) {
return cpld_setup_names[config->cpld_setup_mode]; return cpld_setup_names[config->cpld_setup_mode];
} }
if (num == TERMINATE) {
return termination_names[config->terminate];
}
return NULL; return NULL;
} }
@ -1147,7 +1212,7 @@ static void cpld_init_rgb_analog(int version) {
} }
static int cpld_frontend_info_rgb_analog() { static int cpld_frontend_info_rgb_analog() {
return FRONTEND_ANALOG_5259 | FRONTEND_ANALOG_UB1 << 16; return FRONTEND_ANALOG_ISSUE3_5259 | FRONTEND_ANALOG_ISSUE1_UB1 << 16;
} }
static void cpld_set_frontend_rgb_analog(int value) { static void cpld_set_frontend_rgb_analog(int value) {

Wyświetl plik

@ -121,6 +121,21 @@ static const char *clamptype_names[] = {
"Back Porch Auto" "Back Porch Auto"
}; };
static const char *termination_names[] = {
"DC/High Impedance",
"DC/75R Termination",
"AC/High Impedance",
"AC/75R Termination"
};
enum {
YUV_INPUT_DC_HI,
YUV_INPUT_DC_TERM,
YUV_INPUT_AC_HI,
YUV_INPUT_AC_TERM,
NUM_YUV_INPUT
};
enum { enum {
CPLD_SETUP_NORMAL, CPLD_SETUP_NORMAL,
CPLD_SETUP_DELAY, CPLD_SETUP_DELAY,
@ -147,15 +162,15 @@ static param_t params[] = {
{ CLAMPTYPE, "Clamp Type", "clamptype", 0, NUM_CLAMPTYPE-1, 1 }, { CLAMPTYPE, "Clamp Type", "clamptype", 0, NUM_CLAMPTYPE-1, 1 },
{ DELAY, "Delay", "delay", 0, 15, 1 }, { DELAY, "Delay", "delay", 0, 15, 1 },
{ MUX, "Input Mux", "input_mux", 0, 1, 1 }, { MUX, "Input Mux", "input_mux", 0, 1, 1 },
{ TERMINATE, "Terminate", "terminate", 0, 1, 1 }, { TERMINATE, "Input Coupling", "coupling", 0, NUM_YUV_INPUT-1, 1 },
{ DAC_A, "DAC-A: Y Hi", "dac_a", 0, 255, 1 }, { DAC_A, "DAC-A: Y Hi", "dac_a", 0, 255, 1 },
{ DAC_B, "DAC-B: Y Lo", "dac_b", 0, 255, 1 }, { DAC_B, "DAC-B: Y Lo", "dac_b", 0, 255, 1 },
{ DAC_C, "DAC-C: UV Hi", "dac_c", 0, 255, 1 }, { DAC_C, "DAC-C: UV Hi", "dac_c", 0, 255, 1 },
{ DAC_D, "DAC-D: UV Lo", "dac_d", 0, 255, 1 }, { DAC_D, "DAC-D: UV Lo", "dac_d", 0, 255, 1 },
{ DAC_E, "DAC-E: Y Mid/VS", "dac_f", 0, 255, 1 }, { DAC_E, "DAC-E: Y Mid/VS", "dac_f", 0, 255, 1 },
{ DAC_F, "DAC-F: Sync", "dac_g", 0, 255, 1 }, { DAC_F, "DAC-F: Sync", "dac_g", 0, 255, 1 },
{ DAC_G, "DAC-G: Spare", "dac_g", 0, 255, 1 }, { DAC_G, "DAC-G: Y Clamp", "dac_g", 0, 255, 1 },
{ DAC_H, "DAC-H: Y Clamp", "dac_h", 0, 255, 1 }, { DAC_H, "DAC-H: Spare", "dac_h", 0, 255, 1 },
{ -1, NULL, NULL, 0, 0, 0 } { -1, NULL, NULL, 0, 0, 0 }
}; };
@ -176,9 +191,33 @@ static void sendDAC(int dac, int value)
if (dac == 5) { if (dac == 5) {
if (value < 2) value = 2; // prevent sync being just high frequency noise when no sync input if (value < 2) value = 2; // prevent sync being just high frequency noise when no sync input
} }
if (dac == 6) {
value = (config->terminate == 0) ? 0 : 255; //substitute termination state for value of DAC-G if (frontend == FRONTEND_YUV_ISSUE2_5259) {
switch (dac) {
case 6:
dac = 7;
break;
case 7:
{
dac = 6;
switch (config->terminate) {
default:
case YUV_INPUT_DC_HI:
case YUV_INPUT_AC_HI:
value = 0; //high impedance
break;
case YUV_INPUT_DC_TERM:
case YUV_INPUT_AC_TERM:
value = 255; //termination
break;
}
}
break;
default:
break;
}
} }
int packet = (dac << 11) | 0x600 | value; int packet = (dac << 11) | 0x600 | value;
RPI_SetGpioValue(STROBE_PIN, 0); RPI_SetGpioValue(STROBE_PIN, 0);
@ -283,9 +322,25 @@ static void write_config(config_t *config) {
sendDAC(6, config->dac_g); sendDAC(6, config->dac_g);
sendDAC(7, config->dac_h); sendDAC(7, config->dac_h);
RPI_SetGpioValue(SP_CLKEN_PIN, config->terminate > 0 ? 1 : 0); switch (config->terminate) {
default:
RPI_SetGpioValue(SP_DATA_PIN, 0); case YUV_INPUT_DC_HI:
RPI_SetGpioValue(SP_DATA_PIN, 0); //ac-dc
RPI_SetGpioValue(SP_CLKEN_PIN, 0); //termination
break;
case YUV_INPUT_DC_TERM:
RPI_SetGpioValue(SP_DATA_PIN, 0);
RPI_SetGpioValue(SP_CLKEN_PIN, 1);
break;
case YUV_INPUT_AC_HI:
RPI_SetGpioValue(SP_DATA_PIN, 1);
RPI_SetGpioValue(SP_CLKEN_PIN, 0);
break;
case YUV_INPUT_AC_TERM:
RPI_SetGpioValue(SP_DATA_PIN, 1);
RPI_SetGpioValue(SP_CLKEN_PIN, 1);
break;
}
RPI_SetGpioValue(MUX_PIN, config->mux); RPI_SetGpioValue(MUX_PIN, config->mux);
} }
@ -531,6 +586,9 @@ static const char *cpld_get_value_string(int num) {
if (num == CPLD_SETUP_MODE) { if (num == CPLD_SETUP_MODE) {
return cpld_setup_names[config->cpld_setup_mode]; return cpld_setup_names[config->cpld_setup_mode];
} }
if (num == TERMINATE) {
return termination_names[config->terminate];
}
return NULL; return NULL;
} }
@ -660,7 +718,7 @@ static int cpld_get_delay() {
} }
static int cpld_frontend_info() { static int cpld_frontend_info() {
return FRONTEND_YUV_5259 | FRONTEND_YUV_5259 << 16; return FRONTEND_YUV_ISSUE3_5259 | FRONTEND_YUV_ISSUE2_5259 << 16;
} }
static void cpld_set_frontend(int value) { static void cpld_set_frontend(int value) {

Wyświetl plik

@ -181,10 +181,12 @@ static const char *frontend_names[] = {
"3 BIT RGB", "3 BIT RGB",
"Atom", "Atom",
"6 BIT RGB", "6 BIT RGB",
"6 BIT RGB Analog", "6 BIT RGB Analog Issue 3",
"6 BIT RGB Analog ALT:UA1", "6 BIT RGB Analog Issue 2",
"6 BIT RGB Analog ALT:UB1", "6 BIT RGB Analog Issue 1A",
"6 BIT YUV Analog" "6 BIT RGB Analog Issue 1B",
"6 BIT YUV Analog Issue 3",
"6 BIT YUV Analog Issue 2"
}; };
static const char *vlockspeed_names[] = { static const char *vlockspeed_names[] = {

Wyświetl plik

@ -114,10 +114,12 @@ enum {
FRONTEND_TTL_3BIT, FRONTEND_TTL_3BIT,
FRONTEND_ATOM, FRONTEND_ATOM,
FRONTEND_TTL_6BIT, FRONTEND_TTL_6BIT,
FRONTEND_ANALOG_5259, FRONTEND_ANALOG_ISSUE3_5259,
FRONTEND_ANALOG_UA1, FRONTEND_ANALOG_ISSUE2_5259,
FRONTEND_ANALOG_UB1, FRONTEND_ANALOG_ISSUE1_UA1,
FRONTEND_YUV_5259, FRONTEND_ANALOG_ISSUE1_UB1,
FRONTEND_YUV_ISSUE3_5259,
FRONTEND_YUV_ISSUE2_5259,
NUM_FRONTENDS NUM_FRONTENDS
}; };