diff options
author | Wei-Han Chen <stimim@google.com> | 2018-03-12 20:15:34 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-03-26 23:33:33 -0700 |
commit | d8225540d9acbb26e29df6b5555090bc5b48579e (patch) | |
tree | cf08252feabac2a2e36e3d670195019e4f6d37b4 /driver/touchpad_st.h | |
parent | 6a7fb0d39bf84d7199f0a3f1f9a32cd85dc1113e (diff) | |
download | chrome-ec-d8225540d9acbb26e29df6b5555090bc5b48579e.tar.gz |
ec: add driver/touchpad_st.c
Initial commit for ST touchpad.
This CL will support X/Y mode function.
BRANCH=none
BUG=b:70482333
TEST=make BOARD=whiskers
TEST=manually test touchpad function on whiskers
Signed-off-by: Wei-Han Chen <stimim@chromium.org>
Change-Id: I1669286ca764fbbd4a691171193415dd4999673f
Reviewed-on: https://chromium-review.googlesource.com/958894
Commit-Ready: Wei-Han Chen <stimim@chromium.org>
Tested-by: Wei-Han Chen <stimim@chromium.org>
Reviewed-by: Wei-Han Chen <stimim@chromium.org>
Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Diffstat (limited to 'driver/touchpad_st.h')
-rw-r--r-- | driver/touchpad_st.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/driver/touchpad_st.h b/driver/touchpad_st.h new file mode 100644 index 0000000000..23bb404d36 --- /dev/null +++ b/driver/touchpad_st.h @@ -0,0 +1,245 @@ +/* Copyright 2018 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef __CROS_EC_TOUCHPAD_ST_H +#define __CROS_EC_TOUCHPAD_ST_H + +#include <stdint.h> + +#include "common.h" + +#define ST_VENDOR_ID 0x0483 + +#define ST_TP_DUMMY_BYTE 1 + +#define ST_TP_CMD_READ_ALL_EVENTS 0x87 +#define ST_TP_CMD_WRITE_SCAN_MODE_SELECT 0xA0 +#define ST_TP_CMD_WRITE_FEATURE_SELECT 0xA2 +#define ST_TP_CMD_WRITE_SYSTEM_COMMAND 0xA4 +#define ST_TP_CMD_WRITE_HOST_DATA_MEMORY 0xA6 +#define ST_TP_CMD_READ_HOST_DATA_MEMORY 0xA7 +#define ST_TP_CMD_WRITE_FW_CONFIG 0xA8 +#define ST_TP_CMD_READ_FW_CONFIG 0xA9 +#define ST_TP_CMD_SPI_HOST_BUFFER_ACK 0xC0 +#define ST_TP_CMD_READ_SPI_HOST_BUFFER 0xC1 + +#define ST_TP_CMD_WRITE_HW_REG 0xFA +#define ST_TP_CMD_READ_HW_REG 0xFB + +/* Max number of bytes that the DMA can burn on the flash in one shot in FTI */ +#define ST_TP_FLASH_BUFFER_SIZE (64 * 1024) +/* Max number of bytes that can be written in I2C to the DMA */ +#define ST_TP_DMA_CHUNK_SIZE 32 + +#define ST_HOST_BUFFER_DATA_VALID (1 << 0) +#define ST_HOST_BUFFER_MT_READY (1 << 3) +#define ST_HOST_BUFFER_SF_READY (1 << 4) +#define ST_HOST_BUFFER_SS_READY (1 << 5) + +#define ST_TP_SCAN_MODE_ACTIVE 0x00 +#define ST_TP_SCAN_MODE_LOW_POWER 0x01 +#define ST_TP_SCAN_MODE_TUNING_WIZARD 0x02 +#define ST_TP_SCAN_MODE_LOCKED 0x03 + +#define ST_TOUCH_ROWS (18) /* force len */ +#define ST_TOUCH_COLS (25) /* sense len */ + +#define ST_TOUCH_HEADER_SIZE 32 + +#define BYTES_PER_PIXEL 2 +/* Number of bits per pixel, this value is decided by experiments. */ +#define BITS_PER_PIXEL (11) + +#define ST_TOUCH_FRAME_SIZE (ST_TOUCH_ROWS * ST_TOUCH_COLS * \ + BYTES_PER_PIXEL) +#define ST_TOUCH_FORCE_SIZE (ST_TOUCH_ROWS * BYTES_PER_PIXEL) +#define ST_TOUCH_SENSE_SIZE (ST_TOUCH_COLS * BYTES_PER_PIXEL) + +#define ST_TP_MEM_ID_SYSTEM_INFO 0x01 + +#define ST_TP_FLASH_OFFSET_CODE (0x0000 << 2) +#define ST_TP_FLASH_OFFSET_CONFIG (0x7C00 << 2) +#define ST_TP_FLASH_OFFSET_CX (0x7000 << 2) + + +struct st_tp_host_data_header_t { +#define ST_TP_HEADER_MAGIC 0xA5 + uint8_t magic; /* this should always be ST_TP_HEADER_MAGIC */ + uint8_t host_data_mem_id; + uint16_t count; +} __packed; + +/* Compute offset of end of a member in given type */ +#define endof(type, member) (offsetof(type, member) + \ + sizeof(((type *)NULL)->member)) + +struct st_tp_system_info_t { + /* Part 1, basic info */ + struct st_tp_host_data_header_t header; + uint16_t api_ver_rev; + uint8_t api_ver_minor; + uint8_t api_ver_major; + uint16_t chip0_ver; + uint8_t chip0_id[2]; /* should be 0x3936 */ + uint16_t chip1_ver; + uint16_t chip1_id; + uint16_t fw_ver; + uint16_t svn_rev; + uint16_t cfg_ver; + uint16_t cfg_project_id; + uint16_t cx_ver; + uint16_t cx_project_id; + uint8_t cfg_afe_ver; + uint8_t cx_afe_ver; + uint8_t panel_cfg_afe_ver; + uint8_t protocol; + uint8_t die_id[16]; + uint64_t release_info; /* unsigned little endian 64 bit integer */ + uint32_t fw_crc; + uint32_t cfg_crc; +#define ST_TP_SYSTEM_INFO_PART_1_SIZE endof(struct st_tp_system_info_t, cfg_crc) +#define ST_TP_SYSTEM_INFO_PART_1_RESERVED 16 + + uint16_t scr_res_x; + uint16_t scr_res_y; + uint8_t scr_tx_len; + uint8_t scr_rx_len; + uint8_t key_len; + uint8_t frc_len; +#define ST_TP_SYSTEM_INFO_PART_2_SIZE (endof(struct st_tp_system_info_t, \ + frc_len) - \ + offsetof(struct st_tp_system_info_t, \ + scr_res_x)) +#define ST_TP_SYSTEM_INFO_PART_2_RESERVED 40 + +#if 0 /* the following parts are defined in spec, but not currently used. */ + + uint16_t dbg_frame_addr; +#define ST_TP_SYSTEM_INFO_PART_3_SIZE (endof(struct st_tp_system_info_t, \ + dbg_frame_addr) - \ + offsetof(struct st_tp_system_info_t, \ + dbg_frame_addr)) +#define ST_TP_SYSTEM_INFO_PART_3_RESERVED 6 + + uint16_t ms_scr_raw_addr; + uint16_t ms_scr_filter_addr; + uint16_t ms_scr_str_addr; + uint16_t ms_scr_bl_addr; + uint16_t ss_tch_tx_raw_addr; + uint16_t ss_tch_tx_filter_addr; + uint16_t ss_tch_tx_str_addr; + uint16_t ss_tch_tx_bl_addr; + uint16_t ss_tch_rx_raw_addr; + uint16_t ss_tch_rx_filter_addr; + uint16_t ss_tch_rx_str_addr; + uint16_t ss_tch_rx_bl_addr; + uint16_t key_raw_addr; + uint16_t key_filter_addr; + uint16_t key_str_addr; + uint16_t key_bl_addr; + uint16_t frc_raw_addr; + uint16_t frc_filter_addr; + uint16_t frc_str_addr; + uint16_t frc_bl_addr; + uint16_t ss_hvr_tx_raw_addr; + uint16_t ss_hvr_tx_filter_addr; + uint16_t ss_hvr_tx_str_addr; + uint16_t ss_hvr_tx_bl_addr; + uint16_t ss_hvr_rx_raw_addr; + uint16_t ss_hvr_rx_filter_addr; + uint16_t ss_hvr_rx_str_addr; + uint16_t ss_hvr_rx_bl_addr; + uint16_t ss_prx_tx_raw_addr; + uint16_t ss_prx_tx_filter_addr; + uint16_t ss_prx_tx_str_addr; + uint16_t ss_prx_tx_bl_addr; + uint16_t ss_prx_rx_raw_addr; + uint16_t ss_prx_rx_filter_addr; + uint16_t ss_prx_rx_str_addr; + uint16_t ss_prx_rx_bl_addr; +#define ST_TP_SYSTEM_INFO_PART_4_SIZE (endof(struct st_tp_system_info_t, \ + ss_prx_rx_bl_addr) - \ + offsetof(struct st_tp_system_info_t, \ + ms_scr_raw_addr)) +#endif /* if 0 */ +} __packed; + +#define ST_TP_SYSTEM_INFO_LEN (sizeof(struct st_tp_system_info_t) + \ + ST_TP_SYSTEM_INFO_PART_1_RESERVED) + +struct st_tp_host_buffer_header_t { +#define ST_TP_BUFFER_HEADER_DATA_VALID (1 << 0) +#define ST_TP_BUFFER_HEADER_EVT_FIFO_NOT_EMPTY (1 << 1) +#define ST_TP_BUFFER_HEADER_SYS_FAULT (1 << 2) +#define ST_TP_BUFFER_HEADER_HEAT_MAP_MT_RDY (1 << 3) +#define ST_TP_BUFFER_HEADER_HEAT_MAP_SF_RDY (1 << 4) +#define ST_TP_BUFFER_HEADER_HEAT_MAP_SS_RDY (1 << 5) +#define ST_TP_BUFFER_HEADER_DOMESWITCH_CHG (1 << 6) + uint8_t flags; + uint8_t reserved[3]; + uint8_t heatmap_miss_count; + uint8_t event_count; + uint8_t event_miss_count; + uint8_t dome_switch_down_count:3; + uint8_t dome_switch_up_count:3; + uint8_t dome_switch_level:1; + uint8_t dome_switch_overflow:1; +} __packed; + +struct st_tp_host_buffer_heat_map_t { + uint8_t frame[ST_TOUCH_FRAME_SIZE]; +#if 0 /* we are not using these now */ + uint8_t force[ST_TOUCH_FORCE_SIZE]; + uint8_t sense[ST_TOUCH_SENSE_SIZE]; +#endif +} __packed; + +struct st_tp_event_t { + unsigned magic:2; /* should always be 0x3 */ + unsigned major_high:2; +#define ST_TP_EVENT_ID_ENTER_POINTER 0x1 +#define ST_TP_EVENT_ID_MOTION_POINTER 0x2 +#define ST_TP_EVENT_ID_LEAVE_POINTER 0x3 +#define ST_TP_EVENT_ID_STATUS_REPORT 0x4 +#define ST_TP_EVENT_ID_USER_REPORT 0x5 +#define ST_TP_EVENT_ID_DEBUG_REPORT 0xe +#define ST_TP_EVENT_ID_ERROR_REPORT 0xf + unsigned evt_id:4; + + union { + struct { +#define ST_TP_TOUCH_TYPE_INVALID 0x0 +#define ST_TP_TOUCH_TYPE_FINGER 0x1 +#define ST_TP_TOUCH_TYPE_GLOVE 0x2 +#define ST_TP_TOUCH_TYPE_STYLUS 0x3 +#define ST_TP_TOUCH_TYPE_PALM 0x4 + unsigned touch_type:4; + unsigned touch_id:4; + unsigned y:12; + unsigned x:12; + uint8_t z; + uint8_t minor:4; // need to be concat with minor_high + uint8_t major:4; // need to be concat with major_high + } __packed finger; + + struct { + uint8_t report_type; + uint32_t info; + uint8_t reserved; + } __packed report; + } __packed ; /* anonymous */ + + unsigned minor_high:2; + unsigned reserved:1; + unsigned evt_left:5; +} __packed; + +enum ST_TP_MODE { + X_Y_MODE = 0, + HEAT_MAP_MODE, +}; + +#endif /* __CROS_EC_TOUCHPAD_ST_H */ + |