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
786aec8b
Commit
786aec8b
authored
Jun 25, 2021
by
John Robert Gill
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added 32b functions to read/write rfnco.
parent
164912af
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
120 additions
and
73 deletions
+120
-73
board.c
software/libwr2rf/board.c
+44
-61
api.h
software/libwr2rf/libwr2rf/api.h
+3
-2
io.h
software/libwr2rf/libwr2rf/io.h
+4
-0
wr2rf.c
software/libwr2rf/wr2rf.c
+69
-10
No files found.
software/libwr2rf/board.c
View file @
786aec8b
...
...
@@ -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_write
32
(
dev
,
nco_harmonic_addr
,
harmonic
);
libwr2rf_16x32_write
32
(
dev
,
nco_control_addr
,
control
);
libwr2rf_16x32_write
64
(
dev
,
nco1_ftw_addr
,
ftw_rfnco1
);
libwr2rf_16x32_write
64
(
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
;
}
...
...
software/libwr2rf/libwr2rf/api.h
View file @
786aec8b
...
...
@@ -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. */
...
...
software/libwr2rf/libwr2rf/io.h
View file @
786aec8b
...
...
@@ -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 @
786aec8b
...
...
@@ -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"
},
...
...
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