Commit 010b3830 authored by Federico Vaga's avatar Federico Vaga

delta reference: not computed for all TS: remove usage

It will remain in the library, but the tools does not use it anymore.
Now it is **not** possible to have deltas for ALL timestamps
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 646ce01e
......@@ -97,24 +97,26 @@ static enum ft_devtype __ft_get_type(struct device *dev)
* It sets the channel reference for delta computation
* @ft FmcTdc instance
* @chan channel [0, 4]
* @ref reference channel [0, 4], use -1 to disable delta computation
* @ref reference channel [0, 4]
*/
static void ft_delta_reference_set(struct fmctdc_dev *ft,
unsigned int chan,
int ref)
static int ft_delta_reference_set(struct fmctdc_dev *ft,
unsigned int chan,
unsigned int ref)
{
uint32_t fifo_addr = ft->ft_fifo_base + TDC_FIFO_OFFSET * chan;
uint32_t csr = ft_ioread(ft, fifo_addr + TSF_REG_CSR);
uint32_t fifo_addr, csr;
if (ref < 0 || ref > ft->zdev->n_cset) {
csr &= ~TSF_CSR_DELTA_READ;
} else {
csr &= ~TSF_CSR_DELTA_REF_MASK;
csr |= (ref << TSF_CSR_DELTA_REF_SHIFT);
csr |= TSF_CSR_DELTA_READ;
}
if (ref > ft->zdev->n_cset || chan > ft->zdev->n_cset)
return -EINVAL;
fifo_addr = ft->ft_fifo_base + TDC_FIFO_OFFSET * chan;
csr = ft_ioread(ft, fifo_addr + TSF_REG_CSR);
csr &= ~TSF_CSR_DELTA_READ;
csr &= ~TSF_CSR_DELTA_REF_MASK;
csr |= (ref << TSF_CSR_DELTA_REF_SHIFT);
csr |= TSF_CSR_DELTA_READ;
ft_iowrite(ft, csr, fifo_addr + TSF_REG_CSR);
return 0;
}
/**
......@@ -124,14 +126,19 @@ static void ft_delta_reference_set(struct fmctdc_dev *ft,
* Return: reference channel [0, 4], -1 when delta computation is disabled
*/
static int ft_delta_reference_get(struct fmctdc_dev *ft,
unsigned int chan)
unsigned int chan,
int *ref)
{
uint32_t fifo_addr = ft->ft_fifo_base + TDC_FIFO_OFFSET * chan;
uint32_t csr = ft_ioread(ft, fifo_addr + TSF_REG_CSR);
uint32_t fifo_addr, csr;
if (chan > ft->zdev->n_cset)
return -EINVAL;
fifo_addr = ft->ft_fifo_base + TDC_FIFO_OFFSET * chan;
csr = ft_ioread(ft, fifo_addr + TSF_REG_CSR);
*ref = TSF_CSR_DELTA_REF_R(csr);
if ((csr & TSF_CSR_DELTA_READ) == 0)
return -1;
return TSF_CSR_DELTA_REF_R(csr);
return 0;
}
......@@ -185,8 +192,7 @@ static int ft_zio_info_channel(struct device *dev, struct zio_attribute *zattr,
*usr_val = test_bit(FT_FLAG_CH_TERMINATED, &st->flags);
break;
case FT_ATTR_TDC_DELAY_REF:
*usr_val = ft_delta_reference_get(ft, cset->index);
break;
return ft_delta_reference_get(ft, cset->index, usr_val);
case FT_ATTR_TDC_TRANSFER_MODE:
*usr_val = ft->mode;
break;
......@@ -273,10 +279,7 @@ static int ft_zio_conf_channel(struct device *dev, struct zio_attribute *zattr,
spin_unlock(&ft->lock);
break;
case FT_ATTR_TDC_DELAY_REF:
if (usr_val > FT_NUM_CHANNELS)
return -EINVAL;
ft_delta_reference_set(ft, cset->index, usr_val);
break;
return ft_delta_reference_set(ft, cset->index, usr_val);
case FT_ATTR_TDC_COALESCING_TIME:
ft_irq_coalescing_timeout_set(ft, cset->index, usr_val);
break;
......
......@@ -863,6 +863,9 @@ extern int fmctdc_check_wr_mode(struct fmctdc_board *userb)
* It assigns a time reference to a target channel. After you set a reference,
* you will read, from the target channel, the time-stamp difference between
* the last reference pulse and the target pulse.
*
* DO NOT USE THIS!
*
* @param[in] userb TDC board instance token
* @param[in] ch_target target channel [0, 4]
* @param[in] ch_reference reference channel [0, 4]. Use -1 to remove reference
......@@ -886,13 +889,7 @@ int fmctdc_reference_set(struct fmctdc_board *userb,
if (err)
return err;
if (mode != FT_ACQ_TYPE_FIFO && ch_reference != -1) {
errno = EPERM;
return -1;
}
snprintf(path, sizeof(path), "ft-ch%d/diff-reference", ch_target + 1);
ch_ref++; /* for the driver channel interval is [1, 5] */
return fmctdc_sysfs_set(b, path, &ch_ref);
}
......@@ -900,12 +897,12 @@ int fmctdc_reference_set(struct fmctdc_board *userb,
/**
* It removes the time reference from a target channel
* @param[in] userb TDC board instance token
* @param[in] ch_target target channel [1, 5]
* @param[in] ch_target target channel [0, 4]
* @return 0 on success, otherwise -1 and errno is set appropriately
*/
int fmctdc_reference_clear(struct fmctdc_board *userb, int ch_target)
{
return fmctdc_reference_set(userb, ch_target, 0);
return fmctdc_reference_set(userb, ch_target, -1);
}
......
......@@ -100,11 +100,8 @@ void dump(unsigned int ch, struct fmctdc_time *ts, int diff_mode)
print_ts(*ts, fmt_wr);
fprintf(stdout, "\n");
if (diff_mode) {
fprintf(stdout, " refer to board seq %-12u\n",
ts->ref_gseq_id);
if (diff_mode)
return;
}
/* We are in normal mode, calculate the difference */
ts_tmp = *ts;
......@@ -149,8 +146,6 @@ static void help(char *name)
fprintf(stderr, " -n : non-blocking mode\n");
fprintf(stderr, " -s n_samples: dump 'n_samples' timestamps\n");
fprintf(stderr, " -w : user White Rabbit format\n");
fprintf(stderr, " -d <ch_ref>,<ch_tar>: difference between a reference channel and\n");
fprintf(stderr, " a target channel (<ch_tar> - <ch_ref>)\n");
fprintf(stderr, " -f: flush buffer\n");
fprintf(stderr, " -r: read buffer, no acquisition start\n");
fprintf(stderr, " -m: buffer mode: 'fifo' or 'circ'\n");
......@@ -253,7 +248,6 @@ int main(int argc, char **argv)
unsigned int dev_id = 0xFFFFFFFF;
struct fmctdc_time *ts;
int channels[FMCTDC_NUM_CHANNELS];
int ref[FMCTDC_NUM_CHANNELS], a, b;
int chan_count = 0, i, n, ch, fd, n_ts, ret, n_boards;
int nblock = 0, buflen = 16;
enum fmctdc_buffer_mode bufmode = FMCTDC_BUFFER_FIFO;
......@@ -290,11 +284,10 @@ int main(int argc, char **argv)
for (i = 0; i < FMCTDC_NUM_CHANNELS; ++i) {
ch_cfg[i].mode = FMCTDC_TS_MODE_POST;
ref[i] = -1;
}
/* Parse Options */
while ((opt = getopt(argc, argv, "D:hwns:d:frm:l:Lc:VS:t:o:ea:")) != -1) {
while ((opt = getopt(argc, argv, "D:hwns:frm:l:Lc:VS:t:o:ea:")) != -1) {
switch (opt) {
case 'D':
ret = sscanf(optarg, "0x%04x", &dev_id);
......@@ -342,24 +335,6 @@ int main(int argc, char **argv)
case 'e':
stop_on_err = 1;
break;
case 'd':
sscanf(optarg, "%i,%i", &a, &b);
if (a < 0 || a > FMCTDC_CH_LAST) {
fprintf(stderr,
"%s: invalid reference channel %d\n",
argv[0], a);
help(argv[0]);
exit(EXIT_FAILURE);
}
if (b < 0 || b > FMCTDC_CH_LAST) {
fprintf(stderr,
"%s: invalid target channel %d\n",
argv[0], b);
help(argv[0]);
exit(EXIT_FAILURE);
}
ref[b] = a;
break;
case 'L':
last = 1;
break;
......@@ -452,17 +427,6 @@ int main(int argc, char **argv)
p[ch].fd = channels[ch];
p[ch].events = POLLIN | POLLERR;
ret = fmctdc_reference_set(brd, ch, ref[ch]);
if (ret) {
fprintf(stderr,
"%s: cannot set reference mode: %s\n",
argv[0], fmctdc_strerror(errno));
fprintf(stderr,
"%s: continue in normal mode: %s\n",
argv[0], fmctdc_strerror(errno));
ref[ch] = -1;
}
if (timeout_ms > 0) {
ret = fmctdc_coalescing_timeout_set(brd, ch, timeout_ms);
if (ret) {
......@@ -539,7 +503,7 @@ int main(int argc, char **argv)
stop = 1;
if (n % n_show == 0)
dump(chan, &ts[0], ref[chan] < 0 ? 0 : 1);
dump(chan, &ts[0], 0);
n += n_ts;
}
}
......@@ -549,8 +513,6 @@ err_acq:
out:
/* Restore default time-stamping */
for (i = 0; i <= FMCTDC_CH_LAST; i++) {
if (channels[i] > 0)
fmctdc_reference_clear(brd, -1);
if (!read)
ret = fmctdc_channel_disable(brd, i);
if (ret)
......
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