blob: b8ef41f58420ce6394e60f815c5818218dbfde19 [file] [log] [blame]
/*
*
* FocalTech TouchScreen driver.
*
* Copyright (c) 2010-2016, 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 "focaltech_common.h"
/*****************************************************************************
* Private constant and macro definitions using #define
*****************************************************************************/
#define LEN_FLASH_ECC_MAX 0xFFFE
#define FTS_WORKQUEUE_NAME "fts_wq"
#define FTS_MAX_POINTS 10
#define FTS_KEY_WIDTH 50
#define FTS_ONE_TCH_LEN 6
#define POINT_READ_BUF (3 + FTS_ONE_TCH_LEN * FTS_MAX_POINTS)
#define FTS_MAX_ID 0x0F
#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 FTS_SYSFS_ECHO_ON(buf) ((strnicmp(buf, "1", 1) == 0) || \
(strnicmp(buf, "on", 2) == 0))
#define FTS_SYSFS_ECHO_OFF(buf) ((strnicmp(buf, "0", 1) == 0) || \
(strnicmp(buf, "off", 3) == 0))
/*****************************************************************************
* Private enumerations, structures and unions using typedef
*****************************************************************************/
struct fts_ts_platform_data {
u32 fts_chip_type;
u32 irq_gpio;
u32 irq_gpio_flags;
u32 reset_gpio;
u32 reset_gpio_flags;
bool have_key;
u32 key_number;
u32 keys[4];
u32 key_y_coord;
u32 key_x_coords[4];
u32 x_max;
u32 y_max;
u32 x_min;
u32 y_min;
u32 max_touch_number;
bool swap;
bool scaling_down_half;
};
struct ts_event {
u16 au16_x[FTS_MAX_POINTS]; /*x coordinate */
u16 au16_y[FTS_MAX_POINTS]; /*y coordinate */
u16 pressure[FTS_MAX_POINTS];
/* touch event: 0 -- down; 1-- up; 2 -- contact */
u8 au8_touch_event[FTS_MAX_POINTS];
u8 au8_finger_id[FTS_MAX_POINTS]; /*touch ID */
u8 area[FTS_MAX_POINTS];
u8 touch_point;
u8 point_num;
};
struct fts_ts_data {
struct i2c_client *client;
struct input_dev *input_dev;
struct ts_event event;
const struct fts_ts_platform_data *pdata;
#if FTS_PSENSOR_EN
struct fts_psensor_platform_data *psensor_pdata;
#endif
struct work_struct touch_event_work;
struct workqueue_struct *ts_workqueue;
struct regulator *vdd;
struct regulator *vcc_i2c;
spinlock_t irq_lock;
u16 addr;
bool suspended;
u8 fw_ver[3];
u8 fw_vendor_id;
int touchs;
int irq_disable;
#if defined(CONFIG_FB)
struct notifier_block fb_notif;
#elif defined(CONFIG_HAS_EARLYSUSPEND)
struct early_suspend early_suspend;
#endif
};
#if FTS_PSENSOR_EN
struct fts_psensor_platform_data {
struct input_dev *input_psensor_dev;
struct sensors_classdev ps_cdev;
int tp_psensor_opened;
char tp_psensor_data; /* 0 near, 1 far */
struct fts_ts_data *data;
};
int fts_sensor_init(struct fts_ts_data *data);
int fts_sensor_read_data(struct fts_ts_data *data);
int fts_sensor_suspend(struct fts_ts_data *data);
int fts_sensor_resume(struct fts_ts_data *data);
int fts_sensor_remove(struct fts_ts_data *data);
#endif
/*****************************************************************************
* Static variables
*****************************************************************************/
extern struct i2c_client *fts_i2c_client;
extern struct fts_ts_data *fts_wq_data;
extern struct input_dev *fts_input_dev;
#endif /* __LINUX_FOCALTECH_CORE_H__ */