Add a new function to phc_ctl to display the devices pin configuration data. First, obtain the device capabilities to determine the number of pins. Then, for each pin, print the name, function, and channel information.
Signed-off-by: Jacob Keller <jacob.e.kel...@intel.com> --- missing.h | 5 +++++ phc.c | 10 +++++++++ phc.h | 13 +++++++++++ phc_ctl.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+) diff --git a/missing.h b/missing.h index 9b37dc258c0f..4a71307169ad 100644 --- a/missing.h +++ b/missing.h @@ -240,10 +240,15 @@ struct ptp_pin_desc { unsigned int rsv[5]; }; +#define PTP_PIN_GETFUNC _IOWR(PTP_CLK_MAGIC, 6, struct ptp_pin_desc) #define PTP_PIN_SETFUNC _IOW(PTP_CLK_MAGIC, 7, struct ptp_pin_desc) #endif /*!PTP_PIN_SETFUNC*/ +#ifndef PTP_PIN_GETFUNC2 +#define PTP_PIN_GETFUNC2 _IOWR(PTP_CLK_MAGIC, 15, struct ptp_pin_desc) +#endif + #ifndef PTP_PIN_SETFUNC2 #define PTP_PIN_SETFUNC2 _IOW(PTP_CLK_MAGIC, 16, struct ptp_pin_desc) #endif diff --git a/phc.c b/phc.c index fe8c5eccabda..879a008bd392 100644 --- a/phc.c +++ b/phc.c @@ -108,6 +108,16 @@ int phc_number_pins(clockid_t clkid) return caps.n_pins; } +int phc_pin_getfunc(clockid_t clkid, struct ptp_pin_desc *desc) +{ + int err = ioctl(CLOCKID_TO_FD(clkid), PTP_PIN_GETFUNC2, desc); + if (err == -ENOTTY) + err = ioctl(CLOCKID_TO_FD(clkid), PTP_PIN_GETFUNC, desc); + if (err) + fprintf(stderr, "failed to set pin configuration, error: %m\n"); + return err; +} + int phc_pin_setfunc(clockid_t clkid, struct ptp_pin_desc *desc) { int err = ioctl(CLOCKID_TO_FD(clkid), PTP_PIN_SETFUNC2, desc); diff --git a/phc.h b/phc.h index 830e002a8690..064d29bf36e0 100644 --- a/phc.h +++ b/phc.h @@ -66,6 +66,19 @@ int phc_max_adj(clockid_t clkid); */ int phc_number_pins(clockid_t clkid); +/** + * Reads configuration of a pin of a PTP hardware clock device. + * + * @param clkid A clock ID obtained using phc_open(). + * + * @param desc Pointer to a pin descriptor with the 'index' field set. On + * success, the rest of the structure is updated with the + * current pin configuration. + * + * @return Zero on success, non-zero otherwise. + */ +int phc_pin_getfunc(clockid_t clkid, struct ptp_pin_desc *desc); + /** * Configures a pin of a PTP hardware clock device. * diff --git a/phc_ctl.c b/phc_ctl.c index 4344184c364b..e5076f511813 100644 --- a/phc_ctl.c +++ b/phc_ctl.c @@ -113,6 +113,7 @@ static void usage(const char *progname) " 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" + " get_pins_cfg display device pins configuration\n" " wait <seconds> pause between commands\n" "\n", progname); @@ -319,6 +320,71 @@ static int do_caps(clockid_t clkid, int cmdc, char *cmdv[]) return 0; } +static const char *pin_func_string(unsigned int func) +{ + switch (func) { + case PTP_PF_NONE: + return "no function"; + case PTP_PF_EXTTS: + return "external timestamping"; + case PTP_PF_PEROUT: + return "periodic output"; + case PTP_PF_PHYSYNC: + return "phy sync"; + default: + return "unknown function"; + } +} + +static int do_get_pins_cfg(clockid_t clkid, int cmdc, char *cmdv[]) +{ + struct ptp_pin_desc pin_desc; + unsigned int index; + int n_pins; + + if (clkid == CLOCK_REALTIME) { + pr_warning("CLOCK_REALTIME is not a PHC device."); + return 0; + } + + n_pins = phc_number_pins(clkid); + if (n_pins == 0) { + pr_notice("device has no configurable pins"); + return (0); + } + + pr_notice("device has %d configurable input/output pins", + n_pins); + + /* For each pin, read its configuration */ + for (index = 0; index < n_pins; index++) { + memset(&pin_desc, 0, sizeof(pin_desc)); + pin_desc.index = index; + + if (phc_pin_getfunc(clkid, &pin_desc)) { + pr_warning("get pin configuration for pin %d failed: %s", + index, + strerror(errno)); + /* keep going */ + continue; + } + + if (pin_desc.func == PTP_PF_NONE) { + pr_notice("pin %d [%s] not configured", + pin_desc.index, + pin_desc.name); + } else { + pr_notice("pin %d [%s] %s on channel %d", + pin_desc.index, + pin_desc.name, + pin_func_string(pin_desc.func), + pin_desc.chan); + } + } + + return 0; +} + static int do_cmp(clockid_t clkid, int cmdc, char *cmdv[]) { int64_t sys_offset, delay; @@ -402,6 +468,7 @@ static const struct cmd_t all_commands[] = { { "freq", &do_freq }, { "cmp", &do_cmp }, { "caps", &do_caps }, + { "get_pins_cfg", &do_get_pins_cfg }, { "wait", &do_wait }, { 0, 0 } }; -- 2.41.0.1.g9857a21e0017.dirty _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel