usb_updater2: Add support for touchpad debugging feature

Add support for touchpad debugging in usb_updater2, allowing an
arbitrary parameter to be passed.

BRANCH=none
BUG=b:63993891
TEST=./usb_updater2 -g 00 -d 18d1:502b

Change-Id: I1242e3bab9dc69ec3a92dd158c85606211e40f21
Signed-off-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/763575
Reviewed-by: Chun-ta Lin <itspeter@chromium.org>
This commit is contained in:
Nicolas Boichat
2017-11-09 16:38:32 -08:00
committed by chrome-bot
parent 7fdcb8bf86
commit 54588e40a7

View File

@@ -72,13 +72,14 @@ static struct first_response_pdu targ;
static uint16_t protocol_version;
static uint16_t header_type;
static char *progname;
static char *short_opts = "bd:efhjp:rstuw";
static char *short_opts = "bd:efg:hjp:rstuw";
static const struct option long_opts[] = {
/* name hasarg *flag val */
{"binvers", 1, NULL, 'b'},
{"device", 1, NULL, 'd'},
{"entropy", 0, NULL, 'e'},
{"fwver", 0, NULL, 'f'},
{"tp_debug", 1, NULL, 'g'},
{"help", 0, NULL, 'h'},
{"jump_to_rw", 0, NULL, 'j'},
{"tp_update", 1, NULL, 'p'},
@@ -111,6 +112,7 @@ static void usage(int errs)
"RW and RO, do not update\n"
" -d,--device VID:PID USB device (default %04x:%04x)\n"
" -f,--fwver Report running firmware versions.\n"
" -g,--tp_debug <hex data> Touchpad debug command\n"
" -h,--help Show this message\n"
" -e,--entropy Add entropy to device secret\n"
" -j,--jump_to_rw Tell EC to jump to RW\n"
@@ -125,6 +127,52 @@ static void usage(int errs)
exit(errs ? update_error : noop);
}
static void str2hex(const char *str, uint8_t *data, int *len)
{
int i;
int slen = strlen(str);
if (slen/2 > *len) {
fprintf(stderr, "Hex string too long.\n");
exit(update_error);
}
if (slen % 2 != 0) {
fprintf(stderr, "Hex string length not a multiple of 2.\n");
exit(update_error);
}
for (i = 0, *len = 0; i < slen; i += 2, (*len)++) {
char *end;
char tmp[3];
tmp[0] = str[i];
tmp[1] = str[i+1];
tmp[2] = 0;
data[*len] = strtol(tmp, &end, 16);
if (*end != 0) {
fprintf(stderr, "Invalid hex string.\n");
exit(update_error);
}
}
}
static void hexdump(const uint8_t *data, int len)
{
int i;
for (i = 0; i < len; i++) {
printf("%02x", data[i]);
if ((i % 16) == 15)
printf("\n");
}
if ((len % 16) != 0)
printf("\n");
}
/* Read file into buffer */
static uint8_t *get_file_or_die(const char *filename, size_t *len_ptr)
{
@@ -210,6 +258,7 @@ static void do_xfer(struct usb_endpoint *uep, void *outbuf, int outlen,
if ((actual != inlen) && !allow_less) {
fprintf(stderr, "%s:%d, only received %d/%d bytes\n",
__FILE__, __LINE__, actual, inlen);
hexdump(inbuf, actual);
shut_down(uep);
}
@@ -853,20 +902,6 @@ static void get_random(uint8_t *data, int len)
fclose(fp);
}
static void hexdump(const uint8_t *data, int len)
{
int i;
for (i = 0; i < len; i++) {
printf("%02x", data[i]);
if ((i % 16) == 15)
printf("\n");
}
if ((len % 16) != 0)
printf("\n");
}
int main(int argc, char *argv[])
{
struct transfer_descriptor td;
@@ -911,6 +946,15 @@ int main(int argc, char *argv[])
case 'f':
show_fw_ver = 1;
break;
case 'g':
extra_command = UPDATE_EXTRA_CMD_TOUCHPAD_DEBUG;
/* Maximum length. */
extra_command_data_len = 32;
str2hex(optarg,
extra_command_data, &extra_command_data_len);
hexdump(extra_command_data, extra_command_data_len);
extra_command_answer_len = 64;
break;
case 'h':
usage(errorcnt);
break;
@@ -1021,7 +1065,8 @@ int main(int argc, char *argv[])
extra_command_data, extra_command_data_len,
extra_command_answer, extra_command_answer_len);
if (extra_command == UPDATE_EXTRA_CMD_TOUCHPAD_INFO)
if (extra_command == UPDATE_EXTRA_CMD_TOUCHPAD_INFO ||
extra_command == UPDATE_EXTRA_CMD_TOUCHPAD_DEBUG)
hexdump(extra_command_answer, extra_command_answer_len);
}