Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
M
Mock Turtle
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
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
Mock Turtle
Commits
5ab4d21c
Commit
5ab4d21c
authored
Jul 31, 2015
by
Federico Vaga
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wrtd: add base_time command
Signed-off-by:
Federico Vaga
<
federico.vaga@cern.ch
>
parent
87edcca1
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
138 additions
and
7 deletions
+138
-7
wrtd-common.h
applications/wrtd/include/wrtd-common.h
+3
-0
libwrtd-input.c
applications/wrtd/lib/libwrtd-input.c
+38
-0
libwrtd-output.c
applications/wrtd/lib/libwrtd-output.c
+37
-0
libwrtd.h
applications/wrtd/lib/libwrtd.h
+2
-0
rt-fd.c
applications/wrtd/rt/fd/rt-fd.c
+15
-0
rt-tdc.c
applications/wrtd/rt/tdc/rt-tdc.c
+15
-0
wrtd-ping.c
applications/wrtd/tools/wrtd-ping.c
+28
-7
No files found.
applications/wrtd/include/wrtd-common.h
View file @
5ab4d21c
...
...
@@ -48,6 +48,7 @@
#define WRTD_CMD_TDC_SOFTWARE_TRIGGER 0xd
#define WRTD_CMD_TDC_CHAN_SET_LOG_LEVEL 0xe
#define WRTD_CMD_TDC_CHAN_RESET_COUNTERS 0xf
#define WRTD_CMD_TDC_BASE_TIME 0x10
#define WRTD_CMD_FD_TRIG_ENABLE 0x10
...
...
@@ -70,6 +71,7 @@
#define WRTD_CMD_FD_CHAN_RESET_COUNTERS 0x9
#define WRTD_CMD_FD_PING 0xa
#define WRTD_CMD_FD_BASE_TIME 0xb
#define WRTD_REP_ACK_ID 0x100
...
...
@@ -79,6 +81,7 @@
#define WRTD_REP_HASH_ENTRY 0x104
#define WRTD_REP_TIMESTAMP 0x105
#define WRTD_REP_LOG_MESSAGE 0x106
#define WRTD_REP_BASE_TIME_ID 0x107
...
...
applications/wrtd/lib/libwrtd-input.c
View file @
5ab4d21c
...
...
@@ -647,3 +647,41 @@ int wrtd_in_ping(struct wrtd_node *dev)
return
wrtd_validate_acknowledge
(
&
msg
);
}
/**
* It gets the input base time
* @param[in] dev device token
* @param[out] ts input device base time
* @return 0 on success, -1 on error and errno is set appropriately
*/
int
wrtd_in_base_time
(
struct
wrtd_node
*
dev
,
struct
wr_timestamp
*
ts
)
{
struct
wrtd_desc
*
wrtd
=
(
struct
wrtd_desc
*
)
dev
;
struct
wrnc_msg
msg
=
wrnc_msg_init
(
6
);
/* FIXME cannot use 2 */
uint32_t
id
,
seq
=
0
;
int
err
;
id
=
WRTD_CMD_TDC_BASE_TIME
;
wrnc_msg_header
(
&
msg
,
&
id
,
&
seq
);
/* Send the message and get answer */
err
=
wrtd_in_send_and_receive_sync
(
wrtd
,
&
msg
);
if
(
err
)
{
errno
=
EWRTD_INVALID_ANSWER_STATE
;
return
-
1
;
}
/* Deserialize and check the answer */
wrnc_msg_header
(
&
msg
,
&
id
,
&
seq
);
if
(
id
!=
WRTD_REP_BASE_TIME_ID
)
{
errno
=
EWRTD_INVALID_ANSWER_STATE
;
return
-
1
;
}
wrtd_msg_timestamp
(
&
msg
,
ts
);
return
0
;
}
applications/wrtd/lib/libwrtd-output.c
View file @
5ab4d21c
...
...
@@ -845,3 +845,40 @@ int wrtd_out_ping(struct wrtd_node *dev)
return
wrtd_validate_acknowledge
(
&
msg
);
}
/**
* It gets the output base time
* @param[in] dev device token
* @param[out] ts output device base time
* @return 0 on success, -1 on error and errno is set appropriately
*/
int
wrtd_out_base_time
(
struct
wrtd_node
*
dev
,
struct
wr_timestamp
*
ts
)
{
struct
wrtd_desc
*
wrtd
=
(
struct
wrtd_desc
*
)
dev
;
struct
wrnc_msg
msg
=
wrnc_msg_init
(
6
);
/* FIXME cannot use 2 */
uint32_t
id
,
seq
=
0
;
int
err
;
id
=
WRTD_CMD_FD_BASE_TIME
;
wrnc_msg_header
(
&
msg
,
&
id
,
&
seq
);
/* Send the message and get answer */
err
=
wrtd_out_send_and_receive_sync
(
wrtd
,
&
msg
);
if
(
err
)
{
errno
=
EWRTD_INVALID_ANSWER_STATE
;
return
-
1
;
}
/* Deserialize and check the answer */
wrnc_msg_header
(
&
msg
,
&
id
,
&
seq
);
if
(
id
!=
WRTD_REP_BASE_TIME_ID
)
{
errno
=
EWRTD_INVALID_ANSWER_STATE
;
return
-
1
;
}
wrtd_msg_timestamp
(
&
msg
,
ts
);
return
0
;
}
applications/wrtd/lib/libwrtd.h
View file @
5ab4d21c
...
...
@@ -247,6 +247,7 @@ extern int wrtd_in_is_armed(struct wrtd_node *dev, unsigned int input,
extern
int
wrtd_in_has_trigger
(
struct
wrtd_node
*
dev
,
unsigned
int
input
,
unsigned
int
*
assigned
);
extern
int
wrtd_in_ping
(
struct
wrtd_node
*
dev
);
extern
int
wrtd_in_base_time
(
struct
wrtd_node
*
dev
,
struct
wr_timestamp
*
ts
);
extern
int
wrtd_in_dead_time_get
(
struct
wrtd_node
*
dev
,
unsigned
int
input
,
uint64_t
*
dead_time_ps
);
extern
int
wrtd_in_delay_get
(
struct
wrtd_node
*
dev
,
unsigned
int
input
,
...
...
@@ -295,6 +296,7 @@ extern int wrtd_out_pulse_width_set(struct wrtd_node *dev, unsigned int output,
extern
int
wrtd_out_trig_enable
(
struct
wrtd_node
*
dev
,
struct
wrtd_trigger_handle
*
handle
,
int
enable
);
extern
int
wrtd_out_ping
(
struct
wrtd_node
*
dev
);
extern
int
wrtd_out_base_time
(
struct
wrtd_node
*
dev
,
struct
wr_timestamp
*
ts
);
extern
int
wrtd_out_trigger_mode_set
(
struct
wrtd_node
*
dev
,
unsigned
int
output
,
enum
wrtd_trigger_mode
mode
);
...
...
applications/wrtd/rt/fd/rt-fd.c
View file @
5ab4d21c
...
...
@@ -1065,6 +1065,20 @@ static inline void ctl_ping (uint32_t seq, struct wrnc_msg *ibuf)
ctl_ack
(
seq
);
}
static
inline
void
ctl_base_time
(
uint32_t
seq
,
struct
wrnc_msg
*
ibuf
)
{
struct
wrnc_msg
buf
=
ctl_claim_out_buf
();
uint32_t
id_ack
=
WRTD_REP_BASE_TIME_ID
,
seconds
,
ticks
;
struct
wr_timestamp
ts
;
ts
.
seconds
=
lr_readl
(
WRN_CPU_LR_REG_TAI_SEC
);
ts
.
ticks
=
lr_readl
(
WRN_CPU_LR_REG_TAI_CYCLES
);
ts
.
frac
=
0
;
wrnc_msg_header
(
&
buf
,
&
id_ack
,
&
seq
);
wrtd_msg_timestamp
(
&
buf
,
&
ts
);
hmq_msg_send
(
&
buf
);
}
static
inline
void
ctl_chan_set_delay
(
uint32_t
seq
,
struct
wrnc_msg
*
ibuf
)
{
int
ch
;
...
...
@@ -1288,6 +1302,7 @@ static inline void do_control()
_CMD
(
WRTD_CMD_FD_CHAN_SET_WIDTH
,
ctl_chan_set_width
)
_CMD
(
WRTD_CMD_FD_READ_HASH
,
ctl_read_hash
)
_CMD
(
WRTD_CMD_FD_BASE_TIME
,
ctl_base_time
)
_CMD
(
WRTD_CMD_FD_PING
,
ctl_ping
)
default:
break
;
...
...
applications/wrtd/rt/tdc/rt-tdc.c
View file @
5ab4d21c
...
...
@@ -318,6 +318,20 @@ static inline void ctl_ping (uint32_t seq, struct wrnc_msg *ibuf)
ctl_ack
(
seq
);
}
static
inline
void
ctl_base_time
(
uint32_t
seq
,
struct
wrnc_msg
*
ibuf
)
{
struct
wrnc_msg
buf
=
ctl_claim_out_buf
();
uint32_t
id_ack
=
WRTD_REP_BASE_TIME_ID
,
seconds
,
ticks
;
struct
wr_timestamp
ts
;
ts
.
seconds
=
lr_readl
(
WRN_CPU_LR_REG_TAI_SEC
);
ts
.
ticks
=
lr_readl
(
WRN_CPU_LR_REG_TAI_CYCLES
);
ts
.
frac
=
0
;
wrnc_msg_header
(
&
buf
,
&
id_ack
,
&
seq
);
wrtd_msg_timestamp
(
&
buf
,
&
ts
);
hmq_msg_send
(
&
buf
);
}
static
inline
void
ctl_chan_set_delay
(
uint32_t
seq
,
struct
wrnc_msg
*
ibuf
)
{
int
channel
;
...
...
@@ -541,6 +555,7 @@ static inline void do_control()
_CMD
(
WRTD_CMD_TDC_CHAN_SET_LOG_LEVEL
,
ctl_chan_set_log_level
)
_CMD
(
WRTD_CMD_TDC_CHAN_RESET_COUNTERS
,
ctl_chan_reset_counters
)
_CMD
(
WRTD_CMD_TDC_PING
,
ctl_ping
)
_CMD
(
WRTD_CMD_TDC_BASE_TIME
,
ctl_base_time
)
default:
break
;
}
...
...
applications/wrtd/tools/wrtd-ping.c
View file @
5ab4d21c
...
...
@@ -20,6 +20,7 @@ void help()
fprintf
(
stderr
,
" -D 0x<dev_id> device id to ping
\n
"
);
fprintf
(
stderr
,
" -n <num> number of ping to perform
\n
"
);
fprintf
(
stderr
,
" -p <num> ping period in micro-seconds
\n
"
);
fprintf
(
stderr
,
" -t show device base time
\n
"
);
}
int
main
(
int
argc
,
char
*
argv
[])
...
...
@@ -27,10 +28,11 @@ int main(int argc, char *argv[])
struct
wrtd_node
*
wrtd
;
uint32_t
dev_id
=
0
,
n
=
1
;
uint64_t
period
=
0
;
int
err
;
struct
wr_timestamp
tsi
,
tso
;
int
err
,
time
=
0
;
char
c
;
while
((
c
=
getopt
(
argc
,
argv
,
"hD:n:p:"
))
!=
-
1
)
{
while
((
c
=
getopt
(
argc
,
argv
,
"hD:n:p:
t
"
))
!=
-
1
)
{
switch
(
c
)
{
case
'h'
:
case
'?'
:
...
...
@@ -46,6 +48,9 @@ int main(int argc, char *argv[])
case
'p'
:
sscanf
(
optarg
,
"%"
SCNu64
,
&
period
);
break
;
case
't'
:
time
=
1
;
break
;
}
}
...
...
@@ -70,21 +75,37 @@ int main(int argc, char *argv[])
}
while
(
n
--
)
{
/* Get base time here to reduce the delay between the
two requests */
if
(
time
)
{
wrtd_in_base_time
(
wrtd
,
&
tsi
);
wrtd_in_base_time
(
wrtd
,
&
tso
);
}
/* Check input */
err
=
wrtd_in_ping
(
wrtd
);
if
(
err
)
if
(
err
)
{
fprintf
(
stderr
,
"Cannot ping input source: %s
\n
"
,
wrtd_strerror
(
errno
));
else
}
else
{
fprintf
(
stdout
,
"input : it is running!
\n
"
);
if
(
time
)
fprintf
(
stdout
,
"
\t
base time
\t
s:%d t:%d f:%d
\n
"
,
tsi
.
seconds
,
tsi
.
ticks
,
tsi
.
frac
);
}
/* check output */
err
=
wrtd_out_ping
(
wrtd
);
if
(
err
)
if
(
err
)
{
fprintf
(
stderr
,
"Cannot ping output source: %s
\n
"
,
wrtd_strerror
(
errno
));
else
}
else
{
fprintf
(
stdout
,
"output : it is running!
\n
"
);
if
(
time
)
fprintf
(
stdout
,
"
\t
base time
\t
s:%d t:%d f:%d
\n
"
,
tso
.
seconds
,
tso
.
ticks
,
tso
.
frac
);
}
fprintf
(
stdout
,
"
\n
"
);
usleep
(
period
);
}
...
...
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