[Linuxptp-devel] [PATCH RFC 6/6] pi: use sample weight.
PTP IEEE 1588 stack for Linux
Brought to you by:
rcochran
|
From: Miroslav L. <mli...@re...> - 2015-02-13 12:56:31
|
Signed-off-by: Miroslav Lichvar <mli...@re...>
---
pi.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/pi.c b/pi.c
index 9c7b148..a8c6051 100644
--- a/pi.c
+++ b/pi.c
@@ -61,6 +61,20 @@ static void pi_destroy(struct servo *servo)
free(s);
}
+static int pi_weight_samples(struct servo *servo)
+{
+ struct pi_servo *s = container_of(servo, struct pi_servo, servo);
+
+ if (s->count < 2)
+ return 0;
+
+ /*
+ * Enable weights approximately at half way between default ki
+ * values for HW and SW time stamping.
+ */
+ return s->ki <= 0.01;
+}
+
static double pi_sample(struct servo *servo,
int64_t offset,
uint64_t local_ts,
@@ -137,8 +151,8 @@ static double pi_sample(struct servo *servo,
break;
}
- ki_term = s->ki * offset;
- ppb = s->kp * offset + s->drift + ki_term;
+ ki_term = s->ki * offset * weight;
+ ppb = s->kp * offset * weight + s->drift + ki_term;
if (ppb < -servo->max_frequency) {
ppb = -servo->max_frequency;
} else if (ppb > servo->max_frequency) {
@@ -186,6 +200,7 @@ struct servo *pi_servo_create(int fadj, int sw_ts)
return NULL;
s->servo.destroy = pi_destroy;
+ s->servo.weight_samples = pi_weight_samples;
s->servo.sample = pi_sample;
s->servo.sync_interval = pi_sync_interval;
s->servo.reset = pi_reset;
--
2.1.0
|