mirror of
https://github.com/marqs85/ossc
synced 2026-07-17 09:26:58 +03:00
add support for input/profile select via JTAG UART
This commit is contained in:
parent
d653b67ffc
commit
e6e76171f6
@ -62,9 +62,6 @@ extern mode_data_t video_modes_plm[];
|
||||
extern ypbpr_to_rgb_csc_t csc_coeffs[];
|
||||
extern alt_u16 rc_keymap[REMOTE_MAX_KEYS];
|
||||
extern alt_u16 rc_keymap_default[REMOTE_MAX_KEYS];
|
||||
extern alt_u32 remote_code;
|
||||
extern alt_u32 btn_code, btn_code_prev;
|
||||
extern alt_u8 remote_rpt, remote_rpt_prev;
|
||||
extern avconfig_t tc;
|
||||
extern alt_u8 vm_sel;
|
||||
extern char target_profile_name[USERDATA_NAME_LEN+1];
|
||||
@ -1042,8 +1039,6 @@ int main(int argc, char **argv, char **envp)
|
||||
|
||||
status_t status;
|
||||
|
||||
alt_u32 input_vec;
|
||||
|
||||
alt_timestamp_type start_ts;
|
||||
alt_timestamp_type auto_input_timestamp = 0;
|
||||
alt_u8 auto_input_changed = 0;
|
||||
@ -1082,24 +1077,6 @@ int main(int argc, char **argv, char **envp)
|
||||
while(1) {
|
||||
start_ts = alt_timestamp();
|
||||
|
||||
// Read remote control and PCB button status
|
||||
input_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE);
|
||||
remote_code = input_vec & RC_MASK;
|
||||
btn_code = ~input_vec & PB_MASK;
|
||||
remote_rpt = input_vec >> 24;
|
||||
|
||||
if ((remote_rpt == 0) || ((remote_rpt > 1) && (remote_rpt < 6)) || (remote_rpt == remote_rpt_prev))
|
||||
remote_code = 0;
|
||||
|
||||
remote_rpt_prev = remote_rpt;
|
||||
|
||||
if (btn_code_prev == 0) {
|
||||
btn_code_prev = btn_code;
|
||||
} else {
|
||||
btn_code_prev = btn_code;
|
||||
btn_code = 0;
|
||||
}
|
||||
|
||||
// Auto input switching
|
||||
if ((cs.auto_input != AUTO_OFF) && (cm.avinput != AV_TESTPAT) && !cm.sync_active && !menu_active
|
||||
&& (alt_timestamp() >= auto_input_timestamp + 300 * (alt_timestamp_freq() >> 10)) && (auto_input_ctr < AUTO_MAX_COUNT)) {
|
||||
@ -1145,6 +1122,7 @@ int main(int argc, char **argv, char **envp)
|
||||
auto_input_timestamp = alt_timestamp();
|
||||
}
|
||||
|
||||
read_controls();
|
||||
man_input_change = parse_control();
|
||||
|
||||
if (menu_active)
|
||||
|
||||
@ -65,6 +65,7 @@ typedef enum {
|
||||
|
||||
void setup_rc();
|
||||
void set_default_keymap();
|
||||
void read_controls();
|
||||
int parse_control();
|
||||
|
||||
#endif
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include "system.h"
|
||||
#include "alt_types.h"
|
||||
#include "controls.h"
|
||||
@ -28,9 +29,13 @@
|
||||
#include "video_modes.h"
|
||||
#include "userdata.h"
|
||||
#include "firmware.h"
|
||||
#include "utils.h"
|
||||
#include "lcd.h"
|
||||
#include "altera_avalon_jtag_uart.h"
|
||||
#include "altera_avalon_pio_regs.h"
|
||||
|
||||
#define UART_RX_BUF_SIZE 15
|
||||
|
||||
static const char *rc_keydesc[REMOTE_MAX_KEYS] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", \
|
||||
"MENU", "OK", "BACK", "UP", "DOWN", "LEFT", "RIGHT", "INFO", "LCD_BACKLIGHT", "SCANLINE_MODE", \
|
||||
"SCANLINE_TYPE", "SCANLINE_INT+", "SCANLINE_INT-", "SHMASK_MODE+", "SHMASK_MODE-", "SHMASK_INT+", "SHMASK_INT-", "LINEMULT_MODE", "PHASE+", "PHASE-",
|
||||
@ -56,9 +61,17 @@ extern volatile osd_regs *osd;
|
||||
|
||||
extern menu_t menu_scanlines, menu_advtiming, menu_postproc;
|
||||
|
||||
extern altera_avalon_jtag_uart_state jtag_uart_0;
|
||||
extern int altera_avalon_jtag_uart_read(altera_avalon_jtag_uart_state* sp, char* buffer, int space, int flags);
|
||||
extern int altera_avalon_jtag_uart_write(altera_avalon_jtag_uart_state* sp, const char * ptr, int count, int flags);
|
||||
|
||||
char uart_rx_buf[UART_RX_BUF_SIZE+1];
|
||||
char *uart_rx_buf_ptr = uart_rx_buf;
|
||||
|
||||
alt_u32 remote_code;
|
||||
alt_u8 remote_rpt, remote_rpt_prev;
|
||||
alt_u32 btn_code, btn_code_prev;
|
||||
int uart_rx_ret;
|
||||
|
||||
void setup_rc()
|
||||
{
|
||||
@ -121,12 +134,43 @@ void set_default_keymap() {
|
||||
memcpy(rc_keymap, rc_keymap_default, sizeof(rc_keymap));
|
||||
}
|
||||
|
||||
void read_controls() {
|
||||
uint32_t input_vec;
|
||||
|
||||
// Read remote control and PCB button status
|
||||
input_vec = IORD_ALTERA_AVALON_PIO_DATA(PIO_1_BASE);
|
||||
remote_code = input_vec & RC_MASK;
|
||||
btn_code = ~input_vec & PB_MASK;
|
||||
remote_rpt = input_vec >> 24;
|
||||
|
||||
if ((remote_rpt == 0) || ((remote_rpt > 1) && (remote_rpt < 6)) || (remote_rpt == remote_rpt_prev))
|
||||
remote_code = 0;
|
||||
|
||||
remote_rpt_prev = remote_rpt;
|
||||
|
||||
if (btn_code_prev == 0) {
|
||||
btn_code_prev = btn_code;
|
||||
} else {
|
||||
btn_code_prev = btn_code;
|
||||
btn_code = 0;
|
||||
}
|
||||
|
||||
uart_rx_ret = altera_avalon_jtag_uart_read(&jtag_uart_0, uart_rx_buf_ptr, UART_RX_BUF_SIZE-(uart_rx_buf_ptr-uart_rx_buf), O_NONBLOCK);
|
||||
if (uart_rx_ret > 0) {
|
||||
// echo
|
||||
altera_avalon_jtag_uart_write(&jtag_uart_0, uart_rx_buf_ptr, uart_rx_ret, 0);
|
||||
uart_rx_buf_ptr += uart_rx_ret;
|
||||
}
|
||||
}
|
||||
|
||||
int parse_control()
|
||||
{
|
||||
int i, prof_x10=0, ret=0, retval;
|
||||
int i, prof_x10=0, ret;
|
||||
alt_u32 btn_vec, btn_vec_prev=1;
|
||||
alt_u8 pt_only = 0;
|
||||
avinput_t man_target_input = AV_LAST;
|
||||
char *pos;
|
||||
unsigned uart_rx_arg;
|
||||
|
||||
// one for each video_group
|
||||
alt_u8* pmcfg_ptr[] = { &pt_only, &tc.pm_240p, &tc.pm_240p, &tc.pm_384p, &tc.pm_480i, &tc.pm_480i, &tc.pm_480p, &tc.pm_480p, &pt_only, &tc.pm_1080i, &pt_only };
|
||||
@ -339,8 +383,8 @@ Prof_Hotkey_Prompt:
|
||||
|
||||
if ((i == RC_BTN0) || (i < (RC_BTN1 + (prof_x10 == (MAX_PROFILE/10)) ? (MAX_PROFILE%10) : 9))) {
|
||||
profile_sel_menu = prof_x10*10 + ((i+1)%10);
|
||||
retval = load_profile();
|
||||
sniprintf(menu_row2, LCD_ROW_LEN+1, "%s", (retval==0) ? "Done" : "Failed");
|
||||
ret = load_profile();
|
||||
sniprintf(menu_row2, LCD_ROW_LEN+1, "%s", (ret==0) ? "Done" : "Failed");
|
||||
ui_disp_menu(1);
|
||||
usleep(500000);
|
||||
break;
|
||||
@ -376,9 +420,44 @@ Button_Check:
|
||||
if (btn_code & PB1_BIT)
|
||||
tc.sl_mode = tc.sl_mode < SL_MODE_MAX ? tc.sl_mode + 1 : 0;
|
||||
|
||||
// Parse UART RX buffer
|
||||
if (uart_rx_ret > 0) {
|
||||
pos = strpbrk(uart_rx_buf, "\r\n");
|
||||
|
||||
if (pos != NULL) {
|
||||
*pos = 0;
|
||||
if (sscanf(uart_rx_buf, "input %u", &uart_rx_arg) == 1) {
|
||||
if ((uart_rx_arg > AV_TESTPAT) && (uart_rx_arg <= AV3_YPBPR)) {
|
||||
man_target_input = uart_rx_arg;
|
||||
dd_printf("Input %u selected\n", uart_rx_arg);
|
||||
} else {
|
||||
dd_printf("Invalid input ID\n");
|
||||
}
|
||||
} else if (sscanf(uart_rx_buf, "prof %u", &uart_rx_arg) == 1) {
|
||||
if (uart_rx_arg <= MAX_PROFILE) {
|
||||
ret = read_userdata(uart_rx_arg, 0);
|
||||
if (ret >= 0)
|
||||
dd_printf("Profile %u loaded\n", uart_rx_arg);
|
||||
else
|
||||
dd_printf("Profile load failed\n");
|
||||
} else {
|
||||
dd_printf("Invalid profile ID\n");
|
||||
}
|
||||
} else {
|
||||
dd_printf("Unrecognized command\n");
|
||||
}
|
||||
uart_rx_buf_ptr = uart_rx_buf;
|
||||
} else if (uart_rx_buf_ptr >= uart_rx_buf+UART_RX_BUF_SIZE) {
|
||||
dd_printf("\nUnrecognized sequence, RX buffer cleared\n");
|
||||
uart_rx_buf_ptr = uart_rx_buf;
|
||||
}
|
||||
}
|
||||
|
||||
if (man_target_input != AV_LAST) {
|
||||
target_input = man_target_input;
|
||||
ret = 1;
|
||||
} else {
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
sys_ctrl &= ~(3<<LCD_BL_TIMEOUT_OFFS);
|
||||
|
||||
@ -238,7 +238,7 @@ int read_userdata(uint8_t entry, int dry_run) {
|
||||
|
||||
if (strncmp(hdr.userdata_key, "USRDATA", 8)) {
|
||||
printf("No userdata found on entry %u\n", entry);
|
||||
return 1;
|
||||
return -2;
|
||||
}
|
||||
|
||||
strlcpy(target_profile_name, hdr.name, USERDATA_NAME_LEN+1);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user