Take double precision floating point representation of an offset value in
seconds. Feed this value to the PHC's phase control keyword.

Signed-off-by: Rahul Rameshbabu <rrameshb...@nvidia.com>
---
 phc_ctl.8 |  4 ++++
 phc_ctl.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 52 insertions(+), 7 deletions(-)

diff --git a/phc_ctl.8 b/phc_ctl.8
index 650e661..b10566e 100644
--- a/phc_ctl.8
+++ b/phc_ctl.8
@@ -62,6 +62,10 @@ Adjust the frequency of the PHC clock by the specified parts 
per billion. If no
 argument is provided, it will attempt to read the current frequency and report
 it.
 .TP
+.BI phase " seconds"
+Pass an amount in seconds to the PHC clock's phase control keyword. This
+argument is required.
+.TP
 .BI cmp
 Compare the PHC clock device to CLOCK_REALTIME, using the best method 
available.
 .TP
diff --git a/phc_ctl.c b/phc_ctl.c
index db89f01..c5430d8 100644
--- a/phc_ctl.c
+++ b/phc_ctl.c
@@ -106,13 +106,14 @@ static void usage(const char *progname)
                " specify commands with arguments. Can specify multiple\n"
                " commands to be executed in order. Seconds are read as\n"
                " double precision floating point values.\n"
-               "  set  [seconds]  set PHC time (defaults to time on 
CLOCK_REALTIME)\n"
-               "  get             get PHC time\n"
-               "  adj  <seconds>  adjust PHC time by offset\n"
-               "  freq [ppb]      adjust PHC frequency (default returns 
current offset)\n"
-               "  cmp             compare PHC offset to CLOCK_REALTIME\n"
-               "  caps            display device capabilities (default if no 
command given)\n"
-               "  wait <seconds>  pause between commands\n"
+               "  set   [seconds]  set PHC time (defaults to time on 
CLOCK_REALTIME)\n"
+               "  get              get PHC time\n"
+               "  adj   <seconds>  adjust PHC time by offset\n"
+               "  freq  [ppb]      adjust PHC frequency (default returns 
current offset)\n"
+               "  phase <seconds>  pass offset to PHC phase control keyword\n"
+               "  cmp              compare PHC offset to CLOCK_REALTIME\n"
+               "  caps             display device capabilities (default if no 
command given)\n"
+               "  wait <seconds>   pause between commands\n"
                "\n",
                progname);
 }
@@ -277,6 +278,45 @@ static int do_freq(clockid_t clkid, int cmdc, char *cmdv[])
        return 1;
 }
 
+static int do_phase(clockid_t clkid, int cmdc, char *cmdv[])
+{
+       double offset_arg;
+       long nsecs;
+       enum parser_result r;
+
+       if (cmdc < 1 || name_is_a_command(cmdv[0])) {
+               pr_err("phase: missing required time argument");
+               return -2;
+       }
+
+       /* parse the double time offset argument */
+       r = get_ranged_double(cmdv[0], &offset_arg, -DBL_MAX, DBL_MAX);
+       switch (r) {
+       case PARSED_OK:
+               break;
+       case MALFORMED:
+               pr_err("phase: '%s' is not a valid double", cmdv[0]);
+               return -2;
+       case OUT_OF_RANGE:
+               pr_err("phase: '%s' is out of range.", cmdv[0]);
+               return -2;
+       default:
+               pr_err("phase: couldn't process '%s'", cmdv[0]);
+               return -2;
+       }
+
+       nsecs = (long)(NSEC_PER_SEC * offset_arg);
+
+       clockadj_init(clkid);
+       clockadj_set_phase(clkid, nsecs);
+
+       pr_notice("offset of %lf seconds provided to PHC phase control keyword",
+                 offset_arg);
+
+       /* phase offset always consumes one argument */
+       return 1;
+}
+
 static int do_caps(clockid_t clkid, int cmdc, char *cmdv[])
 {
        struct ptp_clock_caps caps;
@@ -399,6 +439,7 @@ static const struct cmd_t all_commands[] = {
        { "get", &do_get },
        { "adj", &do_adj },
        { "freq", &do_freq },
+       { "phase", &do_phase },
        { "cmp", &do_cmp },
        { "caps", &do_caps },
        { "wait", &do_wait },
-- 
2.40.1



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

Reply via email to