summaryrefslogtreecommitdiff
path: root/common/usb_common.c
diff options
context:
space:
mode:
authorSam Hurst <shurst@google.com>2020-02-24 08:51:03 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-25 03:34:36 +0000
commitf6ee241a55abb590917cb8ffbf13c22f2f52bc57 (patch)
tree499adaabe0364fb5386587b29a0a98826b0429f2 /common/usb_common.c
parenta51fa30d71c486bd256a4922a1feb6f9f36b7a7d (diff)
downloadchrome-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.c80
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)