Skip to content
Permalink
Browse files
New fifo commands have been added. They enable shell scripts to send …
…keyboard and joystick event to the core. Low level SPI write is supported too.
  • Loading branch information
pocomane committed Apr 12, 2020
1 parent 3587874 commit 48c970d37bebd1fce848127307a18ad47dd35abc
Showing with 147 additions and 3 deletions.
  1. +147 −3 input.cpp
150 input.cpp
@@ -2777,6 +2777,152 @@ void mergedevs()
}
}

void cmd_load_rbf(char*cmd)
{
fpga_load_rbf(cmd);
}

void cmd_fpga_set(char*cmd)
{
uint32_t byte = 0, value = 0;
if (2 != sscanf(cmd, "%d %x", &byte, &value))
{
printf("invalid argument\n");
return;
}
switch (byte)
{
break;case 0: ;
break;case 1: spi8(value);
break;case 2: spi16(value);
break;case 3: spi24(value);
break;default: spi32(value);
}
}

int cmdutil_read_enable_param(char*cmd)
{
uint32_t set = 0;
if (1 != sscanf(cmd, "%d", &set))
{
printf("invalid argument\n");
return -1;
}
return !!set;
}

void cmd_en_fpga(char*cmd)
{
int set = cmdutil_read_enable_param(cmd);
if (set < 0) return;
if (set)
EnableFpga();
else
DisableFpga();
}

void cmd_en_osd(char*cmd)
{
int set = cmdutil_read_enable_param(cmd);
if (set < 0) return;
if (set)
EnableOsd();
else
DisableOsd();
}

void cmd_en_dmode(char*cmd){
int set = cmdutil_read_enable_param(cmd);
if (set < 0) return;
if (set)
EnableDMode();
else
DisableDMode();
}

void cmd_en_io(char*cmd)
{
int set = cmdutil_read_enable_param(cmd);
if (set < 0) return;
if (set)
EnableIO();
else
DisableIO();
}

void cmd_user_joy(char*cmd)
{
uint32_t joy = 0;
uint32_t map = 0;
int newdir = 0;
if (3 != sscanf(cmd, "%x %x %d", &joy,&map,&newdir))
{
printf("invalid argument\n");
return;
}
user_io_digital_joystick(joy, map, newdir);
}

void cmd_user_key(char*cmd)
{
uint32_t key = 0;
uint32_t press = 0;
if (2 != sscanf(cmd, "%x %x", &key, &press))
{
printf("invalid argument\n");
return;
}
user_io_kbd(key, press);
}

struct cmdentry
{
const char * name;
void (*cmd)(char*);
};
int cmdlist_compare(const void * a, const void * b)
{
return strcmp(((struct cmdentry*)a)->name, ((struct cmdentry*)b)->name);
}
void handle_MiSTer_cmd(char*cmd)
{
static struct cmdentry cmdlist[] =
{
// Must be lexicographically sorted wrt "name" field (it can not contain ' ' or '\0')
// (e.g. :sort vim command, but mind '!' and escaped chars at end of similar names)
{"enable_dmode", cmd_en_dmode},
{"enable_fpga", cmd_en_fpga},
{"enable_io", cmd_en_io},
{"enable_osd", cmd_en_osd},
{"fb_cmd", video_cmd},
{"fpga_set", cmd_fpga_set},
{"load_core", cmd_load_rbf},
{"user_joy", cmd_user_joy},
{"user_key", cmd_user_key},
};
int namelen;
for (namelen = 0; ; namelen += 1)
if (cmd[namelen] == ' '||cmd[namelen] == '\0')
break;
if (namelen <= 0) return;
char name[namelen+1];
strncpy(name, cmd, namelen);
name[namelen] = '\0';
struct cmdentry target = {name, 0};
struct cmdentry * command = (struct cmdentry*) bsearch(&target , cmdlist,
sizeof(cmdlist)/sizeof(cmdlist[0]), sizeof(cmdlist[0]), cmdlist_compare);
if (!command)
{
printf("invalid MiSTer command: %s\n", cmd);
return;
}
printf("MiSTer command: %s\n", cmd);
cmd += namelen;
if (cmd[namelen] != '\0')
cmd += 1;
command->cmd(cmd);
}

int input_test(int getchar)
{
static char cur_leds = 0;
@@ -3427,9 +3573,7 @@ int input_test(int getchar)
{
if (cmd[len - 1] == '\n') cmd[len - 1] = 0;
cmd[len] = 0;
printf("MiSTer_cmd: %s\n", cmd);
if (!strncmp(cmd, "fb_cmd", 6)) video_cmd(cmd);
else if (!strncmp(cmd, "load_core ", 10)) fpga_load_rbf(cmd + 10);
handle_MiSTer_cmd(cmd);
}
}

0 comments on commit 48c970d

Please sign in to comment.