Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
W
White Rabbit Switch - Software
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
86
Issues
86
List
Board
Labels
Milestones
Merge Requests
4
Merge Requests
4
CI / CD
CI / CD
Pipelines
Schedules
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
White Rabbit Switch - Software
Commits
9adc82e1
Commit
9adc82e1
authored
Aug 25, 2020
by
José López Jiménez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Created user tool to control holdover
parent
faf5f7a0
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
180 additions
and
0 deletions
+180
-0
Makefile
userspace/tools/Makefile
+1
-0
wrs_ho_ctrl.c
userspace/tools/wrs_ho_ctrl.c
+179
-0
No files found.
userspace/tools/Makefile
View file @
9adc82e1
...
...
@@ -12,6 +12,7 @@ TOOLS += wrs_sfp_dump
TOOLS
+=
wrs_throttling
TOOLS
+=
wrs_spll_tune
TOOLS
+=
csac-uart
TOOLS
+=
wrs_ho_ctrl
PPSI_CONFIG
=
../ppsi/include/generated/autoconf.h
WR_INSTALL_ROOT
?=
/usr/lib/white-rabbit
...
...
userspace/tools/wrs_ho_ctrl.c
0 → 100644
View file @
9adc82e1
#include <signal.h>
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <ctype.h>
#include <strings.h>
#include <time.h>
#include <getopt.h>
#include <libwr/shw_io.h>
#include "fpga_io.h"
#include <libwr/switch_hw.h>
#define SPLL_WB_BASE 0x10300
#define SPLL_HO_CR 0x54
#define SPLL_HO_RATE 0x58
#define SPLL_FUNC_SEL_MSK 0x00000F00
#define SPLL_LRN_EN_MSK 0x00000010
#define SPLL_HO_EN_MSK 0x00000001
#define HO_ON 1
#define HO_OFF 0
#define LRN_ON 1
#define LRN_OFF 0
void
error
(
char
*
msg
)
{
perror
(
msg
);
exit
(
0
);
}
void
printHelp
(
char
*
name
)
{
printf
(
"WRS Holdover tool
\n\n
"
);
printf
(
"This is a tool to allow the user to control the WRITE holdover parameters:
\n
"
);
printf
(
" - Select holdover function
\n
"
);
printf
(
" - Select rate of data acquisition
\n
"
);
printf
(
" - Enable/disable learning
\n
"
);
printf
(
" - Enable/disable holdover
\n\n
"
);
printf
(
"Usage: %s --func [0-15] : selects holdover function to be used.
\n
"
,
name
);
printf
(
" %s --rate [rate] : determines that 1 out of [rate] datapoints will be
\n
"
,
name
);
printf
(
" included in the circular buffers
\n
"
);
printf
(
" %s --learn [on/off] : determines if the circular buffers are being updated.
\n
"
,
name
);
printf
(
" %s --active [on/off] : determines if the holdover estimation is governing the clock output.
\n
"
,
name
);
exit
(
0
);
}
void
sigintHandler
(
int
sig_num
)
{
exit
(
0
);
}
int
set_function
(
int
value
)
{
// Sanitize input arg:
if
(
value
>
15
||
value
<
0
)
{
printf
(
"Introduced func %d out of range. Function must be in the range [0-15].
\n
"
,
value
);
printf
(
"Exit without change.
\n
"
);
return
-
1
;
}
uint32_t
tmp
=
_fpga_readl
(
SPLL_WB_BASE
+
SPLL_HO_CR
);
tmp
=
tmp
|
(
~
SPLL_FUNC_SEL_MSK
);
tmp
=
tmp
|
(
value
<<
8
);
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_CR
,
tmp
);
return
0
;
}
int
set_rate
(
int
value
)
{
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_RATE
,
value
);
return
0
;
}
int
set_learning
(
int
value
)
{
uint32_t
tmp
=
_fpga_readl
(
SPLL_WB_BASE
+
SPLL_HO_CR
)
if
(
value
==
1
)
{
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_CR
,
tmp
|
SPLL_LRN_EN_MSK
);
return
0
;
}
else
if
(
value
==
0
){
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_CR
,
tmp
&
(
~
SPLL_LRN_EN_MSK
));
return
0
;
}
else
{
return
-
1
;
}
}
int
set_holdover
(
int
value
)
{
uint32_t
tmp
=
_fpga_readl
(
SPLL_WB_BASE
+
SPLL_HO_CR
)
if
(
value
==
1
)
{
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_CR
,
tmp
|
SPLL_HO_EN_MSK
);
return
0
;
}
else
if
(
value
==
0
){
_fpga_writel
(
SPLL_WB_BASE
+
SPLL_HO_CR
,
tmp
&
(
~
SPLL_HO_EN_MSK
));
return
0
;
}
else
{
return
-
1
;
}
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
c
=
0
;
int
option_index
=
0
;
int
value
=
0
;
int
ret
=
-
1
char
s_status
[
4
];
static
struct
option
long_options
[]
=
{
{
"help"
,
no_argument
,
0
,
'h'
},
{
"func"
,
required_argument
,
0
,
'f'
},
{
"rate"
,
required_argument
,
0
,
'r'
},
{
"learn"
,
required_argument
,
0
,
'l'
},
{
"active"
,
required_argument
,
0
,
'a'
},
{
0
,
0
,
0
,
0
}
};
while
((
c
=
getopt_long
(
argc
,
argv
,
"hf:r:l:a:"
,
long_options
,
&
option_index
))
!=
-
1
)
{
switch
(
c
)
{
case
'h'
:
printHelp
(
argv
[
0
]);
break
;
case
'f'
:
value
=
atoi
(
optarg
);
ret
=
set_function
(
value
);
break
;
case
'r'
:
value
=
atoi
(
optarg
);
ret
=
set_rate
(
value
);
break
;
case
'l'
:
strcpy
(
s_status
,
optarg
);
if
(
!
strcasecmp
(
s_status
,
"on"
))
{
ret
=
set_learning
(
LRN_ON
)
break
;
}
else
if
(
!
strcasecmp
(
s_status
,
"off"
))
{
ret
=
set_learning
(
LRN_OFF
)
break
;
}
break
;
case
'a'
:
strcpy
(
s_status
,
optarg
);
if
(
!
strcasecmp
(
s_status
,
"on"
))
{
ret
=
set_holdover
(
HO_ON
);
break
;
}
else
if
(
!
strcasecmp
(
s_status
,
"off"
))
{
ret
=
set_holdover
(
HO_OFF
)
break
;
}
break
;
case
'?'
:
printHelp
(
argv
[
0
]);
break
;
default:
abort
();
}
}
shw_fpga_mmap_init
();
return
ret
;
}
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