Pi Firmware: Added half-odd and half-even sampling to cpld_normal

Change-Id: I77441db0a8cad66f3bf4d24f50e7b0e16e72a55c
pull/56/head
David Banks 2019-03-12 18:52:09 +00:00
rodzic b4f808ee0d
commit 384088bd2d
5 zmienionych plików z 45 dodań i 12 usunięć

Wyświetl plik

@ -29,6 +29,7 @@ typedef struct {
// Support for the UI // Support for the UI
param_t *(*get_params)(); param_t *(*get_params)();
int (*get_value)(int num); int (*get_value)(int num);
const char *(*get_value_string)(int num);
void (*set_value)(int num, int value); void (*set_value)(int num, int value);
// Support for info page // Support for info page
void (*show_cal_summary)(int line); void (*show_cal_summary)(int line);

Wyświetl plik

@ -208,6 +208,10 @@ static int cpld_get_value(int num) {
return 0; return 0;
} }
static const char *cpld_get_value_string(int num) {
return NULL;
}
static void cpld_set_value(int num, int value) { static void cpld_set_value(int num, int value) {
switch (num) { switch (num) {
case OFFSET: case OFFSET:
@ -250,6 +254,7 @@ cpld_t cpld_atom = {
.update_capture_info = cpld_update_capture_info, .update_capture_info = cpld_update_capture_info,
.get_params = cpld_get_params, .get_params = cpld_get_params,
.get_value = cpld_get_value, .get_value = cpld_get_value,
.get_value_string = cpld_get_value_string,
.set_value = cpld_set_value, .set_value = cpld_set_value,
.show_cal_summary = cpld_show_cal_summary, .show_cal_summary = cpld_show_cal_summary,
.show_cal_details = cpld_show_cal_details .show_cal_details = cpld_show_cal_details

Wyświetl plik

@ -19,9 +19,16 @@ typedef struct {
int half_px_delay; // 0 = off, 1 = on, all modes int half_px_delay; // 0 = off, 1 = on, all modes
int divider; // cpld divider, 6 or 8 int divider; // cpld divider, 6 or 8
int full_px_delay; // 0..15 int full_px_delay; // 0..15
int rate; // 0 = normal psync rate (3 bpp), 1 = double psync rate (6 bpp) int rate; // 0 = normal psync rate (3 bpp), 1 = double psync rate (6 bpp), 2 = sub-sample (even), 3=sub-sample(odd)
} config_t; } config_t;
static const char *rate_names[] = {
"Normal (3bpp)",
"Double (6ppp)",
"Half-Even (3bpp)",
"Half-Odd (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;
@ -60,7 +67,7 @@ static int cpld_version;
static int supports_delay; static int supports_delay;
// Indicated the CPLD supports the rate parameter // Indicated the CPLD supports the rate parameter
static int supports_rate; static int supports_rate; // 0 = no, 1 = 1-bit rate param, 2 = 1-bit rate param
// ============================================================= // =============================================================
// Param definitions for OSD // Param definitions for OSD
@ -78,7 +85,7 @@ enum {
HALF, HALF,
DIVIDER, DIVIDER,
DELAY, DELAY,
SIXBIT RATE
}; };
static param_t params[] = { static param_t params[] = {
@ -92,7 +99,7 @@ static param_t params[] = {
{ HALF, "Half", 0, 1, 1 }, { HALF, "Half", 0, 1, 1 },
{ DIVIDER, "Divider", 6, 8, 2 }, { DIVIDER, "Divider", 6, 8, 2 },
{ DELAY, "Delay", 0, 15, 1 }, { DELAY, "Delay", 0, 15, 1 },
{ SIXBIT, "Six bits", 0, 1, 1 }, { RATE, "Sample Mode", 0, 3, 1 },
{ -1, NULL, 0, 0, 1 } { -1, NULL, 0, 0, 1 }
}; };
@ -122,7 +129,7 @@ static void write_config(config_t *config) {
} }
if (supports_rate) { if (supports_rate) {
sp |= (config->rate << scan_len); sp |= (config->rate << scan_len);
scan_len += 1; scan_len += supports_rate; // 1 or 2 depending on the CPLD version
} }
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);
@ -209,9 +216,16 @@ static void cpld_init(int version) {
if (!supports_delay) { if (!supports_delay) {
params[DELAY].key = -1; params[DELAY].key = -1;
} }
supports_rate = ((cpld_version >> VERSION_MAJOR_BIT) & 0x0F) >= 3;
if (!supports_rate) { if (((cpld_version >> VERSION_MAJOR_BIT) & 0x0F) >= 4) {
params[SIXBIT].key = -1; supports_rate = 2;
params[RATE].max = 3;
} else if (((cpld_version >> VERSION_MAJOR_BIT) & 0x0F) >= 3) {
supports_rate = 1;
params[RATE].max = 1;
} else {
supports_rate = 0;
params[RATE].key = -1;
} }
for (int i = 0; i < NUM_OFFSETS; i++) { for (int i = 0; i < NUM_OFFSETS; i++) {
default_config.sp_offset[i] = 0; default_config.sp_offset[i] = 0;
@ -420,7 +434,7 @@ static void cpld_update_capture_info(capture_info_t *capinfo) {
// Update the capture info stucture, if one was passed in // Update the capture info stucture, if one was passed in
if (capinfo) { if (capinfo) {
// Update the sample width // Update the sample width
capinfo->sample_width = config->rate; capinfo->sample_width = (config->rate == 1); // 1 = 6bpp, everything else 3bpp
// Update the line capture function // Update the line capture function
if (!mode7) { if (!mode7) {
if (capinfo->bpp == 8) { if (capinfo->bpp == 8) {
@ -496,12 +510,19 @@ static int cpld_get_value(int num) {
return config->divider; return config->divider;
case DELAY: case DELAY:
return config->full_px_delay; return config->full_px_delay;
case SIXBIT: case RATE:
return config->rate; return config->rate;
} }
return 0; return 0;
} }
static const char *cpld_get_value_string(int num) {
if (num == RATE) {
return rate_names[config->rate];
}
return NULL;
}
static void cpld_set_value(int num, int value) { static void cpld_set_value(int num, int value) {
switch (num) { switch (num) {
case ALL_OFFSETS: case ALL_OFFSETS:
@ -540,7 +561,7 @@ static void cpld_set_value(int num, int value) {
case DELAY: case DELAY:
config->full_px_delay = value; config->full_px_delay = value;
break; break;
case SIXBIT: case RATE:
config->rate = value; config->rate = value;
break; break;
} }
@ -592,6 +613,7 @@ cpld_t cpld_normal = {
.update_capture_info = cpld_update_capture_info, .update_capture_info = cpld_update_capture_info,
.get_params = cpld_get_params, .get_params = cpld_get_params,
.get_value = cpld_get_value, .get_value = cpld_get_value,
.get_value_string = cpld_get_value_string,
.set_value = cpld_set_value, .set_value = cpld_set_value,
.show_cal_summary = cpld_show_cal_summary, .show_cal_summary = cpld_show_cal_summary,
.show_cal_details = cpld_show_cal_details, .show_cal_details = cpld_show_cal_details,

Wyświetl plik

@ -602,6 +602,11 @@ static const char *get_param_string(param_menu_item_t *param_item) {
if (value_str) { if (value_str) {
return value_str; return value_str;
} }
} else {
const char *value_str = cpld->get_value_string(param->key);
if (value_str) {
return value_str;
}
} }
if (is_boolean_param(param_item)) { if (is_boolean_param(param_item)) {
return value ? "On" : "Off"; return value ? "On" : "Off";

Wyświetl plik

@ -198,7 +198,7 @@
# Important: All the properties must be on a single line, and no blank lines! # Important: All the properties must be on a single line, and no blank lines!
# #
# Here's a good default for a Beeb or Master # Here's a good default for a Beeb or Master
sampling06=3 sampling7=0,2,2,2,2,2,2,0,8,5 info=1 palette=0 deinterlace=6 scanlines=0 mux=0 vsynctype=0 vsync=0 vlockmode=3 vlockline=5 nbuffers=0 debug=0 autoswitch=1 keymap=123233 return=1 sampling06=3 sampling7=0,2,2,2,2,2,2,0,8,5,3 geometry7=37,28,63,270,504,270,1,4,192000000,12288 info=1 palette=0 deinterlace=6 scanlines=0 mux=0 vsynctype=0 vsync=0 vlockmode=3 vlockline=5 nbuffers=0 debug=0 autoswitch=1 keymap=123233 return=1
# #
# Here's a example showing no oversampling in Mode 0..6 # Here's a example showing no oversampling in Mode 0..6
#sampling06=0,4,4,4,4,4,4,0,2 geometry06=37,28,80,256,640,256,1 info=1 palette=0 deinterlace=1 scanlines=0 mux=0 vsynctype=0 vsync=0 vlockmode=3 nbuffers=0 debug=1 autoswitch=1 #sampling06=0,4,4,4,4,4,4,0,2 geometry06=37,28,80,256,640,256,1 info=1 palette=0 deinterlace=1 scanlines=0 mux=0 vsynctype=0 vsync=0 vlockmode=3 nbuffers=0 debug=1 autoswitch=1