Commit 1ac5981f authored by Federico Vaga's avatar Federico Vaga

wrtd: add base_time command

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>


NOTE
This commit has been created by `git subtree` on the Mock Turtle repository
on tag mock-turtle-2.0

This commit will not compile
parent 952150b9
......@@ -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
......
......@@ -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;
}
......@@ -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;
}
......@@ -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);
......
......@@ -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;
......
......@@ -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;
}
......
......@@ -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,
"\tbase time\ts:%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,
"\tbase time\ts:%d t:%d f:%d\n",
tso.seconds, tso.ticks, tso.frac);
}
fprintf(stdout, "\n");
usleep(period);
}
......
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