mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-10 17:41:54 +00:00
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>
This commit is contained in:
committed by
chrome-bot
parent
959452ac97
commit
e525e1af8a
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user