blob: 712d437204afdf6323ed83545da278875439eeb8 [file] [edit]
/*
*
* FocalTech fts TouchScreen driver.
*
* Copyright (c) 2012-2020, Focaltech Ltd. All rights reserved.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
/*****************************************************************************
*
* File Name: focaltech_common.h
*
* Author: Focaltech Driver Team
*
* Created: 2016-08-16
*
* Abstract:
*
* Reference:
*
*****************************************************************************/
#ifndef __LINUX_FOCALTECH_COMMON_H__
#define __LINUX_FOCALTECH_COMMON_H__
#include "focaltech_config.h"
#if IS_ENABLED(CONFIG_TOUCHSCREEN_PANEL_BRIDGE)
#include <drm/drm_bridge.h>
#include <drm/drm_device.h>
#include <drm/drm_encoder.h>
#include <drm/drm_modes.h>
#include <drm/drm_panel.h>
#include <samsung/exynos_drm_connector.h>
#endif
#if IS_ENABLED(CONFIG_TOUCHSCREEN_TBN)
#include <touch_bus_negotiator.h>
#endif
/*****************************************************************************
* Macro definitions using #define
*****************************************************************************/
#define FTS_DRIVER_VERSION "Focaltech V3.3 20201229"
#define BYTE_OFF_0(x) (u8)((x) & 0xFF)
#define BYTE_OFF_8(x) (u8)(((x) >> 8) & 0xFF)
#define BYTE_OFF_16(x) (u8)(((x) >> 16) & 0xFF)
#define BYTE_OFF_24(x) (u8)(((x) >> 24) & 0xFF)
#define FLAGBIT(x) (0x00000001 << (x))
#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) & (0xFFFFFFFF << (x)))
#define FLAG_ICSERIALS_LEN 8
#define FLAG_HID_BIT 10
#define FLAG_IDC_BIT 11
#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
#define IC_TO_SERIALS(x) ((x) & FLAGBITS(0, FLAG_ICSERIALS_LEN-1))
#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT))
#define FTS_HID_SUPPORTTED ((FTS_CHIP_TYPE & FLAGBIT(FLAG_HID_BIT)) == FLAGBIT(FLAG_HID_BIT))
#define FTS_MAX_CHIP_IDS 8
#define FTS_RESET_INTERVAL 200
#define FTS_CHIP_TYPE_MAPPING {{0x88, 0x56, 0x52, 0x00, 0x00, 0x00, 0x00, 0x56, 0xB2}}
#define FTS_STTW_E3_BUF_LEN 13
#define FTS_LPTW_E2_BUF_LEN 13
#define FTS_LPTW_E1_BUF_LEN 12
#define FTS_LPTW_BUF_LEN (max(FTS_LPTW_E1_BUF_LEN, FTS_LPTW_E2_BUF_LEN))
#define FILE_NAME_LENGTH 128
#define FTS_MESSAGE_LENGTH 128
#define ENABLE 1
#define DISABLE 0
#define VALID 1
#define INVALID 0
#define MAX_RETRY_CNT 3
#define FTS_CMD_START1 0x55
#define FTS_CMD_START2 0xAA
#define FTS_CMD_START_DELAY 12
#define FTS_CMD_READ_ID 0x90
#define FTS_CMD_READ_ID_LEN 4
#define FTS_CMD_READ_ID_LEN_INCELL 1
#define FTS_CMD_READ_FW_CONF 0xA8
#define FTS_CMD_READ_TOUCH_DATA 0x01
/*register address*/
#define FTS_REG_INT_CNT 0x8F
#define FTS_REG_FLOW_WORK_CNT 0x91
#define FTS_REG_WORKMODE 0x00
#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40
#define FTS_REG_WORKMODE_WORK_VALUE 0x00
#define FTS_REG_ESDCHECK_DISABLE 0x8D
#define FTS_REG_CHIP_ID 0xA3
#define FTS_REG_CHIP_ID2 0x9F
#define FTS_REG_POWER_MODE 0xA5
#define FTS_REG_POWER_MODE_SLEEP 0x03
#define FTS_REG_FW_MAJOR_VER 0xA6
#define FTS_REG_FW_MINOR_VER 0xAD
#define FTS_REG_VENDOR_ID 0xA8
#define FTS_REG_LCD_BUSY_NUM 0xAB
#define FTS_REG_FACE_DEC_MODE_EN 0xB0
#define FTS_REG_FACTORY_MODE_DETACH_FLAG 0xB4
#define FTS_REG_FACE_DEC_MODE_STATUS 0x01
#define FTS_REG_IDE_PARA_VER_ID 0xB5
#define FTS_REG_IDE_PARA_STATUS 0xB6
#define FTS_REG_GLOVE_MODE_EN 0xC0
#define FTS_REG_COVER_MODE_EN 0xC1
#define FTS_REG_PALM_EN 0xC5
#define FTS_REG_CHARGER_MODE_EN 0x8B
#define FTS_REG_EDGE_MODE_EN 0x8C
#define FTS_REG_GESTURE_EN 0xD0
#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3
#define FTS_REG_MODULE_ID 0xE3
#define FTS_REG_LIC_VER 0xE4
#define FTS_REG_ESD_SATURATE 0xED
#define FTS_REG_GESTURE_SWITCH 0xCF
#define FTS_REG_MONITOR_CTRL 0x86
#define FTS_REG_SENSE_ONOFF 0xEA
#define FTS_REG_IRQ_ONOFF 0xEB
#define FTS_REG_CLR_RESET 0xEC
#define FTS_REG_HEATMAP_1E 0x1E
#define FTS_REG_HEATMAP_ED 0xED
#define FTS_REG_HEATMAP_9E 0x9E
#define FTS_LPTW_REG_SET_E1 0xE1
#define FTS_LPTW_REG_SET_E2 0xE2
#define FTS_STTW_REG_SET_E3 0xE3
#define FTS_GESTURE_MAJOR_MINOR 0xE5
#define FTS_REG_CONTINUOUS_EN 0xE7
#define FTS_REG_CUSTOMER_STATUS 0xB2 // follow FTS_CUSTOMER_STATUS.
// bit 0~1 : HOPPING
// bit 2 : PALM
// bit 3 : WATER
// bit 4 : GRIP
// bit 5 : GLOVE
// bit 6 : STTW
// bit 7 : LPWG
#define FTS_CAP_DATA_LEN 91
#define FTS_SELF_DATA_LEN 68
#define FTS_FULL_TOUCH_RAW_SIZE(tx_num, rx_num) \
(FTS_CAP_DATA_LEN + ((tx_num) * (rx_num) + FTS_SELF_DATA_LEN * 2) * sizeof(u16))
#define FTS_PRESSURE_SCALE 85 // 255 / 3
#define FTS_CUSTOMER_STATUS_LEN 4
#define FTS_CUSTOMER_STATUS1_MASK 0x0F
#define FTS_ORIENTATION_SCALE 45
#define FTS_GESTURE_ID_STTW 0x25
#define FTS_GESTURE_ID_LPTW_DOWN 0x26
#define FTS_GESTURE_ID_LPTW_UP 0x27
#define FTS_SYSFS_ECHO_ON(buf) (buf[0] == '1')
#define FTS_SYSFS_ECHO_OFF(buf) (buf[0] == '0')
#define kfree_safe(pbuf) do {\
if (pbuf) {\
kfree(pbuf);\
pbuf = NULL;\
}\
} while(0)
/*****************************************************************************
* Alternative mode (When something goes wrong, the modules may be able to solve the problem.)
*****************************************************************************/
/*
* point report check
* default: disable
*/
#define FTS_POINT_REPORT_CHECK_EN 0
/*****************************************************************************
* Global variable or extern global variabls/functions
*****************************************************************************/
struct ft_chip_t {
u16 type;
u8 chip_idh;
u8 chip_idl;
u8 rom_idh;
u8 rom_idl;
u8 pb_idh;
u8 pb_idl;
u8 bl_idh;
u8 bl_idl;
};
struct ft_chip_id_t {
u16 type;
u16 chip_ids[FTS_MAX_CHIP_IDS];
};
struct ts_ic_info {
bool is_incell;
bool hid_supported;
struct ft_chip_t ids;
struct ft_chip_id_t cid;
};
#if IS_ENABLED(CONFIG_TOUCHSCREEN_PANEL_BRIDGE)
enum {
FTS_TS_BUS_REF_SCREEN_ON = 0x01,
FTS_TS_BUS_REF_IRQ = 0x02,
FTS_TS_BUS_REF_FW_UPDATE = 0x04,
FTS_TS_BUS_REF_SYSFS = 0x0008,
FTS_TS_BUS_REF_FORCE_ACTIVE = 0x0010,
FTS_TS_BUS_REF_BUGREPORT = 0x0020,
};
enum TOUCH_POWER_MODE {
FTS_TS_STATE_POWER_ON = 0,
FTS_TS_STATE_SUSPEND,
};
#endif
/* Firmware Grip suppression mode.
* 0 - Disable fw grip suppression.
* 1 - Enable fw grip suppression.
* 2 - Force disable fw grip suppression.
* 3 - Force enable fw grip suppression.
*/
enum FW_GRIP_MODE {
FW_GRIP_DISABLE,
FW_GRIP_ENABLE,
FW_GRIP_FORCE_DISABLE,
FW_GRIP_FORCE_ENABLE,
};
/* Firmware Heatmap mode.
* 0 - Disable fw heatmap.
* 1 - Enable fw compressed heatmap.
* 2 - Enable fw uncompressed heatmap.
*/
enum FW_HEATMAP_MODE {
FW_HEATMAP_MODE_DISABLE,
FW_HEATMAP_MODE_COMPRESSED,
FW_HEATMAP_MODE_UNCOMPRESSED,
};
/* Firmware Palm rejection mode.
* 0 - Disable fw palm rejection.
* 1 - Enable fw palm rejection.
* 2 - Force disable fw palm rejection.
* 3 - Force enable fw palm rejection.
*/
enum FW_PALM_MODE {
FW_PALM_DISABLE,
FW_PALM_ENABLE,
FW_PALM_FORCE_DISABLE,
FW_PALM_FORCE_ENABLE,
};
#if IS_ENABLED(CONFIG_TOUCHSCREEN_TBN)
enum TBN_OWRER {
TBN_AP,
TBN_AOC,
};
#endif
/*****************************************************************************
* DEBUG function define here
*****************************************************************************/
#undef pr_fmt
#define pr_fmt(fmt) "gtd: FTS_TS: " fmt
#if FTS_DEBUG_EN
#define FTS_DEBUG(fmt, ...) pr_info(fmt, ##__VA_ARGS__)
#define FTS_FUNC_ENTER() pr_debug("%s: Enter\n", __func__)
#define FTS_FUNC_EXIT() pr_debug("%s: Exit(%d)\n", __func__, __LINE__)
#else /* #if FTS_DEBUG_EN*/
#define FTS_DEBUG(fmt, ...)
#define FTS_FUNC_ENTER()
#define FTS_FUNC_EXIT()
#endif
#define FTS_INFO(fmt, ...) pr_info(fmt, ##__VA_ARGS__)
#define FTS_ERROR(fmt, ...) pr_err(fmt, ##__VA_ARGS__)
#define PR_LOGD(fmt, ...) pr_debug(fmt, ##__VA_ARGS__)
#endif /* __LINUX_FOCALTECH_COMMON_H__ */