Commit 51d64a38 authored by Dimitris Lampridis's avatar Dimitris Lampridis

Merge remote-tracking branch 'origin/develop'

parents 2fbd1d5e 7e6ed87c
......@@ -271,6 +271,22 @@ static inline void ts_add2_ns(struct wrtd_tstamp *ts, uint32_t ns)
}
}
static inline void ts_add3_ps(struct wrtd_tstamp *dest,
const struct wrtd_tstamp *src, uint32_t ps)
{
uint32_t ps_ns = ps / 1000;
uint32_t ps_left = ps % 1000;
dest->seconds = src->seconds;
dest->ns = src->ns + ps_ns;
dest->frac = src->frac + (WRTD_TSTAMP_FRAC_PS * ps_left);
if (dest->ns >= 1000000000) {
dest->ns -= 1000000000;
dest->seconds++;
}
}
static inline void ts_add3_ns(struct wrtd_tstamp *dest,
const struct wrtd_tstamp *src, uint32_t ns)
{
......@@ -283,6 +299,23 @@ static inline void ts_add3_ns(struct wrtd_tstamp *dest,
}
}
static inline void ts_sub3_ps(struct wrtd_tstamp *dest,
const struct wrtd_tstamp *src, uint32_t ps)
{
uint32_t ps_ns = ps / 1000;
uint32_t ps_left = ps % 1000;
dest->seconds = src->seconds;
dest->ns = src->ns - ps_ns;
dest->frac = src->frac - (WRTD_TSTAMP_FRAC_PS * ps_left);
if ((ps / 1000) > src->ns)
dest->seconds--;
if ((WRTD_TSTAMP_FRAC_PS * ps_left) > src->frac)
dest->ns --;
}
static inline int ts_cmp(const struct wrtd_tstamp *l, const struct wrtd_tstamp *r)
{
if (l->seconds < r->seconds)
......
......@@ -17,6 +17,10 @@
#include "wrtd-fd.h"
struct wrtd_fd_calibration calib = {
.zero_offset_ps = { -38186, -38155, -38147, -38362},
};
#define OUT_TIMEOUT 10
static inline int fd_wr_present(struct wrtd_fd_dev *fd)
......@@ -235,14 +239,20 @@ static void fd_output (struct wrtd_fd_dev *fd, unsigned channel)
return;
}
/* Apply zero offset calibration value */
if (calib.zero_offset_ps[channel] >= 0)
ts_add3_ps(&ts, &ev->ts, calib.zero_offset_ps[channel]);
else
ts_sub3_ps(&ts, &ev->ts, -calib.zero_offset_ps[channel]);
/* Program the output start time */
fd_ch_writel(out, ev->ts.seconds, FD_REG_U_STARTL);
fd_ch_writel(out, ev->ts.ns / 8, FD_REG_C_START);
fd_ch_writel(out, ((ev->ts.ns & 7) << 9) | (ev->ts.frac >> (32 - 9)),
fd_ch_writel(out, ts.seconds, FD_REG_U_STARTL);
fd_ch_writel(out, ts.ns / 8, FD_REG_C_START);
fd_ch_writel(out, ((ts.ns & 7) << 9) | (ts.frac >> (32 - 9)),
FD_REG_F_START);
/* Adjust pulse width and program the output end time */
ts_add3_ns(&ts, &ev->ts, out->width_ns);
ts_add2_ns(&ts, out->width_ns);
fd_ch_writel(out, ts.seconds, FD_REG_U_ENDL);
fd_ch_writel(out, ts.ns / 8, FD_REG_C_END);
......
......@@ -63,6 +63,10 @@ enum fd_acam_modes {
#define FD_MAX_QUEUE_PULSES 4
struct wrtd_fd_calibration {
int32_t zero_offset_ps[FD_NUM_CHANNELS];
};
/* Pulse FIFO for a single Fine Delay output */
struct lrt_pulse_queue {
struct wrtd_event events[FD_MAX_QUEUE_PULSES];
......
......@@ -30,10 +30,13 @@ typedef struct wrtd_tstamp {
uint32_t seconds;
/** Number of nanoseconds. Wraps at 1e9. */
uint32_t ns;
/** Number of fractional nanoseconds. Unit is 2e-32 ns. */
/** Number of fractional nanoseconds.
Unit is 2.3283064370807974e-10 ns. */
uint32_t frac;
} wrtd_tstamp;
#define WRTD_TSTAMP_FRAC_PS 0x418937
/**
* WRTD Event
*/
......
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