Commit 66abae64 authored by Tristan Gingold's avatar Tristan Gingold

libwr2rf: add libwr2rf_vtu_dump

parent 8b550c3a
#include <stddef.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "libwr2rf/board.h"
#include "libwr2rf/api.h"
#include "regs.h"
......@@ -832,6 +834,138 @@ int libwr2rf_vtu_program_invalidate (struct libwr2rf_dev *dev, unsigned id)
return 0;
}
struct vtu_mode_xtab {
unsigned val;
const char *name;
};
static const struct vtu_mode_xtab vtu_modes[] =
{
{ 0x00, "pulse"},
{ 0x01, "infinite"},
{ 0x02, "window"},
{ 0x03, "syncless"},
{ 0x04, "lowfreq"},
{ 0x05, "play"},
{ 0x06, "highfreq"},
{ 0, NULL}
};
static const char *
libwr2rf_vtu_get_mode(unsigned val)
{
const struct vtu_mode_xtab *e;
for (e = vtu_modes; e->name; e++)
if (e->val == val)
return e->name;
return "ERROR";
}
int
libwr2rf_vtu_get_mode_by_name(const char *name)
{
const struct vtu_mode_xtab *e;
for (e = vtu_modes; e->name; e++)
if (strcmp (name, e->name) == 0) {
return e->val;
}
return -1;
}
const char *
libwr2rf_vtu_get_mode_by_index(unsigned idx)
{
if (idx >= sizeof(vtu_modes)/sizeof(vtu_modes[0]))
return NULL;
return vtu_modes[idx].name;
}
void
libwr2rf_vtu_dump_by_addr(struct libwr2rf_dev *dev, unsigned addr)
{
unsigned v;
uint64_t v64;
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_STATUS);
printf ("vtu status: 0x%04x [@ 0x%x]\n", v, addr);
printf (" idle: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_IDLE));
printf (" started: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_STARTED));
printf (" missvalid: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_MISSVALID));
printf (" missready: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_MISSREADY));
printf (" startready: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_STARTREADY));
printf (" running: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_RUNNING));
printf (" wrongb: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGBVALUE));
printf (" wronght: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGHTVALUE));
printf (" wrongw: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGWVALUE));
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONTROL);
printf ("vtureset: %u\n", !!(v & TRIGUNIT_REGS_CONTROL_VTURESET));
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONFIGOFFLINE);
printf ("configoffline: 0x%04x\n", v);
printf (" mode: 0x%04x (%s)\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_MODE_MASK),
libwr2rf_vtu_get_mode((v & TRIGUNIT_REGS_CONFIGOFFLINE_MODE_MASK) >> TRIGUNIT_REGS_CONFIGOFFLINE_MODE_SHIFT));
printf (" htswitchingenable: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_HTSWITCHINGENABLE));
printf (" valid: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_VALID));
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_BVALUEOFFLINE);
printf ("bvalueoffline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_HTVALUEOFFLINE);
printf ("htvalueoffline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_WVALUEOFFLINE);
printf ("wvalueoffline: %lu\n", v64);
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONFIGONLINE);
printf ("configonline: 0x%04x\n", v);
printf (" mode: 0x%04x (%s)\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGONLINE_MODE_MASK),
libwr2rf_vtu_get_mode((v & TRIGUNIT_REGS_CONFIGONLINE_MODE_MASK) >> TRIGUNIT_REGS_CONFIGONLINE_MODE_SHIFT));
printf (" htswitchingenable: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGONLINE_HTSWITCHINGENABLE));
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_BVALUEONLINE);
printf ("bvalueonline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_HTVALUEONLINE);
printf ("htvalueonline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_WVALUEONLINE);
printf ("wvalueonline: %lu\n", v64);
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_TRIGODELAY);
printf ("trigodelay: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_TRIGODELAY_DELAY_MASK));
}
int
libwr2rf_vtu_dump (struct libwr2rf_dev *dev, unsigned id)
{
unsigned addr = trig_id_to_addr (id);
if (addr == 0)
return -1;
libwr2rf_vtu_dump_by_addr(dev, addr);
return 0;
}
int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
unsigned cdelay, unsigned fdelay, unsigned odelay)
{
......
......@@ -200,14 +200,20 @@ int libwr2rf_vtu_program_invalidate (struct libwr2rf_dev *dev, unsigned id);
/* Specify the delay between the NCO reset (from WR) and the sync input of
trig 1. CDELAY unit is 16ns, FDELAY unit is 1ns. */
int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
unsigned cdelay, unsigned fdelay, unsigned odelay);
unsigned cdelay, unsigned fdelay,
unsigned odelay);
/* Dump (on stdout) the state of VTU ID. Return < 0 in case of error (bad ID).
This is a debug function. */
int libwr2rf_vtu_dump (struct libwr2rf_dev *dev, unsigned id);
/* Specify the ioupdate fine delay and ODELAY values */
int libwr2rf_ioupdate_delay (struct libwr2rf_dev *dev, unsigned fdelay, unsigned odelay);
/* Set WR streamer fixed latency: the delay between the sent time and the apply
time (in WR cycles ie 16ns). */
void libwr2rf_set_wrs_fixed_latency (struct libwr2rf_dev *dev, unsigned wr_cycles);
void libwr2rf_set_wrs_fixed_latency (struct libwr2rf_dev *dev,
unsigned wr_cycles);
unsigned libwr2rf_get_wrs_fixed_latency (struct libwr2rf_dev *dev);
/* Set WR streamer timeout latency: the maximum time the packet arrive in advance.
......
......@@ -62,4 +62,8 @@ void libwr2rf_be_write64(struct libwr2rf_dev *dev, unsigned off, uint64_t val);
uint32_t libwr2rf_wrc_read32(struct libwr2rf_dev *dev, unsigned off);
void libwr2rf_wrc_write32(struct libwr2rf_dev *dev, unsigned off, uint32_t val);
void libwr2rf_vtu_dump_by_addr(struct libwr2rf_dev *dev, unsigned addr);
const char *libwr2rf_vtu_get_mode_by_index(unsigned idx);
int libwr2rf_vtu_get_mode_by_name(const char *name);
#endif /* __BOARD_H_ */
......@@ -2522,34 +2522,6 @@ parse_vtu (const char *arg,
return addr;
}
struct vtu_mode_xtab {
unsigned val;
const char *name;
};
static const struct vtu_mode_xtab vtu_modes[] =
{
{ 0x00, "pulse"},
{ 0x01, "infinite"},
{ 0x02, "window"},
{ 0x03, "syncless"},
{ 0x04, "lowfreq"},
{ 0x05, "play"},
{ 0x06, "highfreq"},
{ 0, NULL}
};
static const char *
get_vtu_mode(unsigned val)
{
const struct vtu_mode_xtab *e;
for (e = vtu_modes; e->name; e++)
if (e->val == val)
return e->name;
return "ERROR";
}
static void
vtu (struct libwr2rf_dev *dev, int argc, char **argv)
{
......@@ -2566,73 +2538,7 @@ vtu (struct libwr2rf_dev *dev, int argc, char **argv)
}
if (argc == 2) {
unsigned v;
uint64_t v64;
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_STATUS);
printf ("vtu status: 0x%04x [@ 0x%x]\n", v, addr);
printf (" idle: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_IDLE));
printf (" started: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_STARTED));
printf (" missvalid: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_MISSVALID));
printf (" missready: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_MISSREADY));
printf (" startready: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_STARTREADY));
printf (" running: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_RUNNING));
printf (" wrongb: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGBVALUE));
printf (" wronght: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGHTVALUE));
printf (" wrongw: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_STATUS_WRONGWVALUE));
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONTROL);
printf ("vtureset: %u\n", !!(v & TRIGUNIT_REGS_CONTROL_VTURESET));
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONFIGOFFLINE);
printf ("configoffline: 0x%04x\n", v);
printf (" mode: 0x%04x (%s)\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_MODE_MASK),
get_vtu_mode((v & TRIGUNIT_REGS_CONFIGOFFLINE_MODE_MASK) >> TRIGUNIT_REGS_CONFIGOFFLINE_MODE_SHIFT));
printf (" htswitchingenable: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_HTSWITCHINGENABLE));
printf (" valid: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGOFFLINE_VALID));
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_BVALUEOFFLINE);
printf ("bvalueoffline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_HTVALUEOFFLINE);
printf ("htvalueoffline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_WVALUEOFFLINE);
printf ("wvalueoffline: %lu\n", v64);
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_CONFIGONLINE);
printf ("configonline: 0x%04x\n", v);
printf (" mode: 0x%04x (%s)\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGONLINE_MODE_MASK),
get_vtu_mode((v & TRIGUNIT_REGS_CONFIGONLINE_MODE_MASK) >> TRIGUNIT_REGS_CONFIGONLINE_MODE_SHIFT));
printf (" htswitchingenable: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_CONFIGONLINE_HTSWITCHINGENABLE));
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_BVALUEONLINE);
printf ("bvalueonline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_HTVALUEONLINE);
printf ("htvalueonline: %lu\n", v64);
v64 = libwr2rf_be_read64(dev, addr + TRIGUNIT_REGS_WVALUEONLINE);
printf ("wvalueonline: %lu\n", v64);
v = libwr2rf_read16(dev, addr + TRIGUNIT_REGS_TRIGODELAY);
printf ("trigodelay: 0x%04x\n",
(unsigned)(v & TRIGUNIT_REGS_TRIGODELAY_DELAY_MASK));
libwr2rf_vtu_dump_by_addr(dev, addr);
printf ("vtu diag:\n");
disp_vtudiag(dev, addr + TRIGUNIT_REGS_TRIGDIAG);
}
......@@ -2658,19 +2564,18 @@ vtu (struct libwr2rf_dev *dev, int argc, char **argv)
libwr2rf_be_write64(dev, addr + TRIGUNIT_REGS_WVALUEOFFLINE, v);
}
else if (argc == 4 && strcmp(argv[2], "mode") == 0) {
const struct vtu_mode_xtab *e;
unsigned v;
unsigned mode;
int mode;
for (e = vtu_modes; e->name; e++)
if (strcmp(argv[3], e->name) == 0) {
mode = e->val;
break;
}
if (e->name == NULL) {
mode = libwr2rf_vtu_get_mode_by_name(argv[3]);
if (mode == -1) {
printf ("bad vtu mode, expect:");
for (e = vtu_modes; e->name; e++)
printf (" %s", e->name);
for (v = 0; ; v++) {
const char *name = libwr2rf_vtu_get_mode_by_index(v);
if (name == NULL)
break;
printf (" %s", name);
}
printf ("\n");
return;
}
......
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