| /* |
| * |
| * FocalTech TouchScreen driver. |
| * |
| * Copyright (c) 2010-2017, 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_core.h |
| |
| * Author: Focaltech Driver Team |
| * |
| * Created: 2016-08-08 |
| * |
| * Abstract: |
| * |
| * Reference: |
| * |
| *****************************************************************************/ |
| |
| #ifndef __LINUX_FOCALTECH_CORE_H__ |
| #define __LINUX_FOCALTECH_CORE_H__ |
| /***************************************************************************** |
| * Included header files |
| *****************************************************************************/ |
| #include <linux/i2c.h> |
| #include <linux/input.h> |
| #include <linux/input/mt.h> |
| #include <linux/slab.h> |
| #include <linux/interrupt.h> |
| #include <linux/delay.h> |
| #include <linux/kernel.h> |
| #include <linux/module.h> |
| #include <linux/gpio.h> |
| #include <linux/of_gpio.h> |
| #include <linux/regulator/consumer.h> |
| #include <linux/firmware.h> |
| #include <linux/debugfs.h> |
| #include <linux/mutex.h> |
| #include <linux/wait.h> |
| #include <linux/time.h> |
| #include <linux/workqueue.h> |
| #include <linux/fs.h> |
| #include <linux/proc_fs.h> |
| #include <asm/uaccess.h> |
| #include <linux/version.h> |
| #include <linux/types.h> |
| #include <linux/sched.h> |
| #include <linux/kthread.h> |
| #include <linux/init.h> |
| #include <linux/cdev.h> |
| #include <linux/device.h> |
| #include <linux/mount.h> |
| #include <linux/netdevice.h> |
| #include <linux/unistd.h> |
| #include <linux/ioctl.h> |
| #include <linux/vmalloc.h> |
| #include "focaltech_common.h" |
| |
| /***************************************************************************** |
| * Private constant and macro definitions using #define |
| *****************************************************************************/ |
| #define FTS_MAX_POINTS_SUPPORT 10 /* constant value, can't be changed */ |
| #define FTS_MAX_KEYS 4 |
| #define FTS_KEY_WIDTH 50 |
| #define FTS_ONE_TCH_LEN 6 |
| |
| #define FTS_MAX_ID 0x0A |
| #define FTS_TOUCH_X_H_POS 3 |
| #define FTS_TOUCH_X_L_POS 4 |
| #define FTS_TOUCH_Y_H_POS 5 |
| #define FTS_TOUCH_Y_L_POS 6 |
| #define FTS_TOUCH_PRE_POS 7 |
| #define FTS_TOUCH_AREA_POS 8 |
| #define FTS_TOUCH_POINT_NUM 2 |
| #define FTS_TOUCH_EVENT_POS 3 |
| #define FTS_TOUCH_ID_POS 5 |
| #define FTS_COORDS_ARR_SIZE 4 |
| |
| #define FTS_TOUCH_DOWN 0 |
| #define FTS_TOUCH_UP 1 |
| #define FTS_TOUCH_CONTACT 2 |
| #define EVENT_DOWN(flag) ((FTS_TOUCH_DOWN == flag) || (FTS_TOUCH_CONTACT == flag)) |
| #define EVENT_UP(flag) (FTS_TOUCH_UP == flag) |
| #define EVENT_NO_DOWN(data) (!data->point_num) |
| #define KEY_EN(data) (data->pdata->have_key) |
| #define TOUCH_IS_KEY(y, key_y) (y == key_y) |
| #define TOUCH_IN_RANGE(val, key_val, half) ((val > (key_val - half)) && (val < (key_val + half))) |
| #define TOUCH_IN_KEY(x, key_x) TOUCH_IN_RANGE(x, key_x, FTS_KEY_WIDTH) |
| |
| /***************************************************************************** |
| * Private enumerations, structures and unions using typedef |
| *****************************************************************************/ |
| struct fts_ts_platform_data { |
| u32 irq_gpio; |
| u32 irq_gpio_flags; |
| u32 reset_gpio; |
| u32 reset_gpio_flags; |
| bool have_key; |
| u32 key_number; |
| u32 keys[FTS_MAX_KEYS]; |
| u32 key_y_coord; |
| u32 key_x_coords[FTS_MAX_KEYS]; |
| u32 x_max; |
| u32 y_max; |
| u32 x_min; |
| u32 y_min; |
| u32 max_touch_number; |
| }; |
| |
| struct ts_event { |
| int x; /*x coordinate */ |
| int y; /*y coordinate */ |
| int p; /* pressure */ |
| int flag; /* touch event flag: 0 -- down; 1-- up; 2 -- contact */ |
| int id; /*touch ID */ |
| int area; |
| }; |
| |
| enum fts_panel_vendor { |
| FTS_PANEL_VENDOR_NONE = 0, |
| FTS_PANEL_VENDOR_BOE = 1, |
| FTS_PANEL_VENDOR_INX = 2 |
| }; |
| |
| struct fts_ts_data { |
| struct i2c_client *client; |
| struct input_dev *input_dev; |
| struct fts_ts_platform_data *pdata; |
| struct ts_ic_info ic_info; |
| struct workqueue_struct *ts_workqueue; |
| struct work_struct fwupg_work; |
| struct delayed_work esdcheck_work; |
| struct delayed_work prc_work; |
| struct regulator *vdd; |
| struct regulator *vcc_i2c; |
| spinlock_t irq_lock; |
| struct mutex report_mutex; |
| int irq; |
| bool suspended; |
| bool fw_loading; |
| bool irq_disabled; |
| enum fts_panel_vendor panel_vendor; |
| #if FTS_POWER_SOURCE_CUST_EN |
| bool power_disabled; |
| #endif |
| /* multi-touch */ |
| struct ts_event *events; |
| u8 *point_buf; |
| int pnt_buf_size; |
| int touchs; |
| bool key_down; |
| int touch_point; |
| int point_num; |
| struct proc_dir_entry *proc; |
| u8 proc_opmode; |
| #if FTS_PINCTRL_EN |
| struct pinctrl *pinctrl; |
| struct pinctrl_state *pins_active; |
| struct pinctrl_state *pins_suspend; |
| struct pinctrl_state *pins_release; |
| #endif |
| #if defined(CONFIG_FB) |
| struct notifier_block fb_notif; |
| #elif defined(CONFIG_HAS_EARLYSUSPEND) |
| struct early_suspend early_suspend; |
| #endif |
| }; |
| |
| |
| /***************************************************************************** |
| * Global variable or extern global variabls/functions |
| *****************************************************************************/ |
| extern struct fts_ts_data *fts_data; |
| |
| /* i2c communication*/ |
| int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); |
| int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); |
| int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); |
| int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); |
| void fts_i2c_hid2std(struct i2c_client *client); |
| int fts_i2c_init(void); |
| int fts_i2c_exit(void); |
| |
| /* Gesture functions */ |
| #if FTS_GESTURE_EN |
| int fts_gesture_init(struct fts_ts_data *ts_data); |
| int fts_gesture_exit(struct i2c_client *client); |
| void fts_gesture_recovery(struct i2c_client *client); |
| int fts_gesture_readdata(struct fts_ts_data *ts_data); |
| int fts_gesture_suspend(struct i2c_client *i2c_client); |
| int fts_gesture_resume(struct i2c_client *client); |
| #endif |
| |
| /* Apk and functions */ |
| #if FTS_APK_NODE_EN |
| int fts_create_apk_debug_channel(struct fts_ts_data *); |
| void fts_release_apk_debug_channel(struct fts_ts_data *); |
| #endif |
| |
| /* ADB functions */ |
| #if FTS_SYSFS_NODE_EN |
| int fts_create_sysfs(struct i2c_client *client); |
| int fts_remove_sysfs(struct i2c_client *client); |
| #endif |
| |
| /* ESD */ |
| #if FTS_ESDCHECK_EN |
| int fts_esdcheck_init(struct fts_ts_data *ts_data); |
| int fts_esdcheck_exit(struct fts_ts_data *ts_data); |
| int fts_esdcheck_switch(bool enable); |
| int fts_esdcheck_proc_busy(bool proc_debug); |
| int fts_esdcheck_set_intr(bool intr); |
| int fts_esdcheck_suspend(void); |
| int fts_esdcheck_resume(void); |
| #endif |
| |
| /* Production test */ |
| #if FTS_TEST_EN |
| int fts_test_init(struct i2c_client *client); |
| int fts_test_exit(struct i2c_client *client); |
| #endif |
| |
| /* Point Report Check*/ |
| #if FTS_POINT_REPORT_CHECK_EN |
| int fts_point_report_check_init(struct fts_ts_data *ts_data); |
| int fts_point_report_check_exit(struct fts_ts_data *ts_data); |
| void fts_prc_queue_work(struct fts_ts_data *ts_data); |
| #endif |
| |
| /* FW upgrade */ |
| int fts_upgrade_bin(struct i2c_client *client, char *fw_name, bool force); |
| int fts_fwupg_init(struct fts_ts_data *ts_data); |
| int fts_fwupg_exit(struct fts_ts_data *ts_data); |
| |
| /* Other */ |
| int fts_reset_proc(int hdelayms); |
| int fts_wait_tp_to_valid(struct i2c_client *client); |
| void fts_tp_state_recovery(struct i2c_client *client); |
| int fts_ex_mode_init(struct i2c_client *client); |
| int fts_ex_mode_exit(struct i2c_client *client); |
| int fts_ex_mode_recovery(struct i2c_client *client); |
| |
| void fts_irq_disable(void); |
| void fts_irq_enable(void); |
| |
| #endif /* __LINUX_FOCALTECH_CORE_H__ */ |