Commit bf56e518 authored by John Gill's avatar John Gill

Merge tag v0.11.4 into master

parents 9ffdc157 786aec8b
......@@ -129,6 +129,27 @@ libwr2rf_dds_init(struct libwr2rf_dev *dev, unsigned io_update)
return 0;
}
int
libwr2rf_dds_freq_init(struct libwr2rf_dev *dev, uint64_t freq, unsigned io_update)
{
int res;
/* Probe. */
res = ad9910_probe(dev);
if (res != 0)
return res;
/* Configure sync. */
/* TODO. */
libwr2rf_dds_configure_sync(dev, 0, 0, 0);
/* Program. */
uint64_t ftw = ad9910_frequency_to_ftw(freq);
ad9910_program(dev, ftw, 0, 0x0, io_update);
return 0;
}
void
libwr2rf_dds_sync_calibrate (struct libwr2rf_dev *dev, int verbose)
{
......
......@@ -1010,6 +1010,65 @@ int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
return 0;
}
uint32_t libwr2rf_rfnco_read32 (struct libwr2rf_dev *dev, unsigned id, unsigned off)
{
unsigned addr = 0;
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;
return libwr2rf_16x32_read32(dev, addr);
}
void libwr2rf_rfnco_write32 (struct libwr2rf_dev *dev, unsigned id, unsigned off, uint32_t v)
{
unsigned addr = 0;
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);
}
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, nco1_control_addr, control_wrcfg);
libwr2rf_16x32_write32(dev, nco2_control_addr, control_wrcfg);
return 0;
}
libwr2rf_write16(dev, WR2RF_VME_REGS_INIT + WR2RF_INIT_REGS_NCO_LOC_OR_WRS, 1);
libwr2rf_16x32_write64(dev, nco1_ftw_addr, ftw_rfnco1);
libwr2rf_16x32_write64(dev, nco2_ftw_addr, ftw_rfnco2);
libwr2rf_16x32_write32(dev, nco1_control_addr, control_lcfg);
libwr2rf_16x32_write32(dev, nco2_control_addr, control_lcfg);
return 0;
}
int libwr2rf_vtu_rf_reset_offset (struct libwr2rf_dev *dev, unsigned id, unsigned wr_cycles)
{
unsigned addr = 0;
......
......@@ -237,6 +237,12 @@ int libwr2rf_vtu_program_invalidate (struct libwr2rf_dev *dev, unsigned id);
int libwr2rf_vtu_nco_reset_delay (struct libwr2rf_dev *dev, unsigned id,
unsigned cdelay, unsigned fdelay,
unsigned odelay);
/* 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 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_ */
......@@ -639,6 +639,9 @@ nco_lcfg (struct libwr2rf_dev *dev, int argc, char **argv)
libwr2rf_16x32_write32(dev, nco_harmonic_addr, harmonic);
libwr2rf_16x32_write32(dev, nco_control_addr, control);
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 );
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),
......@@ -699,7 +702,8 @@ nco_wrcfg (struct libwr2rf_dev *dev, int argc, char **argv)
unsigned long long LO1 = 0x1C9BA5E300000;//223.5 MHz
unsigned off = 0;
unsigned harmonic = 4620;
unsigned control = RFNCO_CONTROL_SELFTWH1 | RFNCO_CONTROL_EXTRESETENABLE | RFNCO_CONTROL_SELLOAD | RFNCO_CONTROL_SELWRFTWH1;
unsigned control = RFNCO_CONTROL_SELFTWH1 | RFNCO_CONTROL_EXTRESETENABLE | RFNCO_CONTROL_SELLOAD |
RFNCO_CONTROL_SELWRFTWH1;
unsigned nco_harmonic_addr = RFNCO_FTW_H;
unsigned nco_LO0_addr = RFNCO_FTW_LO0;
unsigned nco_LO1_addr = RFNCO_FTW_LO1;
......@@ -1482,6 +1486,21 @@ dds_ioupdate (struct libwr2rf_dev *dev, int argc, char **argv)
libwr2rf_dds_ioupdate(dev);
}
static void
dds_freq (struct libwr2rf_dev *dev, int argc, char **argv)
{
if (argc != 2) {
printf ("usage: %s dds_freq\n", argv[0]);
return;
}
uint64_t freq = strtoull(argv[1], NULL, 0);
libwr2rf_dds_freq_init(dev, freq, 1);
return;
}
static void
set_rfout (struct libwr2rf_dev *dev, int argc, char **argv)
{
......@@ -3762,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)
{
......@@ -3784,6 +3858,30 @@ api_nco_reset_delay (struct libwr2rf_dev *dev, int argc, char **argv)
printf ("ERROR\n");
}
static void
api_nco_lcfg (struct libwr2rf_dev *dev, int argc, char **argv)
{
unsigned lcfg = 0;
unsigned long long ftw_rfnco1 = 0;
unsigned long long ftw_rfnco2 = 0;
if (argc != 4 && argc != 2) {
printf ("usage: %s lcfg_enable [ftw_rfnco1 ftw_rfnco2]\n", argv[0]);
return;
}
lcfg = strtoul(argv[1], NULL, 0);
if (argc == 4) {
ftw_rfnco1 = strtoull(argv[2], NULL, 0);
ftw_rfnco2 = strtoull(argv[3], NULL, 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");
}
static void
api_nco_reset_ignore (struct libwr2rf_dev *dev, int argc, char **argv)
{
......@@ -3963,7 +4061,10 @@ 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"},
{ "api-tmgclk", api_tmgclk, "set lemo clk output enable and termination"},
{ "api-nco-reset-ignore", api_nco_reset_ignore, "ignore (or not) nco reset"},
......@@ -4007,6 +4108,7 @@ static struct cmds cmds[] =
{ "dds-sync-set", dds_sync_set, "writes the ad9910's sync_receiver_delay and sync_validation_delay values" },
{ "dds-sync-status", dds_sync_status, "Reads the dds sync error status" },
{ "dds-ioupdate", dds_ioupdate, "Resets the output phase of the RF (if already preprogrammed)" },
{ "dds-freq", dds_freq, "control the DDS output frequency - useful for standalone DDS rf signal output"},
{ "dac-xdds", dac_xdds, "control the xilinx DDS for testing the IQdac"},
{ "dac-iqsetpoint", dac_iqsetpoint, "configures the amplitude and phase for the IQdacs"},
{ "dac-iqctrl", dac_iqctrl, "Selects the IQdata lines between RFNCO+IQMod or debug DDS"},
......
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