usb_updater2: pretty print touchpad_info

e.g. on whiskers, the command will behave like:

  > usb_updater2 -d 18d1:5030 --tp_info
  < ...
  < status:         0x00
  < vendor:         0x0483
  < fw_address:     0x80000000
  < fw_size:        0x00020000
  < allowed_fw_hash:
  < 20 0f eb 01 98 34 cf 86 8b 4e 94 1f 51 41 e7 64
  < e1 0c 4f ac 88 bd 97 1c 79 ae c5 74 e3 0b 14 6d
  < id:             0x3936
  < fw_version:     0x0011
  < fw_fw_checksum: 0xb49f

BRANCH=none
BUG=b:70482333
TEST=manually on device
Signed-off-by: Wei-Han Chen <stimim@chromium.org>

Change-Id: Iffe6720eec33cc57498cdab15ac2e132fdd76808
Reviewed-on: https://chromium-review.googlesource.com/1175506
Commit-Ready: Wei-Han Chen <stimim@chromium.org>
Tested-by: Wei-Han Chen <stimim@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
diff --git a/extra/usb_updater/usb_updater2.c b/extra/usb_updater/usb_updater2.c
index 0c5f305..e31770b 100644
--- a/extra/usb_updater/usb_updater2.c
+++ b/extra/usb_updater/usb_updater2.c
@@ -176,6 +176,40 @@
 		printf("\n");
 }
 
+static void dump_touchpad_info(const uint8_t *data, int len)
+{
+	const struct touchpad_info *info = (const struct touchpad_info *)data;
+
+	if (len != sizeof(struct touchpad_info)) {
+		fprintf(stderr, "Hex string length is not %zu",
+			sizeof(struct touchpad_info));
+		hexdump(data, len);
+		return;
+	}
+
+	printf("\n");
+	printf("status:         0x%02x\n", info->status);
+	printf("vendor:         0x%04x\n", info->vendor);
+	printf("fw_address:     0x%08x\n", info->fw_address);
+	printf("fw_size:        0x%08x\n", info->fw_size);
+
+	printf("allowed_fw_hash:\n");
+	hexdump(info->allowed_fw_hash, sizeof(info->allowed_fw_hash));
+
+	switch (info->vendor) {
+	case 0x04f3: /* ELAN */
+	case 0x0483: /* ST */
+		printf("id:             0x%04x\n", info->elan.id);
+		printf("fw_version:     0x%04x\n", info->elan.fw_version);
+		printf("fw_fw_checksum: 0x%04x\n", info->elan.fw_checksum);
+		break;
+	default:
+		fprintf(stderr, "Unknown vendor, vendor specific data:\n");
+		hexdump((const uint8_t *)&info->elan, sizeof(info->elan));
+		break;
+	}
+}
+
 /* Read file into buffer */
 static uint8_t *get_file_or_die(const char *filename, size_t *len_ptr)
 {
@@ -1132,9 +1166,15 @@
 				extra_command_data, extra_command_data_len,
 				extra_command_answer, extra_command_answer_len);
 
-		if (extra_command == UPDATE_EXTRA_CMD_TOUCHPAD_INFO ||
-			extra_command == UPDATE_EXTRA_CMD_TOUCHPAD_DEBUG)
+		switch (extra_command) {
+		case UPDATE_EXTRA_CMD_TOUCHPAD_INFO:
+			dump_touchpad_info(extra_command_answer,
+					   extra_command_answer_len);
+			break;
+		case  UPDATE_EXTRA_CMD_TOUCHPAD_DEBUG:
 			hexdump(extra_command_answer, extra_command_answer_len);
+			break;
+		}
 	}
 
 	libusb_close(td.uep.devh);