2023-08-24 00:44:50 +08:00
|
|
|
/*
|
|
|
|
* Copyright 2023 Google LLC
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <zephyr/device.h>
|
|
|
|
#include <zephyr/logging/log.h>
|
|
|
|
#include <zephyr/usb_c/usbc.h>
|
|
|
|
#include <zephyr/shell/shell.h>
|
|
|
|
|
|
|
|
/** Macro used to call the dump_std_reg function from the TCPC device pointer */
|
|
|
|
#define TCPC_DUMP_DEV(dev) ret |= tcpc_dump_std_reg(dev);
|
|
|
|
|
|
|
|
/** Macro used to call the dump_std_reg function from the USB-C connector node */
|
|
|
|
#define TCPC_DUMP_CONN_NODE(node) TCPC_DUMP_DEV(DEVICE_DT_GET(DT_PROP(node, tcpc)))
|
|
|
|
|
2023-08-24 00:47:13 +08:00
|
|
|
/** Macro used to call the vbus_measure function from the VBUS device pointer */
|
|
|
|
#define TCPC_VBUS_DEV(dev) \
|
|
|
|
{ \
|
|
|
|
int val; \
|
|
|
|
ret |= usbc_vbus_measure(dev, &val); \
|
|
|
|
shell_print(sh, "%s vbus: %d mV", dev->name, val); \
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Macro used to call the vbus_measure function from the USB-C connector node */
|
|
|
|
#define TCPC_VBUS_CONN_NODE(node) TCPC_VBUS_DEV(DEVICE_DT_GET(DT_PROP(node, vbus)))
|
|
|
|
|
2023-08-24 00:48:31 +08:00
|
|
|
/** Macro used to call the get_chip function from the TCPC device pointer */
|
|
|
|
#define TCPC_GET_CHIP_DEV(dev) \
|
|
|
|
{ \
|
|
|
|
ret |= tcpc_get_chip_info(dev, &chip_info); \
|
|
|
|
shell_print(sh, "Chip: %s", dev->name); \
|
|
|
|
shell_print(sh, "\tVendor: %04x", chip_info.vendor_id); \
|
|
|
|
shell_print(sh, "\tProduct: %04x", chip_info.product_id); \
|
|
|
|
shell_print(sh, "\tDevice: %04x", chip_info.device_id); \
|
|
|
|
shell_print(sh, "\tFirmware: %llx", chip_info.fw_version_number); \
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Macro used to call the get_chip function from the USB-C connector node */
|
|
|
|
#define TCPC_GET_CHIP_CONN_NODE(node) TCPC_GET_CHIP_DEV(DEVICE_DT_GET(DT_PROP(node, tcpc)))
|
|
|
|
|
2023-08-24 00:44:50 +08:00
|
|
|
/**
|
|
|
|
* @brief Shell command that dumps standard registers of TCPCs for all available USB-C ports
|
|
|
|
*
|
|
|
|
* @param sh Shell structure
|
|
|
|
* @param argc Arguments count
|
|
|
|
* @param argv Device name
|
|
|
|
* @return int ORed return values of all the functions executed, 0 in case of success
|
|
|
|
*/
|
|
|
|
static int cmd_tcpc_dump(const struct shell *sh, size_t argc, char **argv)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (argc <= 1) {
|
|
|
|
DT_FOREACH_STATUS_OKAY(usb_c_connector, TCPC_DUMP_CONN_NODE);
|
|
|
|
} else {
|
|
|
|
const struct device *dev = device_get_binding(argv[1]);
|
|
|
|
|
|
|
|
if (dev != NULL) {
|
|
|
|
TCPC_DUMP_DEV(dev);
|
|
|
|
} else {
|
|
|
|
ret = -ENODEV;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2023-08-24 00:47:13 +08:00
|
|
|
/**
|
|
|
|
* @brief Shell command that prints the vbus measures for all available USB-C ports
|
|
|
|
*
|
|
|
|
* @param sh Shell structure
|
|
|
|
* @param argc Arguments count
|
|
|
|
* @param argv Device name
|
|
|
|
* @return int ORed return values of all the functions executed, 0 in case of success
|
|
|
|
*/
|
|
|
|
static int cmd_tcpc_vbus(const struct shell *sh, size_t argc, char **argv)
|
|
|
|
{
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (argc <= 1) {
|
|
|
|
DT_FOREACH_STATUS_OKAY(usb_c_connector, TCPC_VBUS_CONN_NODE);
|
|
|
|
} else {
|
|
|
|
const struct device *dev = device_get_binding(argv[1]);
|
|
|
|
|
|
|
|
if (dev != NULL) {
|
|
|
|
TCPC_VBUS_DEV(dev);
|
|
|
|
} else {
|
|
|
|
ret = -ENODEV;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2023-08-24 00:48:31 +08:00
|
|
|
/**
|
|
|
|
* @brief Shell command that prints the TCPCs chips information for all available USB-C ports
|
|
|
|
*
|
|
|
|
* @param sh Shell structure
|
|
|
|
* @param argc Arguments count
|
|
|
|
* @param argv Device name
|
|
|
|
* @return int ORed return values of all the functions executed, 0 in case of success
|
|
|
|
*/
|
|
|
|
static int cmd_tcpc_chip_info(const struct shell *sh, size_t argc, char **argv)
|
|
|
|
{
|
|
|
|
struct tcpc_chip_info chip_info;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (argc <= 1) {
|
|
|
|
DT_FOREACH_STATUS_OKAY(usb_c_connector, TCPC_GET_CHIP_CONN_NODE);
|
|
|
|
} else {
|
|
|
|
const struct device *dev = device_get_binding(argv[1]);
|
|
|
|
|
|
|
|
if (dev != NULL) {
|
|
|
|
TCPC_GET_CHIP_DEV(dev);
|
|
|
|
} else {
|
|
|
|
ret = -ENODEV;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2023-08-24 00:44:50 +08:00
|
|
|
/**
|
|
|
|
* @brief Function used to create subcommands with devices names
|
|
|
|
*
|
|
|
|
* @param idx counter of devices
|
|
|
|
* @param entry shell structure that will be filled
|
|
|
|
*/
|
|
|
|
static void device_name_get(size_t idx, struct shell_static_entry *entry)
|
|
|
|
{
|
|
|
|
const struct device *dev = shell_device_lookup(idx, NULL);
|
|
|
|
|
|
|
|
entry->syntax = (dev != NULL) ? dev->name : NULL;
|
|
|
|
entry->handler = NULL;
|
|
|
|
entry->help = NULL;
|
|
|
|
entry->subcmd = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
SHELL_DYNAMIC_CMD_CREATE(list_device_names, device_name_get);
|
|
|
|
|
|
|
|
SHELL_STATIC_SUBCMD_SET_CREATE(sub_tcpc_cmds,
|
|
|
|
SHELL_CMD_ARG(dump, &list_device_names,
|
|
|
|
"Dump TCPC registers\n"
|
|
|
|
"Usage: tcpc dump [<tcpc device>]",
|
|
|
|
cmd_tcpc_dump, 1, 1),
|
2023-08-24 00:47:13 +08:00
|
|
|
SHELL_CMD_ARG(vbus, &list_device_names,
|
|
|
|
"Display VBUS voltage\n"
|
|
|
|
"Usage: tcpc vbus [<vbus device>]",
|
|
|
|
cmd_tcpc_vbus, 1, 1),
|
2023-08-24 00:48:31 +08:00
|
|
|
SHELL_CMD_ARG(chip, &list_device_names,
|
|
|
|
"Display chip information\n"
|
|
|
|
"Usage: tcpc chip [<tcpc device>]",
|
|
|
|
cmd_tcpc_chip_info, 1, 1),
|
2023-08-24 00:44:50 +08:00
|
|
|
SHELL_SUBCMD_SET_END);
|
|
|
|
|
|
|
|
SHELL_CMD_REGISTER(tcpc, &sub_tcpc_cmds, "TCPC (USB-C PD) diagnostics", NULL);
|