496 lines
12 KiB
C
496 lines
12 KiB
C
/*
|
|
* Himax Android Driver Sample Code for common functions
|
|
*
|
|
* Copyright (C) 2018 Himax Corporation.
|
|
*
|
|
* 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.
|
|
*
|
|
*/
|
|
|
|
#ifndef HIMAX_COMMON_H
|
|
#define HIMAX_COMMON_H
|
|
|
|
#include <asm/segment.h>
|
|
#include <linux/uaccess.h>
|
|
#include <linux/atomic.h>
|
|
|
|
#include <linux/delay.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/input.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/module.h>
|
|
#include <linux/async.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/gpio.h>
|
|
#include <linux/input/mt.h>
|
|
#include <linux/firmware.h>
|
|
#include <linux/types.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/buffer_head.h>
|
|
#include <linux/device.h>
|
|
#include <linux/pm_wakeup.h>
|
|
#include <linux/seq_file.h>
|
|
#include <linux/proc_fs.h>
|
|
#include "himax_platform.h"
|
|
|
|
#ifdef CONFIG_DRM
|
|
#include <linux/msm_drm_notify.h>
|
|
#elif defined(CONFIG_FB)
|
|
#include <linux/notifier.h>
|
|
#include <linux/fb.h>
|
|
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
|
#include <linux/earlysuspend.h>
|
|
#endif
|
|
|
|
#ifdef CONFIG_OF
|
|
#include <linux/of_gpio.h>
|
|
#endif
|
|
|
|
#define HIMAX_DRIVER_VER "1.2.2.4_ABCD1234_01"
|
|
|
|
#define FLASH_DUMP_FILE "/sdcard/HX_Flash_Dump.bin"
|
|
|
|
#if defined(CONFIG_TOUCHSCREEN_HIMAX_DEBUG)
|
|
#define HX_TP_PROC_2T2R
|
|
/*#define HX_TP_SELF_TEST_DRIVER*/ /* if enable, selftest works in driver */
|
|
#endif
|
|
/*===========Himax Option function=============*/
|
|
#define HX_RST_PIN_FUNC
|
|
#define HX_RESUME_SEND_CMD
|
|
#define HX_ESD_RECOVERY
|
|
#define HX_AUTO_UPDATE_FW
|
|
/*#define HX_SMART_WAKEUP*/
|
|
/*#define HX_GESTURE_TRACK*/
|
|
/*#define HX_HIGH_SENSE*/
|
|
/*#define HX_PALM_REPORT*/
|
|
/*#define HX_USB_DETECT_GLOBAL*/
|
|
/*#define HX_USB_DETECT_CALLBACK*/
|
|
/*#define HX_PROTOCOL_A*/ /* for MTK special platform.If turning on,it will report to system by using specific format. */
|
|
#define HX_RESUME_HW_RESET
|
|
#define HX_PROTOCOL_B_3PA
|
|
/*#define HX_FIX_TOUCH_INFO*/ /* if open, you need to change the touch info in the fix_touch_info*/
|
|
/*#define HX_ZERO_FLASH*/
|
|
#define HX_ORG_SELFTEST
|
|
/*#define CONFIG_CHIP_DTCFG*/
|
|
|
|
/*#define HX_EN_SEL_BUTTON*/ /* Support Self Virtual key, default is close*/
|
|
/*#define HX_EN_MUT_BUTTON*/ /* Support Mutual Virtual Key, default is close*/
|
|
|
|
#if defined(HX_EN_SEL_BUTTON) || defined(HX_EN_MUT_BUTTON)
|
|
/*#define HX_PLATFOME_DEFINE_KEY*/ /* for specific platform to set key(button) */
|
|
#endif
|
|
|
|
#define HX_TOUCH_ID_MAX 10
|
|
#define HX_KEY_MAX_COUNT 4
|
|
#define DEFAULT_RETRY_CNT 3
|
|
|
|
#define HX_85XX_A_SERIES_PWON "HX85xxA"
|
|
#define HX_85XX_B_SERIES_PWON "HX85xxB"
|
|
#define HX_85XX_C_SERIES_PWON "HX85xxC"
|
|
#define HX_85XX_D_SERIES_PWON "HX85xxD"
|
|
#define HX_85XX_E_SERIES_PWON "HX85xxE"
|
|
#define HX_85XX_ES_SERIES_PWON "HX85xxES"
|
|
#define HX_85XX_F_SERIES_PWON "HX85xxF"
|
|
#define HX_85XX_H_SERIES_PWON "HX85xxH"
|
|
#define HX_83100A_SERIES_PWON "HX83100A"
|
|
#define HX_83102A_SERIES_PWON "HX83102A"
|
|
#define HX_83102B_SERIES_PWON "HX83102B"
|
|
#define HX_83102D_SERIES_PWON "HX83102D"
|
|
#define HX_83103A_SERIES_PWON "HX83103A"
|
|
#define HX_83110A_SERIES_PWON "HX83110A"
|
|
#define HX_83110B_SERIES_PWON "HX83110B"
|
|
#define HX_83111B_SERIES_PWON "HX83111B"
|
|
#define HX_83112A_SERIES_PWON "HX83112A"
|
|
#define HX_83112B_SERIES_PWON "HX83112B"
|
|
#define HX_83112D_SERIES_PWON "HX83112D"
|
|
#define HX_83112E_SERIES_PWON "HX83112E"
|
|
#define HX_83191A_SERIES_PWON "HX83191A"
|
|
|
|
#define HX_TP_BIN_CHECKSUM_SW 1
|
|
#define HX_TP_BIN_CHECKSUM_HW 2
|
|
#define HX_TP_BIN_CHECKSUM_CRC 3
|
|
|
|
#define SHIFTBITS 5
|
|
|
|
#define FW_SIZE_32k 32768
|
|
#define FW_SIZE_60k 61440
|
|
#define FW_SIZE_64k 65536
|
|
#define FW_SIZE_124k 126976
|
|
#define FW_SIZE_128k 131072
|
|
|
|
#define NO_ERR 0
|
|
#define READY_TO_SERVE 1
|
|
#define WORK_OUT 2
|
|
#define I2C_FAIL -1
|
|
#define MEM_ALLOC_FAIL -2
|
|
#define CHECKSUM_FAIL -3
|
|
#define GESTURE_DETECT_FAIL -4
|
|
#define INPUT_REGISTER_FAIL -5
|
|
#define FW_NOT_READY -6
|
|
#define LENGTH_FAIL -7
|
|
#define OPEN_FILE_FAIL -8
|
|
#define ERR_WORK_OUT -10
|
|
#define HW_CRC_FAIL 1
|
|
|
|
#define HX_FINGER_ON 1
|
|
#define HX_FINGER_LEAVE 2
|
|
|
|
#define HX_REPORT_SZ 128
|
|
#define HX_CMD_BYTE 1
|
|
|
|
enum HX_TS_PATH {
|
|
HX_REPORT_COORD = 1,
|
|
HX_REPORT_SMWP_EVENT,
|
|
HX_REPORT_COORD_RAWDATA,
|
|
};
|
|
|
|
enum HX_TS_STATUS {
|
|
HX_TS_GET_DATA_FAIL = -4,
|
|
HX_ESD_EVENT,
|
|
HX_CHKSUM_FAIL,
|
|
HX_PATH_FAIL,
|
|
HX_TS_NORMAL_END = 0,
|
|
HX_ESD_REC_OK,
|
|
HX_READY_SERVE,
|
|
HX_REPORT_DATA,
|
|
HX_ESD_WARNING,
|
|
HX_IC_RUNNING,
|
|
HX_ZERO_EVENT_COUNT,
|
|
HX_RST_OK,
|
|
};
|
|
|
|
enum cell_type {
|
|
CHIP_IS_ON_CELL,
|
|
CHIP_IS_IN_CELL
|
|
};
|
|
#ifdef HX_FIX_TOUCH_INFO
|
|
enum fix_touch_info {
|
|
FIX_HX_RX_NUM = 0,
|
|
FIX_HX_TX_NUM = 0,
|
|
FIX_HX_BT_NUM = 0,
|
|
FIX_HX_X_RES = 0,
|
|
FIX_HX_Y_RES = 0,
|
|
FIX_HX_MAX_PT = 0,
|
|
FIX_HX_XY_REVERSE = false,
|
|
FIX_HX_INT_IS_EDGE = true,
|
|
#ifdef HX_TP_PROC_2T2R
|
|
FIX_HX_RX_NUM_2 = 0,
|
|
FIX_HX_TX_NUM_2 = 0,
|
|
#endif
|
|
};
|
|
#endif
|
|
|
|
#ifdef HX_ZERO_FLASH
|
|
#define HX_0F_DEBUG
|
|
#endif
|
|
struct himax_ic_data {
|
|
int vendor_fw_ver;
|
|
int vendor_config_ver;
|
|
int vendor_touch_cfg_ver;
|
|
int vendor_display_cfg_ver;
|
|
int vendor_cid_maj_ver;
|
|
int vendor_cid_min_ver;
|
|
int vendor_panel_ver;
|
|
int vendor_sensor_id;
|
|
int HX_RX_NUM;
|
|
int HX_TX_NUM;
|
|
int HX_BT_NUM;
|
|
int HX_X_RES;
|
|
int HX_Y_RES;
|
|
int HX_MAX_PT;
|
|
bool HX_XY_REVERSE;
|
|
bool HX_INT_IS_EDGE;
|
|
#ifdef HX_TP_PROC_2T2R
|
|
int HX_RX_NUM_2;
|
|
int HX_TX_NUM_2;
|
|
#endif
|
|
};
|
|
|
|
struct himax_virtual_key {
|
|
int index;
|
|
int keycode;
|
|
int x_range_min;
|
|
int x_range_max;
|
|
int y_range_min;
|
|
int y_range_max;
|
|
};
|
|
|
|
struct himax_target_report_data {
|
|
int *x;
|
|
int *y;
|
|
int *w;
|
|
int *finger_id;
|
|
int finger_on;
|
|
int finger_num;
|
|
#ifdef HX_PLATFORM_DEFINE_KEY
|
|
int key_size;
|
|
int *key_x;
|
|
int *key_y;
|
|
int *key_w;
|
|
#endif
|
|
#ifdef HX_SMART_WAKEUP
|
|
int SMWP_event_chk;
|
|
#endif
|
|
};
|
|
|
|
struct himax_report_data {
|
|
int touch_all_size;
|
|
int raw_cnt_max;
|
|
int raw_cnt_rmd;
|
|
int touch_info_size;
|
|
uint8_t finger_num;
|
|
uint8_t finger_on;
|
|
uint8_t *hx_coord_buf;
|
|
uint8_t hx_state_info[2];
|
|
#if defined(HX_SMART_WAKEUP)
|
|
int event_size;
|
|
uint8_t *hx_event_buf;
|
|
#endif
|
|
|
|
int rawdata_size;
|
|
uint8_t diag_cmd;
|
|
uint8_t *hx_rawdata_buf;
|
|
uint8_t rawdata_frame_size;
|
|
};
|
|
|
|
struct himax_ts_data {
|
|
bool initialized;
|
|
bool suspended;
|
|
atomic_t suspend_mode;
|
|
uint8_t x_channel;
|
|
uint8_t y_channel;
|
|
uint8_t useScreenRes;
|
|
uint8_t diag_cmd;
|
|
char chip_name[30];
|
|
uint8_t chip_cell_type;
|
|
|
|
uint8_t protocol_type;
|
|
uint8_t first_pressed;
|
|
uint8_t coord_data_size;
|
|
uint8_t area_data_size;
|
|
uint8_t coordInfoSize;
|
|
uint8_t raw_data_frame_size;
|
|
uint8_t raw_data_nframes;
|
|
uint8_t nFinger_support;
|
|
uint8_t irq_enabled;
|
|
uint8_t diag_self[50];
|
|
|
|
uint16_t finger_pressed;
|
|
uint16_t last_slot;
|
|
uint16_t pre_finger_mask;
|
|
uint16_t old_finger;
|
|
int hx_point_num;
|
|
|
|
uint32_t debug_log_level;
|
|
uint32_t widthFactor;
|
|
uint32_t heightFactor;
|
|
uint32_t tw_x_min;
|
|
uint32_t tw_x_max;
|
|
uint32_t tw_y_min;
|
|
uint32_t tw_y_max;
|
|
uint32_t pl_x_min;
|
|
uint32_t pl_x_max;
|
|
uint32_t pl_y_min;
|
|
uint32_t pl_y_max;
|
|
|
|
int rst_gpio;
|
|
int use_irq;
|
|
int (*power)(int on);
|
|
int pre_finger_data[10][2];
|
|
|
|
struct device *dev;
|
|
struct workqueue_struct *himax_wq;
|
|
struct work_struct work;
|
|
struct input_dev *input_dev;
|
|
struct hrtimer timer;
|
|
struct i2c_client *client;
|
|
struct himax_i2c_platform_data *pdata;
|
|
struct himax_virtual_key *button;
|
|
struct mutex rw_lock;
|
|
|
|
/******* SPI-start *******/
|
|
struct mutex spi_lock;
|
|
struct spi_device *spi;
|
|
int hx_irq;
|
|
/******* SPI-end *******/
|
|
|
|
int in_self_test;
|
|
|
|
#if defined(CONFIG_FB) || defined(CONFIG_DRM)
|
|
struct notifier_block fb_notif;
|
|
#elif defined(CONFIG_HAS_EARLYSUSPEND)
|
|
struct early_suspend early_suspend;
|
|
#endif
|
|
|
|
struct workqueue_struct *flash_wq;
|
|
struct work_struct flash_work;
|
|
|
|
#ifdef HX_AUTO_UPDATE_FW
|
|
struct workqueue_struct *himax_update_wq;
|
|
struct delayed_work work_update;
|
|
#endif
|
|
|
|
#ifdef HX_ZERO_FLASH
|
|
struct workqueue_struct *himax_0f_update_wq;
|
|
struct delayed_work work_0f_update;
|
|
#endif
|
|
|
|
struct workqueue_struct *himax_diag_wq;
|
|
struct delayed_work himax_diag_delay_wrok;
|
|
|
|
#ifdef HX_SMART_WAKEUP
|
|
uint8_t SMWP_enable;
|
|
uint8_t gesture_cust_en[16];
|
|
struct wakeup_source ts_SMWP_wake_src;
|
|
#endif
|
|
|
|
#ifdef HX_HIGH_SENSE
|
|
uint8_t HSEN_enable;
|
|
#endif
|
|
|
|
#if defined(HX_USB_DETECT_CALLBACK) || defined(HX_USB_DETECT_GLOBAL)
|
|
uint8_t usb_connected;
|
|
uint8_t *cable_config;
|
|
#endif
|
|
|
|
#if defined(CONFIG_TOUCHSCREEN_HIMAX_ITO_TEST)
|
|
struct workqueue_struct *ito_test_wq;
|
|
struct work_struct ito_test_work;
|
|
#endif
|
|
|
|
uint8_t *i2c_data; /* for I2C DMA transfer */
|
|
};
|
|
|
|
struct himax_debug {
|
|
bool flash_dump_going;
|
|
void (*fp_ts_dbg_func)(struct himax_ts_data *ts, int start);
|
|
int (*fp_set_diag_cmd)(struct himax_ic_data *ic_data, struct himax_report_data *hx_touch_data);
|
|
};
|
|
|
|
enum input_protocol_type {
|
|
PROTOCOL_TYPE_A = 0x00,
|
|
PROTOCOL_TYPE_B = 0x01,
|
|
};
|
|
|
|
#ifdef HX_HIGH_SENSE
|
|
void himax_set_HSEN_func(uint8_t HSEN_enable);
|
|
#endif
|
|
|
|
#ifdef HX_SMART_WAKEUP
|
|
void himax_set_SMWP_func(uint8_t SMWP_enable);
|
|
|
|
#define GEST_PTLG_ID_LEN (4)
|
|
#define GEST_PTLG_HDR_LEN (4)
|
|
#define GEST_PTLG_HDR_ID1 (0xCC)
|
|
#define GEST_PTLG_HDR_ID2 (0x44)
|
|
#define GEST_PT_MAX_NUM (128)
|
|
|
|
enum gesture_event_type {
|
|
EV_GESTURE_01 = 0x01,
|
|
EV_GESTURE_02,
|
|
EV_GESTURE_03,
|
|
EV_GESTURE_04,
|
|
EV_GESTURE_05,
|
|
EV_GESTURE_06,
|
|
EV_GESTURE_07,
|
|
EV_GESTURE_08,
|
|
EV_GESTURE_09,
|
|
EV_GESTURE_10,
|
|
EV_GESTURE_11,
|
|
EV_GESTURE_12,
|
|
EV_GESTURE_13,
|
|
EV_GESTURE_14,
|
|
EV_GESTURE_15,
|
|
EV_GESTURE_PWR = 0x80,
|
|
};
|
|
|
|
#define KEY_CUST_01 251
|
|
#define KEY_CUST_02 252
|
|
#define KEY_CUST_03 253
|
|
#define KEY_CUST_04 254
|
|
#define KEY_CUST_05 255
|
|
#define KEY_CUST_06 256
|
|
#define KEY_CUST_07 257
|
|
#define KEY_CUST_08 258
|
|
#define KEY_CUST_09 259
|
|
#define KEY_CUST_10 260
|
|
#define KEY_CUST_11 261
|
|
#define KEY_CUST_12 262
|
|
#define KEY_CUST_13 263
|
|
#define KEY_CUST_14 264
|
|
#define KEY_CUST_15 265
|
|
#endif
|
|
|
|
#if defined(CONFIG_TOUCHSCREEN_HIMAX_ITO_TEST)
|
|
extern uint8_t himax_ito_test(void);
|
|
#endif
|
|
|
|
extern struct himax_ts_data *private_ts;
|
|
extern struct himax_ic_data *ic_data;
|
|
extern struct himax_report_data *hx_touch_data;
|
|
extern struct himax_core_fp g_core_fp;
|
|
extern struct himax_debug *debug_data;
|
|
extern uint8_t HX_PROC_SEND_FLAG;
|
|
|
|
extern unsigned long FW_VER_MAJ_FLASH_ADDR;
|
|
extern unsigned long FW_VER_MIN_FLASH_ADDR;
|
|
extern unsigned long CFG_VER_MAJ_FLASH_ADDR;
|
|
extern unsigned long CFG_VER_MIN_FLASH_ADDR;
|
|
extern unsigned long CID_VER_MAJ_FLASH_ADDR;
|
|
extern unsigned long CID_VER_MIN_FLASH_ADDR;
|
|
|
|
extern unsigned long FW_VER_MAJ_FLASH_LENG;
|
|
extern unsigned long FW_VER_MIN_FLASH_LENG;
|
|
extern unsigned long CFG_VER_MAJ_FLASH_LENG;
|
|
extern unsigned long CFG_VER_MIN_FLASH_LENG;
|
|
extern unsigned long CID_VER_MAJ_FLASH_LENG;
|
|
extern unsigned long CID_VER_MIN_FLASH_LENG;
|
|
extern unsigned char IC_CHECKSUM;
|
|
|
|
extern unsigned long FW_CFG_VER_FLASH_ADDR;
|
|
|
|
#ifdef HX_RST_PIN_FUNC
|
|
extern u8 HX_HW_RESET_ACTIVATE;
|
|
|
|
extern void himax_rst_gpio_set(int pinnum, uint8_t value);
|
|
#endif
|
|
|
|
/* void himax_HW_reset(uint8_t loadconfig,uint8_t int_off); */
|
|
|
|
extern int himax_chip_common_suspend(struct himax_ts_data *ts);
|
|
extern int himax_chip_common_resume(struct himax_ts_data *ts);
|
|
extern int himax_chip_common_init(void);
|
|
extern void himax_chip_common_deinit(void);
|
|
extern int himax_fb_register(struct himax_ts_data *ts);
|
|
extern int himax_input_register(struct himax_ts_data *ts);
|
|
extern void himax_ts_work(struct himax_ts_data *ts);
|
|
extern enum hrtimer_restart himax_ts_timer_func(struct hrtimer *timer);
|
|
extern int himax_report_data_init(void);
|
|
extern struct proc_dir_entry *himax_touch_proc_dir;
|
|
|
|
extern int himax_parse_dt(struct himax_ts_data *ts, struct himax_i2c_platform_data *pdata);
|
|
extern int himax_dev_set(struct himax_ts_data *ts);
|
|
extern int himax_input_register_device(struct input_dev *input_dev);
|
|
|
|
#ifdef HX_USB_DETECT_GLOBAL
|
|
extern void himax_cable_detect_func(bool force_renew);
|
|
#endif
|
|
|
|
/* ts_work about start */
|
|
extern struct himax_target_report_data *g_target_report_data;
|
|
extern int himax_report_data(struct himax_ts_data *ts, int ts_path, int ts_status);
|
|
/* ts_work about end */
|
|
|
|
void himax_update_register(struct work_struct *work);
|
|
|
|
#endif
|
|
|