Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
W
wr2rf-vme
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
5
Issues
5
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
wr2rf-vme
Commits
bf56e518
Commit
bf56e518
authored
Aug 25, 2021
by
John Gill
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag v0.11.4 into master
parents
9ffdc157
786aec8b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
193 additions
and
1 deletion
+193
-1
ad9910_init.c
software/libwr2rf/ad9910_init.c
+21
-0
board.c
software/libwr2rf/board.c
+59
-0
api.h
software/libwr2rf/libwr2rf/api.h
+6
-0
io.h
software/libwr2rf/libwr2rf/io.h
+4
-0
wr2rf.c
software/libwr2rf/wr2rf.c
+103
-1
No files found.
software/libwr2rf/ad9910_init.c
View file @
bf56e518
...
...
@@ -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
)
{
...
...
software/libwr2rf/board.c
View file @
bf56e518
...
...
@@ -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
;
...
...
software/libwr2rf/libwr2rf/api.h
View file @
bf56e518
...
...
@@ -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. */
...
...
software/libwr2rf/libwr2rf/io.h
View file @
bf56e518
...
...
@@ -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_ */
software/libwr2rf/wr2rf.c
View file @
bf56e518
...
...
@@ -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"
},
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment