/* * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "himax_platform.h" #ifdef CONFIG_DRM #include #elif defined(CONFIG_FB) #include #include #elif defined(CONFIG_HAS_EARLYSUSPEND) #include #endif #ifdef CONFIG_OF #include #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