diff options
author | Sam Hurst <shurst@google.com> | 2020-02-24 08:51:03 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-25 03:34:36 +0000 |
commit | f6ee241a55abb590917cb8ffbf13c22f2f52bc57 (patch) | |
tree | 499adaabe0364fb5386587b29a0a98826b0429f2 /common/usb_common.c | |
parent | a51fa30d71c486bd256a4922a1feb6f9f36b7a7d (diff) | |
download | chrome-ec-f6ee241a55abb590917cb8ffbf13c22f2f52bc57.tar.gz |
TCPMv1/v2: Move hex8tou32 and remote_flashing to common file
BUG=chromium:1021235
BRANCH=none
TEST=make buildall -j
Signed-off-by: Sam Hurst <shurst@google.com>
Change-Id: Ia243d5062c77d8f6b8299fbd131cabfdbcffb01e
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2070452
Tested-by: Sam Hurst <shurst@google.com>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Commit-Queue: Sam Hurst <shurst@google.com>
Diffstat (limited to 'common/usb_common.c')
-rw-r--r-- | common/usb_common.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/common/usb_common.c b/common/usb_common.c index d1db0b2b3e..eb344cc279 100644 --- a/common/usb_common.c +++ b/common/usb_common.c @@ -36,6 +36,86 @@ #define CPRINTF(format, args...) #endif +#if defined(CONFIG_CMD_PD) && defined(CONFIG_CMD_PD_FLASH) +int hex8tou32(char *str, uint32_t *val) +{ + char *ptr = str; + uint32_t tmp = 0; + + while (*ptr) { + char c = *ptr++; + + if (c >= '0' && c <= '9') + tmp = (tmp << 4) + (c - '0'); + else if (c >= 'A' && c <= 'F') + tmp = (tmp << 4) + (c - 'A' + 10); + else if (c >= 'a' && c <= 'f') + tmp = (tmp << 4) + (c - 'a' + 10); + else + return EC_ERROR_INVAL; + } + if (ptr != str + 8) + return EC_ERROR_INVAL; + *val = tmp; + return EC_SUCCESS; +} + +int remote_flashing(int argc, char **argv) +{ + int port, cnt, cmd; + uint32_t data[VDO_MAX_SIZE-1]; + char *e; + static int flash_offset[CONFIG_USB_PD_PORT_MAX_COUNT]; + + if (argc < 4 || argc > (VDO_MAX_SIZE + 4 - 1)) + return EC_ERROR_PARAM_COUNT; + + port = strtoi(argv[1], &e, 10); + if (*e || port >= board_get_usb_pd_port_count()) + return EC_ERROR_PARAM2; + + cnt = 0; + if (!strcasecmp(argv[3], "erase")) { + cmd = VDO_CMD_FLASH_ERASE; + flash_offset[port] = 0; + ccprintf("ERASE ..."); + } else if (!strcasecmp(argv[3], "reboot")) { + cmd = VDO_CMD_REBOOT; + ccprintf("REBOOT ..."); + } else if (!strcasecmp(argv[3], "signature")) { + cmd = VDO_CMD_ERASE_SIG; + ccprintf("ERASE SIG ..."); + } else if (!strcasecmp(argv[3], "info")) { + cmd = VDO_CMD_READ_INFO; + ccprintf("INFO..."); + } else if (!strcasecmp(argv[3], "version")) { + cmd = VDO_CMD_VERSION; + ccprintf("VERSION..."); + } else { + int i; + + argc -= 3; + for (i = 0; i < argc; i++) + if (hex8tou32(argv[i+3], data + i)) + return EC_ERROR_INVAL; + cmd = VDO_CMD_FLASH_WRITE; + cnt = argc; + ccprintf("WRITE %d @%04x ...", argc * 4, + flash_offset[port]); + flash_offset[port] += argc * 4; + } + + pd_send_vdm(port, USB_VID_GOOGLE, cmd, data, cnt); + + /* Wait until VDM is done */ + while (pd[port].vdm_state > 0) + task_wait_event(100*MSEC); + + ccprintf("DONE %d\n", pd[port].vdm_state); + return EC_SUCCESS; +} +#endif /* defined(CONFIG_CMD_PD) && defined(CONFIG_CMD_PD_FLASH) */ + int usb_get_battery_soc(void) { #if defined(CONFIG_CHARGER) |