/* * Copyright 2025 NXP * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include LOG_MODULE_REGISTER(ptp_clock_shell, CONFIG_LOG_DEFAULT_LEVEL); static bool device_is_ptp_clock(const struct device *dev) { return DEVICE_API_IS(ptp_clock, dev); } static void device_name_get(size_t idx, struct shell_static_entry *entry) { const struct device *dev = shell_device_filter(idx, device_is_ptp_clock); entry->syntax = (dev != NULL) ? dev->name : NULL; entry->handler = NULL; entry->help = NULL; entry->subcmd = NULL; } SHELL_DYNAMIC_CMD_CREATE(dsub_device_name, device_name_get); static int parse_device_arg(const struct shell *sh, char **argv, const struct device **dev) { *dev = shell_device_get_binding(argv[1]); if (!*dev) { shell_error(sh, "device %s not found", argv[1]); return -ENODEV; } return 0; } /* ptp_clock get */ static int cmd_ptp_clock_get(const struct shell *sh, size_t argc, char **argv) { struct net_ptp_time tm = {0}; const struct device *dev; int ret; ret = parse_device_arg(sh, argv, &dev); if (ret < 0) { return ret; } ret = ptp_clock_get(dev, &tm); if (ret < 0) { return ret; } shell_print(sh, "%"PRIu64".%09u", tm.second, tm.nanosecond); return 0; } /* ptp_clock set */ static int cmd_ptp_clock_set(const struct shell *sh, size_t argc, char **argv) { struct net_ptp_time tm = {0}; const struct device *dev; int ret; ret = parse_device_arg(sh, argv, &dev); if (ret < 0) { return ret; } tm.second = shell_strtoull(argv[2], 10, &ret); if (ret < 0) { return ret; } ret = ptp_clock_set(dev, &tm); if (ret < 0) { return ret; } return 0; } /* ptp_clock adj */ static int cmd_ptp_clock_adj(const struct shell *sh, size_t argc, char **argv) { const struct device *dev; int adj; int ret; ret = parse_device_arg(sh, argv, &dev); if (ret < 0) { return ret; } adj = shell_strtol(argv[2], 10, &ret); if (ret < 0) { return ret; } ret = ptp_clock_adjust(dev, adj); if (ret < 0) { return ret; } return 0; } /* ptp_clock freq */ static int cmd_ptp_clock_freq(const struct shell *sh, size_t argc, char **argv) { const struct device *dev; int ppb; int ret; ret = parse_device_arg(sh, argv, &dev); if (ret < 0) { return ret; } ppb = shell_strtol(argv[2], 10, &ret); if (ret < 0) { return ret; } ret = ptp_clock_rate_adjust(dev, 1.0 + ((double)ppb / 1000000000.0)); if (ret < 0) { return ret; } return 0; } /* ptp_clock selftest