diff options
author | Nicolas Boichat <drinkcat@google.com> | 2017-07-10 08:24:13 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-08-03 00:32:05 -0700 |
commit | e525e1af8a9d89fe1613238b4a5eb458e7f5c7de (patch) | |
tree | 04690eea15be6fc1de7952d7f803fe6ac20745ed | |
parent | 959452ac9744c981dd2c94f4ef680e8ed3df76a0 (diff) | |
download | chrome-ec-e525e1af8a9d89fe1613238b4a5eb458e7f5c7de.tar.gz |
usb_update: Add a way to fetch touchpad information
We'd like to know touchpad vendor/product id, as well as currently
running FW version. This CL does that by adding a new
UPDATE_EXTRA_CMD_TOUCHPAD_INFO command.
We also make the interface more generic by adding a CONFIG_TOUCHPAD
configuration option, even though we only support Elan touchpads
currently.
BRANCH=none
BUG=b:63418037
TEST=Flash hammer, ./usb_updater -t
Change-Id: Icce3c785eb3235bcc50b2ae7c0227ce11cbc9f2b
Signed-off-by: Nicolas Boichat <drinkcat@google.com>
Reviewed-on: https://chromium-review.googlesource.com/593000
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Chun-ta Lin <itspeter@chromium.org>
-rw-r--r-- | board/hammer/board.h | 1 | ||||
-rw-r--r-- | common/usb_update.c | 20 | ||||
-rw-r--r-- | driver/touchpad_elan.c | 35 | ||||
-rw-r--r-- | include/config.h | 3 | ||||
-rw-r--r-- | include/update_fw.h | 17 |
5 files changed, 76 insertions, 0 deletions
diff --git a/board/hammer/board.h b/board/hammer/board.h index 3aabd26f7a..63f750f9a2 100644 --- a/board/hammer/board.h +++ b/board/hammer/board.h @@ -175,6 +175,7 @@ #define CONFIG_PWM /* Enable elan trackpad driver */ +#define CONFIG_TOUCHPAD #define CONFIG_TOUCHPAD_ELAN #define CONFIG_TOUCHPAD_I2C_PORT 0 #define CONFIG_TOUCHPAD_I2C_ADDR (0x15 << 1) diff --git a/common/usb_update.c b/common/usb_update.c index 440f4c3711..235c94640a 100644 --- a/common/usb_update.c +++ b/common/usb_update.c @@ -298,6 +298,26 @@ static int try_vendor_command(struct consumer const *consumer, size_t count) #endif #endif /* CONFIG_ROLLBACK_SECRET_SIZE */ #endif /* CONFIG_ROLLBACK */ +#ifdef CONFIG_TOUCHPAD + case UPDATE_EXTRA_CMD_TOUCHPAD_INFO: { + struct touchpad_info tp = { 0 }; + + if (data_count != 0) { + response = EC_RES_INVALID_PARAM; + break; + } + + response_size = touchpad_get_info(&tp); + if (response_size < 1) { + response = EC_RES_ERROR; + break; + } + + QUEUE_ADD_UNITS(&update_to_usb, + &tp, response_size); + return 1; + } +#endif default: response = EC_RES_INVALID_COMMAND; } diff --git a/driver/touchpad_elan.c b/driver/touchpad_elan.c index 3c8d5abeae..8262a2dcdc 100644 --- a/driver/touchpad_elan.c +++ b/driver/touchpad_elan.c @@ -10,6 +10,7 @@ #include "i2c.h" #include "task.h" #include "timer.h" +#include "update_fw.h" #include "util.h" #include "usb_hid_touchpad.h" @@ -22,16 +23,21 @@ /* How to talk to the controller */ /******************************************************************************/ +#define ELAN_VENDOR_ID 0x04f3 + #define ETP_I2C_RESET 0x0100 #define ETP_I2C_WAKE_UP 0x0800 #define ETP_I2C_SLEEP 0x0801 #define ETP_I2C_STAND_CMD 0x0005 +#define ETP_I2C_UNIQUEID_CMD 0x0101 +#define ETP_I2C_FW_VERSION_CMD 0x0102 #define ETP_I2C_XY_TRACENUM_CMD 0x0105 #define ETP_I2C_MAX_X_AXIS_CMD 0x0106 #define ETP_I2C_MAX_Y_AXIS_CMD 0x0107 #define ETP_I2C_RESOLUTION_CMD 0x0108 #define ETP_I2C_PRESSURE_CMD 0x010A #define ETP_I2C_SET_CMD 0x0300 +#define ETP_I2C_FW_CHECKSUM_CMD 0x030F #define ETP_ENABLE_ABS 0x0001 @@ -277,6 +283,35 @@ out: return rv; } +#ifdef CONFIG_USB_UPDATE +int touchpad_get_info(struct touchpad_info *tp) +{ + int rv; + uint16_t val; + + tp->status = EC_RES_SUCCESS; + tp->vendor = ELAN_VENDOR_ID; + + /* Get unique ID, FW, SM version. */ + rv = elan_tp_read_cmd(ETP_I2C_UNIQUEID_CMD, &val); + if (rv) + return -1; + tp->elan.id = val; + + rv = elan_tp_read_cmd(ETP_I2C_FW_VERSION_CMD, &val); + if (rv) + return -1; + tp->elan.fw_version = val & 0xff; + + rv = elan_tp_read_cmd(ETP_I2C_FW_CHECKSUM_CMD, &val); + if (rv) + return -1; + tp->elan.fw_checksum = val; + + return sizeof(*tp); +} +#endif + void elan_tp_interrupt(enum gpio_signal signal) { task_wake(TASK_ID_TOUCHPAD); diff --git a/include/config.h b/include/config.h index c241fb2657..04f87de2d4 100644 --- a/include/config.h +++ b/include/config.h @@ -2251,6 +2251,9 @@ /*****************************************************************************/ /* Touchpad config */ +/* Enable touchpad, you must pick a driver (currently, only Elan exists) */ +#undef CONFIG_TOUCHPAD + /* Enable Elan driver */ #undef CONFIG_TOUCHPAD_ELAN diff --git a/include/update_fw.h b/include/update_fw.h index 5218d07bdf..44c64468f6 100644 --- a/include/update_fw.h +++ b/include/update_fw.h @@ -164,6 +164,7 @@ enum update_extra_command { UPDATE_EXTRA_CMD_UNLOCK_ROLLBACK = 4, UPDATE_EXTRA_CMD_INJECT_ENTROPY = 5, UPDATE_EXTRA_CMD_PAIR_CHALLENGE = 6, + UPDATE_EXTRA_CMD_TOUCHPAD_INFO = 7, }; /* @@ -188,6 +189,19 @@ struct pair_challenge_response { uint8_t authenticator[16]; } __packed; +struct touchpad_info { + uint8_t status; /* = EC_RES_SUCCESS */ + uint8_t reserved; /* padding */ + uint16_t vendor; /* Vendor USB id */ + + /* Vendor specific data. */ + struct { + uint16_t id; + uint16_t fw_version; + uint16_t fw_checksum; + } elan; +} __packed; + void fw_update_command_handler(void *body, size_t cmd_size, size_t *response_size); @@ -213,4 +227,7 @@ enum { UPDATE_RWSIG_BUSY = 10, }; +/* Obtain touchpad information */ +int touchpad_get_info(struct touchpad_info *tp); + #endif /* ! __CROS_EC_UPDATE_FW_H */ |