Commit 3100cc17 authored by Tristan Gingold's avatar Tristan Gingold

fip_urv: add -t, add slots command.

parent fc529788
......@@ -34,6 +34,8 @@
#include "fip_urv_cmd.h"
#define IO_ADDR 0x100000
static const uint16_t ftb_var_id[2] = {
0x05, /* produced var */
0x06, /* consumed var */
......@@ -89,6 +91,8 @@ struct ftb_dev {
unsigned waitrep;
} *ftb;
static int flag_trace;
static int read_vars(void)
{
struct mstrfip_data *pvar = ftb->ba.cons_varlist[0];
......@@ -99,7 +103,7 @@ static int read_vars(void)
switch (pvar->status) {
case MSTRFIP_DATA_OK:
if (1) {
if (flag_trace) {
printf ("Recv:");
for (unsigned j = 0; j < VAR_LENGTH; j++)
printf(" %02x", pvar->buffer[j]);
......@@ -117,6 +121,10 @@ static int read_vars(void)
if (cmd->cb != NULL) {
res = cmd->cb (cmd, pvar->buffer);
if (res < 0) {
/* Will stop. */
ftb->idx_cmd = ftb->nbr_cmds;
}
}
else
res = 0;
......@@ -172,7 +180,8 @@ static int update_vars(void)
pvar->bsz = 72;
pvar->buffer[0] = CMD_ERROR;
pvar->buffer[1] = 0xff;
printf ("Send padding\n");
if (flag_trace)
printf ("Send padding\n");
}
else if (ftb->idx_cmd >= ftb->nbr_cmds) {
kill(getpid(), SIGINT);
......@@ -189,10 +198,12 @@ static int update_vars(void)
pvar->buffer[1] = cmd->id;
memcpy (pvar->buffer + 4, cmd->args, cmd->len);
printf ("Send 0x%02x, len=%d:", cmd->cmd, pvar->bsz);
for (unsigned j = 0; j < 4 + cmd->len; j++)
printf (" %02x", pvar->buffer[j]);
printf ("\n");
if (flag_trace) {
printf ("Send 0x%02x, len=%d:", cmd->cmd, pvar->bsz);
for (unsigned j = 0; j < 4 + cmd->len; j++)
printf (" %02x", pvar->buffer[j]);
printf ("\n");
}
ftb->waitrep = 1;
}
......@@ -414,6 +425,39 @@ static int cb_read_word (struct urv_cmd *cmd, unsigned char *rep)
return 0;
}
static int cb_slots (struct urv_cmd *cmd, unsigned char *rep)
{
unsigned addr = word_unpack(&cmd->args[0]);
unsigned slot = (addr - IO_ADDR - 0x40) >> 2;
int i;
unsigned val;
val = word_unpack(&rep[4]);
printf ("Slot %d: ", slot);
for (i = 31; i >= 0; i--) {
putc ((val & (1 << i)) ? '*' : '.', stdout);
if (i == 16)
putc (' ', stdout);
}
putc ('\n', stdout);
if (slot == 7)
return 0;
addr += 4;
word_pack(&cmd->args[0], addr);
return 1;
}
static int cb_check_off (struct urv_cmd *cmd, unsigned char *rep)
{
unsigned val = word_unpack(&rep[4]);
if (val != 0) {
fprintf (stderr, "PLC cpu is still running (do 'plc off')\n");
return -1;
}
return 0;
}
static Elf32_Half read_elf_half (const Elf32_Half *v)
{
const unsigned char *p = (const unsigned char *)v;
......@@ -457,7 +501,7 @@ static int load_cb_prepare(struct urv_cmd *cmd)
cmd->cmd = CMD_WRITE_BLOCK;
cmd->len = 4 + l;
word_pack(&cmd->args[0], 0x100000 + 0x2000 + dat->off);
word_pack(&cmd->args[0], IO_ADDR + 0x2000 + dat->off);
memcpy (&cmd->args[4], dat->buf + dat->off, l);
cmd->cb = cb_load;
dat->off += l;
......@@ -572,6 +616,35 @@ static int cmd_load (const char *filename)
return -1;
}
static int cmd_reset (unsigned val)
{
struct urv_cmd cmd;
cmd.cmd = CMD_WRITE_WORD;
cmd.len = 8;
word_pack(&cmd.args[0], IO_ADDR + 0);
word_pack(&cmd.args[4], val == 0);
cmd.cb = NULL;
if (append_command(ftb, &cmd) != 0)
return -1;
return 0;
}
static int cmd_check_off (void)
{
struct urv_cmd cmd;
cmd.cmd = CMD_READ_WORD;
cmd.len = 4;
word_pack(&cmd.args[0], IO_ADDR + 0);
cmd.cb = cb_check_off;
if (append_command(ftb, &cmd) != 0)
return -1;
return 0;
}
/* Return the number of arguments consumed.
0: argument unknown,
< 0: bad argument (error). */
......@@ -674,6 +747,17 @@ static int decode_command (int argc, char *argv[])
return -1;
return 3;
}
else if (strcmp (argv[0], "plc") == 0)
{
if (argc > 1) {
if (strcmp (argv[1], "on") == 0)
return cmd_reset (0) < 0 ? -1 : 2;
if (strcmp (argv[1], "off") == 0)
return cmd_reset (1) < 0 ? -1 : 2;
}
fprintf (stderr, "plc requires on/off\n");
return -1;
}
else if (strcmp (argv[0], "load") == 0)
{
if (argc < 2) {
......@@ -681,10 +765,30 @@ static int decode_command (int argc, char *argv[])
return -1;
}
if (cmd_check_off () < 0)
return -1;
if (cmd_load(argv[1]) < 0)
return -1;
if (cmd_reset (0) != 0)
return -1;
return 2;
}
else if (strcmp (argv[0], "slots") == 0)
{
struct urv_cmd cmd;
cmd.cmd = CMD_READ_WORD;
cmd.len = 4;
word_pack(&cmd.args[0], IO_ADDR + 0x40);
cmd.cb = cb_slots;
if (append_command(ftb, &cmd) != 0)
return -1;
printf (" 1111111 relays 1111111 loops\n");
printf ("slot 6543210987654321 6543210987654321\n");
return 1;
}
else
return 0;
}
......@@ -707,20 +811,31 @@ int main(int argc, char *argv[])
memset(ftb, 0, sizeof(struct ftb_dev));
ftb->var_length = VAR_LENGTH;
ftb->cycle_uslength = 500000;
ftb->cycle_uslength = 5000;
ftb->nbr_cmds = 0;
ftb->idx_cmd = 0;
ftb->waitrep = 0;
if (argc <= 1) {
/* Skip progname. */
argc--;
argv++;
while (argc > 0 && argv[0][0] == '-') {
if (strcmp (argv[0], "-t") == 0)
flag_trace++;
else {
fprintf (stderr, "unknown option %s\n", argv[0]);
return 1;
}
argc--;
argv++;
}
if (argc == 0) {
fprintf (stderr, "no commands\n");
return 1;
}
/* TODO: handle options. */
argc--;
argv++;
while (argc > 0) {
res = decode_command (argc, argv);
if (res == 0) {
......
#ifndef __CHEBY__MBOX_REGS__H__
#define __CHEBY__MBOX_REGS__H__
#define MBOX_REGS_SIZE 12
/* Mailbox to the fip urv */
#define MBOX_REGS_MBOXOUT 0x0UL
/* Mailbox from the fip urv */
#define MBOX_REGS_MBOXIN 0x4UL
/* Status for mailboxes */
#define MBOX_REGS_STATUS 0x8UL
#define MBOX_REGS_STATUS_MBIN 0x1UL
#define MBOX_REGS_STATUS_MBOUT 0x2UL
struct mbox_regs {
/* [0x0]: REG (wo) Mailbox to the fip urv */
uint32_t mboxout;
/* [0x4]: REG (ro) Mailbox from the fip urv */
uint32_t mboxin;
/* [0x8]: REG (ro) Status for mailboxes */
uint32_t status;
};
#endif /* __CHEBY__MBOX_REGS__H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment