As discussed in this email thread:
https://sourceforge.net/p/linuxptp/mailman/message/37047555/
there is a desire to synchronize multiple DSA switches in a
boundary_clock_jbod setup, using a PPS signal, and the ts2phc program
already offers a solid base.

This patch series extends the ts2phc program to cater for that use case
by introducing a new '-a' option and friends ('--transportSpecific').
This makes it quite similar to phc2sys which has the same ability, just
that ts2phc can give much better performance if the hardware can assist
with that.

The overall board design for my use case is that there's an SoC with an
embedded DSA switch, and hanging off of 3 ports of that embedded switch
are 3 external switches. Every networking device (the DSA master for the
embedded switch, the embedded switch, as well as each individual
external switch) has a PTP clock. The topology for PPS signal
distribution is fixed - that is given by hardware ability - the
/dev/ptp1 clock can emit a valid PPS, and all external switches can
timestamp that PPS (it is connected in a sort-of simplex "bus" design),
and it cannot be any other way around. It looks like this:

      +---------------------------------------------------------------+
      | LS1028A                           /dev/ptp0 (unused)          |
      |               +------------------------------+                |
      |               |      DSA master for Felix    |                |
      |               |(internal ENETC port 2: eno2))|                |
      |  +------------+------------------------------+-------------+  |
      |  | Felix embedded L2 switch          /dev/ptp1             |  |
      |  |                             PPS master, sync slave      |  |
      |  | +--------------+   +--------------+   +--------------+  |  |
      |  | |DSA master for|   |DSA master for|   |DSA master for|  |  |
      |  | |  SJA1105 1   |   |  SJA1105 2   |   |  SJA1105 3   |  |  |
      |  | |(Felix port 1)|   |(Felix port 2)|   |(Felix port 3)|  |  |
      +--+-+--------------+---+--------------+---+--------------+--+--+

        /dev/ptp2                /dev/ptp3                /dev/ptp4
  PPS slave, sync master    PPS slave, sync slave     PPS slave, sync slave
+-----------------------+ +-----------------------+ +-----------------------+
|   SJA1105 switch 1    | |   SJA1105 switch 2    | |   SJA1105 switch 3    |
+-----+-----+-----+-----+ +-----+-----+-----+-----+ +-----+-----+-----+-----+
|sw1p0|sw1p1|sw1p2|sw1p3| |sw2p0|sw2p1|sw2p2|sw2p3| |sw3p0|sw3p1|sw3p2|sw3p3|
+-----+-----+-----+-----+ +-----+-----+-----+-----+ +-----+-----+-----+-----+
   ^
   |
GM connected here

In text, it would be described as this:

cat ts2phc.cfg
[global]
first_step_threshold    0.00002
step_threshold          0.00002
ts2phc.pulsewidth       500000000
ts2phc.perout_phase     0

# Felix
[/dev/ptp1]
ts2phc.master           1

# SJA1105 switch 1
[/dev/ptp2]
ts2phc.channel          0
ts2phc.extts_polarity   both

# SJA1105 switch 2
[/dev/ptp3]
ts2phc.channel          0
ts2phc.extts_polarity   both

# SJA1105 switch 3
[/dev/ptp4]
ts2phc.channel          0
ts2phc.extts_polarity   both

cat gPTP.cfg
[global]
gmCapable               1
priority1               248
priority2               248
logAnnounceInterval     0
logSyncInterval         -3
syncReceiptTimeout      3
neighborPropDelayThresh 50000
min_neighbor_prop_delay -20000000
assume_two_step         1
path_trace_enabled      1
follow_up_info          1
transportSpecific       0x1
ptp_dst_mac             01:80:C2:00:00:0E
network_transport       L2
delay_mechanism         P2P
step_threshold          0.00002
tx_timestamp_timeout    20
boundary_clock_jbod     1

[sw1p0]
[sw1p1]
[sw1p2]
[sw1p3]
[sw2p0]
[sw2p1]
[sw2p2]
[sw2p3]
[sw3p0]
[sw3p1]
[sw3p2]
[sw3p3]

At a high level, what I have done is:
- I moved the PMC related code from phc2sys into pmc_common.c, for
  ts2phc reuse
- I created an extra abstraction in ts2phc as "struct clock" that would
  represent what's synchronizable. The "master" and "slave" concepts
  retain their meaning, which is: "master" == the device that emits PPS,
  and "slave" == the device that timestamps PPS.

The changes should be backwards-compatible with the non-automatic mode.
I have only tested non-automatic mode with a PHC master (that's all I
have) and it still appears to work as before.

Vladimir Oltean (15):
  posix_clock_open: derive PHC index from device name if possible
  phc2sys: rename struct node to struct phc2sys_private
  phc2sys: break out pmc code into pmc_common.c
  pmc_common: fix potential memory leak in run_pmc_events()
  ts2phc: create a private data structure
  ts2phc: instantiate a full clock structure for every slave PHC
  ts2phc: instantiate a full clock structure for every PHC master
  ts2phc: instantiate a pmc node
  ts2phc_slave: print master offset
  ts2phc: split slave poll from servo loop
  tmv: introduce a conversion helper from ptp_clock_time
  tmv: introduce an initializer from nanoseconds
  ts2phc: reconfigure sync direction by subscribing to ptp4l port events
  ts2phc: allow the PHC PPS master to be synchronized
  ts2phc_phc_master: make use of new kernel API for perout waveform

 config.c                |   1 +
 makefile                |   3 +-
 missing.h               |  53 ++++
 phc2sys.c               | 667 +++++++++++-----------------------------
 pmc_common.c            | 342 ++++++++++++++++++++
 pmc_common.h            |  35 +++
 tmv.h                   |  15 +
 ts2phc.8                |   5 +
 ts2phc.c                | 621 ++++++++++++++++++++++++++++++++++---
 ts2phc.h                |  77 +++++
 ts2phc_generic_master.c |   2 +-
 ts2phc_generic_master.h |   3 +-
 ts2phc_master.c         |  10 +-
 ts2phc_master.h         |   8 +-
 ts2phc_master_private.h |   1 +
 ts2phc_nmea_master.c    |   5 +-
 ts2phc_nmea_master.h    |   3 +-
 ts2phc_phc_master.c     |  70 +++--
 ts2phc_phc_master.h     |   3 +-
 ts2phc_slave.c          | 383 ++++++++++++-----------
 ts2phc_slave.h          |  10 +-
 util.c                  |  10 +
 22 files changed, 1577 insertions(+), 750 deletions(-)
 create mode 100644 ts2phc.h

-- 
2.25.1



_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to