Commit 786aec8b authored by John Robert Gill's avatar John Robert Gill

Added 32b functions to read/write rfnco.

parent 164912af
......@@ -1010,78 +1010,61 @@ int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
return 0;
}
int libwr2rf_nco_lcfg (struct libwr2rf_dev *dev, unsigned ch,
unsigned lcfg, unsigned long long ftw)
{
unsigned long long LO = 0x1C9BA5E300000;//223.5 MHz
unsigned off = 0;
unsigned harmonic = 4620;
unsigned control = RFNCO_CONTROL_SOFTLOAD;// | RFNCO_CONTROL_SELFTWH1;// | RFNCO_CONTROL_SELWRFTWH1;
unsigned nco_ftw_addr = RFNCO_FTW_H1;
unsigned nco_harmonic_addr = RFNCO_FTW_H;
unsigned nco_LO0_addr = RFNCO_FTW_LO0;
unsigned nco_LO1_addr = RFNCO_FTW_LO1;
unsigned nco_control_addr = RFNCO_CONTROL;
unsigned ftw_src;
switch (ch)
{
case LIBWR2RF_RF1_CHANNEL_ID:
off = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF1_RFNCO;
break;
case LIBWR2RF_RF2_CHANNEL_ID:
off = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF2_RFNCO;
break;
default:
return LIBWR2RF_ERROR_BAD_ID;
}
uint32_t libwr2rf_rfnco_read32 (struct libwr2rf_dev *dev, unsigned id, unsigned off)
{
unsigned addr = 0;
nco_ftw_addr += off;
nco_LO0_addr += off;
nco_LO1_addr += off;
nco_harmonic_addr += off;
nco_control_addr += off;
if (id == LIBWR2RF_RF1_CHANNEL_ID)
addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF1_RFNCO;
else
addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF2_RFNCO;
printf("nco_ftw_addr=%x nco_L00_addr=%x nco_LO1_addr=%x nco_harmonic_addr=%x nco_control_addr=%x\n",
nco_ftw_addr, nco_LO0_addr, nco_LO1_addr, nco_harmonic_addr, nco_control_addr );
addr = addr + off;
return libwr2rf_16x32_read32(dev, addr);
}
ftw_src = libwr2rf_read16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS);
void libwr2rf_rfnco_write32 (struct libwr2rf_dev *dev, unsigned id, unsigned off, uint32_t v)
{
unsigned addr = 0;
if (lcfg == 0) {
printf("lcfg == 0\n");
unsigned val = libwr2rf_16x32_read32(dev, nco_control_addr);
val = val & ~control;
libwr2rf_16x32_write32(dev, nco_control_addr, val);
ftw_src &= ~WR2RF_INIT_REGS_NCO_LOC_OR_WRS_PARAMS_SEL;
libwr2rf_write16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS, ftw_src);
if (id == LIBWR2RF_RF1_CHANNEL_ID)
addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF1_RFNCO;
else
addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF2_RFNCO;
addr = addr + off;
libwr2rf_16x32_write32(dev, addr, v);
}
return 0;
}
ftw_src |= WR2RF_INIT_REGS_NCO_LOC_OR_WRS_PARAMS_SEL;
libwr2rf_write16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS, ftw_src);
int libwr2rf_nco_lcfg (struct libwr2rf_dev *dev, unsigned lcfg, unsigned long long ftw_rfnco1,
unsigned long long ftw_rfnco2)
{
unsigned control_lcfg = RFNCO_CONTROL_SOFTLOAD;
unsigned control_wrcfg = RFNCO_CONTROL_SELFTWH1 | RFNCO_CONTROL_EXTRESETENABLE | RFNCO_CONTROL_SELLOAD | RFNCO_CONTROL_SELWRFTWH1;
unsigned nco1_ftw_addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF1_RFNCO + RFNCO_FTW_H1;
unsigned nco2_ftw_addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF2_RFNCO + RFNCO_FTW_H1;
unsigned nco1_control_addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF1_RFNCO + RFNCO_CONTROL;
unsigned nco2_control_addr = WR2RF_VME_REGS_CTRL + WR2RF_CTRL_REGS_RF2_RFNCO + RFNCO_CONTROL;
printf("nco_ftw_addr=%lx nco_ctrl_addr=%lx\n", RFNCO_FTW_H1, RFNCO_CONTROL);
if (lcfg == 0) {
/* Use network as RFNCO source. */
libwr2rf_write16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS, 0);
libwr2rf_16x32_write32(dev, nco_ftw_addr+0, ftw);
libwr2rf_16x32_write32(dev, nco_ftw_addr+4, ftw >> 32);
libwr2rf_16x32_write32(dev, nco1_control_addr, control_wrcfg);
libwr2rf_16x32_write32(dev, nco2_control_addr, control_wrcfg);
return 0;
}
libwr2rf_16x32_write32(dev, nco_LO0_addr+0, LO);
libwr2rf_16x32_write32(dev, nco_LO0_addr+4, LO >> 32);
libwr2rf_16x32_write32(dev, nco_LO1_addr+0, LO);
libwr2rf_16x32_write32(dev, nco_LO1_addr+4, LO >> 32);
libwr2rf_write16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS, 1);
libwr2rf_16x32_write32(dev, nco_harmonic_addr, harmonic);
libwr2rf_16x32_write32(dev, nco_control_addr, control);
libwr2rf_16x32_write64(dev, nco1_ftw_addr, ftw_rfnco1);
libwr2rf_16x32_write64(dev, nco2_ftw_addr, ftw_rfnco2);
printf("ftw=%08x.%08x LO=%08x.%08x L1=%08x.%08x harmonic=%08x control=%08x \n",
libwr2rf_16x32_read32(dev, nco_ftw_addr+4),
libwr2rf_16x32_read32(dev, nco_ftw_addr+0),
libwr2rf_16x32_read32(dev, nco_LO0_addr+4),
libwr2rf_16x32_read32(dev, nco_LO0_addr+0),
libwr2rf_16x32_read32(dev, nco_LO1_addr+4),
libwr2rf_16x32_read32(dev, nco_LO1_addr+0),
libwr2rf_16x32_read32(dev, nco_harmonic_addr),
libwr2rf_16x32_read32(dev, nco_control_addr) );
libwr2rf_16x32_write32(dev, nco1_control_addr, control_lcfg);
libwr2rf_16x32_write32(dev, nco2_control_addr, control_lcfg);
return 0;
}
......
......@@ -240,8 +240,9 @@ int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
/* Program the RFNCO to enable/disable local FTW configuration, rather than from the network.
lcfg is enable(1)/disable(0)
ftw is the 48 bit frev value. */
int libwr2rf_nco_lcfg (struct libwr2rf_dev *dev, unsigned ch,
unsigned lcfg, unsigned long long ftw );
int libwr2rf_nco_lcfg (struct libwr2rf_dev *dev, unsigned lcfg,
unsigned long long ftw_rfnco1,
unsigned long long ftw_rfnco2 );
/* Dump (on stdout) the state of VTU ID. Return < 0 in case of error (bad ID).
This is a debug function. */
......
......@@ -9,4 +9,8 @@ struct libwr2rf_dev;
void libwr2rf_write16 (struct libwr2rf_dev *dev, unsigned off, uint16_t v);
uint16_t libwr2rf_read16 (struct libwr2rf_dev *dev, unsigned off);
/* Defined in board.c */
void libwr2rf_rfnco_write32 (struct libwr2rf_dev *dev, unsigned id, unsigned off, uint32_t v);
uint32_t libwr2rf_rfnco_read32 (struct libwr2rf_dev *dev, unsigned id, unsigned off);
#endif /* __IO_H_ */
......@@ -3781,6 +3781,61 @@ api_diag_read (struct libwr2rf_dev *dev, int argc, char **argv)
printf ("total count: %u\n", count);
}
static void
api_rfnco_read32 (struct libwr2rf_dev *dev, int argc, char **argv)
{
unsigned rfnco_idx = 0;
unsigned addr_off = 0; // bytes
unsigned max_off = 4096; // max address space for rfnco
if (argc != 3)
goto usage;
rfnco_idx = strtoul(argv[1], NULL, 0);
addr_off = strtoul(argv[2], NULL, 0);
if (rfnco_idx != 1 && rfnco_idx != 2)
goto usage;
if (addr_off >= max_off)
goto usage;
if (libwr2rf_rfnco_read32 (dev, rfnco_idx, addr_off) != 0) {
printf ("ERROR\n");
return;
}
return;
usage:
printf ("usage: %s rfnco rfnco_addr_in_bytes\n", argv[0]);
}
static void
api_rfnco_write32 (struct libwr2rf_dev *dev, int argc, char **argv)
{
unsigned rfnco_idx = 0;
unsigned addr_off = 0; // bytes
unsigned max_off = 4096;
unsigned val = 0;
if (argc != 4)
goto usage;
rfnco_idx = strtoul(argv[1], NULL, 0);
addr_off = strtoul(argv[2], NULL, 0);
val = strtoul(argv[3], NULL, 0);
if (rfnco_idx != 1 && rfnco_idx != 2)
goto usage;
if (addr_off >= max_off)
goto usage;
libwr2rf_rfnco_write32 (dev, rfnco_idx, addr_off, val);
return;
usage:
printf ("usage: %s rfnco rfnco_addr_in_bytes val\n", argv[0]);
}
static void
api_nco_reset_delay (struct libwr2rf_dev *dev, int argc, char **argv)
{
......@@ -3806,21 +3861,23 @@ api_nco_reset_delay (struct libwr2rf_dev *dev, int argc, char **argv)
static void
api_nco_lcfg (struct libwr2rf_dev *dev, int argc, char **argv)
{
unsigned ch;
unsigned lcfg;
unsigned long long ftw;
unsigned lcfg = 0;
unsigned long long ftw_rfnco1 = 0;
unsigned long long ftw_rfnco2 = 0;
if (argc != 4) {
printf ("usage: %s CH lcfg_enable ftw\n", argv[0]);
if (argc != 4 && argc != 2) {
printf ("usage: %s lcfg_enable [ftw_rfnco1 ftw_rfnco2]\n", argv[0]);
return;
}
ch = strtoul(argv[1], NULL, 0);
lcfg = strtoul(argv[2], NULL, 0);
ftw = strtoull(argv[3], NULL, 0);
lcfg = strtoul(argv[1], NULL, 0);
if (argc == 4) {
ftw_rfnco1 = strtoull(argv[2], NULL, 0);
ftw_rfnco2 = strtoull(argv[3], NULL, 0);
}
printf("ch=%d lcfg=%d ftw=%llx\n", ch, lcfg, ftw);
if (libwr2rf_nco_lcfg(dev, ch, lcfg, ftw) != 0)
printf("lcfg=%d ftw1=%llx ftw2=%llx\n", lcfg, ftw_rfnco1, ftw_rfnco2);
if (libwr2rf_nco_lcfg(dev, lcfg, ftw_rfnco1, ftw_rfnco2) != 0)
printf ("ERROR\n");
}
......@@ -4004,6 +4061,8 @@ static struct cmds cmds[] =
{ "api-softstop-sel", api_softstop_sel, "configure which vtu soft stop can be output to lemo"},
{ "api-diag-enable", api_diag_enable, "configure diag unit"},
{ "api-diag-read", api_diag_read, "read diag unit"},
{ "api-rfnco-read32", api_rfnco_read32, "Perform a 32b read access via the RFNCO's AXI i/f"},
{ "api-rfnco-write32", api_rfnco_write32, "Perform a 32b write access via the RFNCO's AXI i/f"},
{ "api-nco-reset-delay", api_nco_reset_delay, "set nco reset delay"},
{ "api-nco-lcfg", api_nco_lcfg, "configures the RFNCO to output a local fixed frequency." },
{ "api-tmgio", api_tmgio, "set lemo io output enable and termination"},
......
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