diff options
author | Andrew McRae <amcrae@google.com> | 2020-05-21 17:17:12 +1000 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-05-27 03:36:33 +0000 |
commit | 85d87528a69a65f2c4b50ccd3e8357db14453020 (patch) | |
tree | e6cb6ca0ee6bf79c7bb8c5c463fed07a11618213 | |
parent | 8f409a3716c4bdb8e288e54a559da75ff30f375b (diff) | |
download | chrome-ec-85d87528a69a65f2c4b50ccd3e8357db14453020.tar.gz |
Extend the tcpci register dump.
Extend the tcpci register dump command to allow chip specific
register dumps to be displayed.
BUG=b:157206143
TEST=Display ANX3447 registers on Puff.
BRANCH=none
Change-Id: Ib2bf1adcbe3bce75ff54c36c4306b17356eae96f
Signed-off-by: Andrew McRae <amcrae@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2208344
Tested-by: Andrew McRae <amcrae@chromium.org>
Auto-Submit: Andrew McRae <amcrae@chromium.org>
Reviewed-by: Peter Marheine <pmarheine@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Commit-Queue: Andrew McRae <amcrae@chromium.org>
-rw-r--r-- | baseboard/trogdor/baseboard.h | 2 | ||||
-rw-r--r-- | baseboard/volteer/baseboard.h | 2 | ||||
-rw-r--r-- | baseboard/zork/baseboard.h | 2 | ||||
-rw-r--r-- | board/puff/board.h | 2 | ||||
-rw-r--r-- | board/waddledoo/board.h | 2 | ||||
-rw-r--r-- | common/usb_common.c | 48 | ||||
-rw-r--r-- | driver/tcpm/anx7447.c | 69 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 175 | ||||
-rw-r--r-- | driver/tcpm/tcpm.h | 10 | ||||
-rw-r--r-- | include/config.h | 2 | ||||
-rw-r--r-- | include/usb_pd_tcpm.h | 35 |
11 files changed, 255 insertions, 94 deletions
diff --git a/baseboard/trogdor/baseboard.h b/baseboard/trogdor/baseboard.h index 47deb36c54..8923022c56 100644 --- a/baseboard/trogdor/baseboard.h +++ b/baseboard/trogdor/baseboard.h @@ -104,7 +104,7 @@ #define CONFIG_USB_PD_PORT_MAX_COUNT 2 #define CONFIG_USB_PD_TCPM_MUX #define CONFIG_USB_PD_TCPM_TCPCI -#define CONFIG_CMD_TCPCI_DUMP +#define CONFIG_CMD_TCPC_DUMP #define CONFIG_USB_PD_TRY_SRC #define CONFIG_USB_PD_VBUS_DETECT_TCPC #define CONFIG_USB_PD_5V_EN_CUSTOM diff --git a/baseboard/volteer/baseboard.h b/baseboard/volteer/baseboard.h index e5db524f0f..292a938d41 100644 --- a/baseboard/volteer/baseboard.h +++ b/baseboard/volteer/baseboard.h @@ -144,7 +144,7 @@ #define CONFIG_USB_PD_REV30 #endif -#define CONFIG_CMD_TCPCI_DUMP +#define CONFIG_CMD_TCPC_DUMP #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_TCPMV1 diff --git a/baseboard/zork/baseboard.h b/baseboard/zork/baseboard.h index d753e2d7b1..e8efdea7ff 100644 --- a/baseboard/zork/baseboard.h +++ b/baseboard/zork/baseboard.h @@ -138,7 +138,7 @@ #endif #define CONFIG_HOSTCMD_PD_CONTROL -#define CONFIG_CMD_TCPCI_DUMP +#define CONFIG_CMD_TCPC_DUMP #define CONFIG_USB_CHARGER #define CONFIG_USB_POWER_DELIVERY #define CONFIG_USB_PD_ALT_MODE diff --git a/board/puff/board.h b/board/puff/board.h index 2d2ec31cf3..b8ffc965d3 100644 --- a/board/puff/board.h +++ b/board/puff/board.h @@ -64,7 +64,7 @@ #define CONFIG_HOSTCMD_PD_CONTROL #undef CONFIG_CMD_PWR_AVG #define CONFIG_CMD_PPC_DUMP -#define CONFIG_CMD_TCPCI_DUMP +#define CONFIG_CMD_TCPC_DUMP #ifdef SECTION_IS_RO /* Reduce RO size by removing less-relevant commands. */ #undef CONFIG_CMD_APTHROTTLE diff --git a/board/waddledoo/board.h b/board/waddledoo/board.h index ed765eedea..bb531c89a3 100644 --- a/board/waddledoo/board.h +++ b/board/waddledoo/board.h @@ -24,7 +24,7 @@ #define CONFIG_CHARGER_SENSE_RESISTOR 10 /* EC console commands */ -#define CONFIG_CMD_TCPCI_DUMP +#define CONFIG_CMD_TCPC_DUMP /* Keyboard */ #define CONFIG_PWM_KBLIGHT diff --git a/common/usb_common.c b/common/usb_common.c index f3607f7aa5..156dc816cb 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -727,3 +727,51 @@ int pd_is_vbus_present(int port) { return pd_check_vbus_level(port, VBUS_PRESENT); } + +#ifdef CONFIG_CMD_TCPC_DUMP +/* + * Dump TCPC registers. + */ +void tcpc_dump_registers(int port, const struct tcpc_reg_dump_map *reg, + int count) +{ + int i, val; + + for (i = 0; i < count; i++, reg++) { + switch (reg->size) { + case 1: + tcpc_read(port, reg->addr, &val); + ccprintf(" %-30s(0x%02x) = 0x%02x\n", + reg->name, reg->addr, (uint8_t)val); + break; + case 2: + tcpc_read16(port, reg->addr, &val); + ccprintf(" %-30s(0x%02x) = 0x%04x\n", + reg->name, reg->addr, (uint16_t)val); + break; + } + cflush(); + } + +} + +static int command_tcpc_dump(int argc, char **argv) +{ + int port; + + if (argc < 2) + return EC_ERROR_PARAM_COUNT; + + port = atoi(argv[1]); + if ((port < 0) || (port >= board_get_usb_pd_port_count())) { + CPRINTS("%s(%d) Invalid port!", __func__, port); + return EC_ERROR_INVAL; + } + /* Dump TCPC registers. */ + tcpm_dump_registers(port); + + return EC_SUCCESS; +} +DECLARE_CONSOLE_COMMAND(tcpci_dump, command_tcpc_dump, "<Type-C port>", + "dump the TCPC regs"); +#endif /* defined(CONFIG_CMD_TCPC_DUMP) */ diff --git a/driver/tcpm/anx7447.c b/driver/tcpm/anx7447.c index aee839936d..b43455a3ac 100644 --- a/driver/tcpm/anx7447.c +++ b/driver/tcpm/anx7447.c @@ -739,6 +739,72 @@ static int anx7447_set_polarity(int port, ? MASK_SET : MASK_CLR); } +#ifdef CONFIG_CMD_TCPC_DUMP +static const struct tcpc_reg_dump_map anx7447_regs[] = { + { + .addr = ANX7447_REG_STATUS, + .name = "ANX7447_STATUS", + .size = 1, + }, + { + .addr = ANX7447_REG_ADC_CTRL_1, + .name = "ADC_CTRL_1", + .size = 1, + }, + { + .addr = ANX7447_REG_ANALOG_CTRL_8, + .name = "ANALOG_CTRL_8", + .size = 1, + }, + { + .addr = ANX7447_REG_ANALOG_CTRL_10, + .name = "ANALOG_CTRL_10", + .size = 1, + }, + { + .addr = ANX7447_REG_TCPC_CTRL_2, + .name = "TCPC_CTRL_2", + .size = 1, + }, +}; + +const struct { + const char *name; + uint8_t addr; +} anx7447_alt_regs[] = { + { + .addr = ANX7447_REG_HPD, + .name = "HPD", + }, + { + .name = "HPD_CTRL_0", + .addr = ANX7447_REG_HPD_CTRL_0, + }, + { + .name = "HPD_DEGLITCH_H", + .addr = ANX7447_REG_HPD_DEGLITCH_H, + }, +}; + +/* + * Dump registers for debug command. + */ +static void anx7447_dump_registers(int port) +{ + int i, val; + + tcpc_dump_std_registers(port); + tcpc_dump_registers(port, anx7447_regs, ARRAY_SIZE(anx7447_regs)); + for (i = 0; i < ARRAY_SIZE(anx7447_alt_regs); i++) { + anx7447_reg_read(port, anx7447_alt_regs[i].addr, &val); + ccprintf(" %-26s(ALT/0x%02x) = 0x%02x\n", + anx7447_alt_regs[i].name, + anx7447_alt_regs[i].addr, (uint8_t)val); + cflush(); + } +} +#endif /* defined(CONFIG_CMD_TCPC_DUMP) */ + /* * ANX7447 is a TCPCI compatible port controller, with some caveats. * It seems to require both CC lines to be set always, instead of just @@ -776,6 +842,9 @@ const struct tcpm_drv anx7447_tcpm_drv = { #ifdef CONFIG_USB_PD_TCPC_LOW_POWER .enter_low_power_mode = &tcpci_enter_low_power_mode, #endif +#ifdef CONFIG_CMD_TCPC_DUMP + .dump_registers = &anx7447_dump_registers, +#endif }; #ifdef CONFIG_USB_PD_TCPM_MUX diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 85eab7c521..90a51ed971 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -1456,207 +1456,203 @@ const struct usb_mux_driver tcpci_tcpm_usb_mux_driver = { #endif /* CONFIG_USB_PD_TCPM_MUX */ -#ifdef CONFIG_CMD_TCPCI_DUMP -struct tcpci_reg { - const char *name; - uint8_t size; -}; - -static const struct tcpci_reg tcpci_regs[] = { - [TCPC_REG_VENDOR_ID] = { +#ifdef CONFIG_CMD_TCPC_DUMP +static const struct tcpc_reg_dump_map tcpc_regs[] = { + { + .addr = TCPC_REG_VENDOR_ID, .name = "VENDOR_ID", .size = 2, }, - [TCPC_REG_PRODUCT_ID] = { + { + .addr = TCPC_REG_PRODUCT_ID, .name = "PRODUCT_ID", .size = 2, }, - [TCPC_REG_BCD_DEV] = { + { + .addr = TCPC_REG_BCD_DEV, .name = "BCD_DEV", .size = 2, }, - [TCPC_REG_TC_REV] = { + { + .addr = TCPC_REG_TC_REV, .name = "TC_REV", .size = 2, }, - [TCPC_REG_PD_REV] = { + { + .addr = TCPC_REG_PD_REV, .name = "PD_REV", .size = 2, }, - [TCPC_REG_PD_INT_REV] = { + { + .addr = TCPC_REG_PD_INT_REV, .name = "PD_INT_REV", .size = 2, }, - [TCPC_REG_ALERT] = { + { + .addr = TCPC_REG_ALERT, .name = "ALERT", .size = 2, }, - [TCPC_REG_ALERT_MASK] = { + { + .addr = TCPC_REG_ALERT_MASK, .name = "ALERT_MASK", .size = 2, }, - [TCPC_REG_POWER_STATUS_MASK] = { + { + .addr = TCPC_REG_POWER_STATUS_MASK, .name = "POWER_STATUS_MASK", .size = 1, }, - [TCPC_REG_FAULT_STATUS_MASK] = { + { + .addr = TCPC_REG_FAULT_STATUS_MASK, .name = "FAULT_STATUS_MASK", .size = 1, }, - [TCPC_REG_EXT_STATUS_MASK] = { + { + .addr = TCPC_REG_EXT_STATUS_MASK, .name = "EXT_STATUS_MASK", - .size = 1 }, - [TCPC_REG_ALERT_EXTENDED_MASK] = { + .size = 1 + }, + { + .addr = TCPC_REG_ALERT_EXTENDED_MASK, .name = "ALERT_EXTENDED_MASK", .size = 1, }, - [TCPC_REG_CONFIG_STD_OUTPUT] = { + { + .addr = TCPC_REG_CONFIG_STD_OUTPUT, .name = "CONFIG_STD_OUTPUT", .size = 1, }, - [TCPC_REG_TCPC_CTRL] = { + { + .addr = TCPC_REG_TCPC_CTRL, .name = "TCPC_CTRL", .size = 1, }, - [TCPC_REG_ROLE_CTRL] = { + { + .addr = TCPC_REG_ROLE_CTRL, .name = "ROLE_CTRL", .size = 1, }, - [TCPC_REG_FAULT_CTRL] = { + { + .addr = TCPC_REG_FAULT_CTRL, .name = "FAULT_CTRL", .size = 1, }, - [TCPC_REG_POWER_CTRL] = { + { + .addr = TCPC_REG_POWER_CTRL, .name = "POWER_CTRL", .size = 1, }, - [TCPC_REG_CC_STATUS] = { + { + .addr = TCPC_REG_CC_STATUS, .name = "CC_STATUS", .size = 1, }, - [TCPC_REG_POWER_STATUS] = { + { + .addr = TCPC_REG_POWER_STATUS, .name = "POWER_STATUS", .size = 1, }, - [TCPC_REG_FAULT_STATUS] = { + { + .addr = TCPC_REG_FAULT_STATUS, .name = "FAULT_STATUS", .size = 1, }, - [TCPC_REG_EXT_STATUS] = { + { + .addr = TCPC_REG_EXT_STATUS, .name = "EXT_STATUS", .size = 1, }, - [TCPC_REG_ALERT_EXT] = { + { + .addr = TCPC_REG_ALERT_EXT, .name = "ALERT_EXT", .size = 1, }, - [TCPC_REG_DEV_CAP_1] = { + { + .addr = TCPC_REG_DEV_CAP_1, .name = "DEV_CAP_1", .size = 2, }, - [TCPC_REG_DEV_CAP_2] = { + { + .addr = TCPC_REG_DEV_CAP_2, .name = "DEV_CAP_2", .size = 2, }, - [TCPC_REG_STD_INPUT_CAP] = { + { + .addr = TCPC_REG_STD_INPUT_CAP, .name = "STD_INPUT_CAP", .size = 1, }, - [TCPC_REG_STD_OUTPUT_CAP] = { + { + .addr = TCPC_REG_STD_OUTPUT_CAP, .name = "STD_OUTPUT_CAP", .size = 1, }, - [TCPC_REG_CONFIG_EXT_1] = { + { + .addr = TCPC_REG_CONFIG_EXT_1, .name = "CONFIG_EXT_1", .size = 1, }, - [TCPC_REG_MSG_HDR_INFO] = { + { + .addr = TCPC_REG_MSG_HDR_INFO, .name = "MSG_HDR_INFO", .size = 1, }, - [TCPC_REG_RX_DETECT] = { + { + .addr = TCPC_REG_RX_DETECT, .name = "RX_DETECT", .size = 1, }, - [TCPC_REG_RX_BYTE_CNT] = { + { + .addr = TCPC_REG_RX_BYTE_CNT, .name = "RX_BYTE_CNT", .size = 1, }, - [TCPC_REG_RX_BUF_FRAME_TYPE] = { + { + .addr = TCPC_REG_RX_BUF_FRAME_TYPE, .name = "RX_BUF_FRAME_TYPE", .size = 1, }, - [TCPC_REG_TRANSMIT] = { + { + .addr = TCPC_REG_TRANSMIT, .name = "TRANSMIT", .size = 1, }, - [TCPC_REG_VBUS_VOLTAGE] = { + { + .addr = TCPC_REG_VBUS_VOLTAGE, .name = "VBUS_VOLTAGE", .size = 2, }, - [TCPC_REG_VBUS_SINK_DISCONNECT_THRESH] = { + { + .addr = TCPC_REG_VBUS_SINK_DISCONNECT_THRESH, .name = "VBUS_SINK_DISCONNECT_THRESH", .size = 2, }, - [TCPC_REG_VBUS_STOP_DISCHARGE_THRESH] = { + { + .addr = TCPC_REG_VBUS_STOP_DISCHARGE_THRESH, .name = "VBUS_STOP_DISCHARGE_THRESH", .size = 2, }, - [TCPC_REG_VBUS_VOLTAGE_ALARM_HI_CFG] = { + { + .addr = TCPC_REG_VBUS_VOLTAGE_ALARM_HI_CFG, .name = "VBUS_VOLTAGE_ALARM_HI_CFG", .size = 2, }, - [TCPC_REG_VBUS_VOLTAGE_ALARM_LO_CFG] = { + { + .addr = TCPC_REG_VBUS_VOLTAGE_ALARM_LO_CFG, .name = "VBUS_VOLTAGE_ALARM_LO_CFG", .size = 2, }, }; -static int command_tcpci_dump(int argc, char **argv) +/* + * Dump standard TCPC registers. + */ +void tcpc_dump_std_registers(int port) { - int port; - int i; - int val; - - if (argc < 2) - return EC_ERROR_PARAM_COUNT; - - port = atoi(argv[1]); - if ((port < 0) || (port >= board_get_usb_pd_port_count())) { - CPRINTS("%s(%d) Invalid port!", __func__, port); - return EC_ERROR_INVAL; - } - - for (i = 0; i < ARRAY_SIZE(tcpci_regs); i++) { - switch (tcpci_regs[i].size) { - case 1: - tcpc_read(port, i, &val); - ccprintf(" %-30s(0x%02x) = 0x%02x\n", - tcpci_regs[i].name, i, (uint8_t)val); - break; - case 2: - tcpc_read16(port, i, &val); - ccprintf(" %-30s(0x%02x) = 0x%04x\n", - tcpci_regs[i].name, i, (uint16_t)val); - break; - default: - /* - * The tcpci_regs[] array is indexed by the register - * offset. Unused registers are zero initialized so we - * skip any entries that have the size field set to - * zero. - */ - break; - } - cflush(); - } - - return EC_SUCCESS; + tcpc_dump_registers(port, tcpc_regs, ARRAY_SIZE(tcpc_regs)); } -DECLARE_CONSOLE_COMMAND(tcpci_dump, command_tcpci_dump, "<Type-C port>", - "dump the TCPCI regs"); -#endif /* defined(CONFIG_CMD_TCPCI_DUMP) */ - +#endif const struct tcpm_drv tcpci_tcpm_drv = { .init = &tcpci_tcpm_init, @@ -1688,4 +1684,7 @@ const struct tcpm_drv tcpci_tcpm_drv = { #ifdef CONFIG_USB_PD_TCPC_LOW_POWER .enter_low_power_mode = &tcpci_enter_low_power_mode, #endif +#ifdef CONFIG_CMD_TCPC_DUMP + .dump_registers = &tcpc_dump_std_registers, +#endif }; diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h index f97bb39b9c..889e396cb7 100644 --- a/driver/tcpm/tcpm.h +++ b/driver/tcpm/tcpm.h @@ -468,4 +468,14 @@ static inline void tcpm_set_frs_enable(int port, int enable) tcpc->set_frs_enable(port, enable); } +#ifdef CONFIG_CMD_TCPC_DUMP +static inline void tcpm_dump_registers(int port) +{ + const struct tcpm_drv *tcpc = tcpc_config[port].drv; + + if (tcpc->dump_registers) + tcpc->dump_registers(port); +} +#endif /* defined(CONFIG_CMD_TCPC_DUMP) */ + #endif diff --git a/include/config.h b/include/config.h index 2370e3d77e..bdd3bcd251 100644 --- a/include/config.h +++ b/include/config.h @@ -1280,7 +1280,7 @@ #define CONFIG_CMD_SYSLOCK #undef CONFIG_CMD_TASK_RESET #undef CONFIG_CMD_TASKREADY -#undef CONFIG_CMD_TCPCI_DUMP +#undef CONFIG_CMD_TCPC_DUMP #define CONFIG_CMD_TEMP_SENSOR #define CONFIG_CMD_TIMERINFO #define CONFIG_CMD_TYPEC diff --git a/include/usb_pd_tcpm.h b/include/usb_pd_tcpm.h index 60a50f0f2e..0e686d35d4 100644 --- a/include/usb_pd_tcpm.h +++ b/include/usb_pd_tcpm.h @@ -424,6 +424,15 @@ struct tcpm_drv { * @return EC_SUCCESS or error */ int (*handle_fault)(int port, int fault); + +#ifdef CONFIG_CMD_TCPC_DUMP + /** + * Dump TCPC registers + * + * @param port Type-C port number + */ + void (*dump_registers)(int port); +#endif /* defined(CONFIG_CMD_TCPC_DUMP) */ }; /* @@ -529,4 +538,30 @@ void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled); */ int tcpc_get_vbus_voltage(int port); +#ifdef CONFIG_CMD_TCPC_DUMP +struct tcpc_reg_dump_map { + uint8_t addr; + uint8_t size; + const char *name; +}; + +/** + * Dump the standard TCPC registers. + * + * @param port Type-C port number + * + */ +void tcpc_dump_std_registers(int port); + +/** + * Dump chip specific TCPC registers. + * + * @param port Type-C port number + * @param pointer to table of registers and names + * @param count of registers to dump + * + */ +void tcpc_dump_registers(int port, const struct tcpc_reg_dump_map *reg, + int count); +#endif #endif /* __CROS_EC_USB_PD_TCPM_H */ |