// SPDX-License-Identifier: GPL-2.0 /* * ELAN HID-I2C TouchScreen driver. * * Copyright (C) 2014 Elan Microelectronics Corporation. * * Author: Chuming Zhang */ #ifndef _LINUX_ELAN_TS_H #define _LINUX_ELAN_TS_H #include #include #include #include #include #include #include #include #include #include #ifdef CONFIG_HAS_EARLYSUSPEND #include #include #endif #if defined(CONFIG_FB) #include #include #endif #include #include /*fw upgrade fuction switch*/ //#define IAP_PORTION /*define elan device name*/ #define ELAN_TS_NAME "elan_ts" #define MIN(x,y) ((((x) - (y)) < 0) ? (x) : (y)) #define FLASH_PAGE_PER_TIMES (30) #define FW_PAGE_SIZE (132) #define IAP_CMD_HEADER_LEN (9) #define IAP_FLASH_SIZE (FLASH_PAGE_PER_TIMES * FW_PAGE_SIZE) #define ELAN_VTG_MIN_UV 3300000//2850000 #define ELAN_VTG_MAX_UV 3300000//2850000 #define ELAN_I2C_VTG_MIN_UV 1800000 #define ELAN_I2C_VTG_MAX_UV 1800000 #define HID_REPORT_MAX_LEN (67*2) #define NORMAL_REPORT_MAX_LEN (55) #define HID_CMD_LEN (37) #define HID_RECV_LEN (67) #define RETRY_TIMES (3) #define FINGERS_NUM 10 struct ts_chip_hw_info { int intr_gpio; int rst_gpio; int irq_num; uint16_t screen_x; uint16_t screen_y; }; struct elan_fw_info { int fw_ver; int fw_id; int fw_bcv; int fw_bcl; int tx; /*tp module y<->tx*/ int rx; /*tp module x<->rx*/ int finger_xres; int finger_yres; int pen_xres; int pen_yres; int finger_osr; int testsolversion; int testversion; int solutionversion; int whck_ver; }; struct elan_update_fw_info { char *FwName; char fw_local_path[50]; const u8 *FwData; const struct firmware *p_fw_entry; int PageNum; int FwSize; int PageSize; u16 remark_id; }; struct elan_i2c_operation{ int (*send)(const uint8_t *, int len); int (*recv)(uint8_t *, int len); int (*poll)(void); }; struct elan_packet_struct { int finger_num; int finger_id; int pen_id; int vaild_size; }; struct elan_finger_struct { int fid; /*finger identify*/ int fsupport_num; /*support finger num*/ int fbuf_valid_size; /*hid: 67/67*2, normal:8/18/35/55*/ int fvalid_num; /*current buf support finger num*/ int fbits; /*current finger is contact or not*/ int fbutton_value; /*mutual button*/ int freport_idx; /*parse coordinate start byte*/ int fshift_byte; /*parse shift byte*/ }; struct elan_stylus_struct { int pid; /*stylus identify*/ int pbuf_valid_size; /*stylus buf size*/ int pbutton_value; /*mutual button,may not use*/ int preport_idx; /*parse coordinate start byte*/ int shitf_byte; /*may not use*/ // int tip_status; /**/ int tip_status; /*contact status*/ int inrange_status; /*hover status*/ int key; /*key status*/ int eraser; /*eraser*/ int inver; /*inver*/ int barrel; /*barrel*/ int barrel_tip; /*barrel+tip*/ }; struct elan_report_struct { struct elan_finger_struct finger; struct elan_stylus_struct stylus; // uint8_t *buf; /*elan report recv buf*/ // int finger_id; /*finger identify*/ // int pen_id; /*stylu identify*/ // int buf_valid_size; /*hid: 67/67*2, normal:8/18/35/55*/ // int finger_num; /*support finger num*/ // int valid_finger_num; /*current buf support finger num*/ // int button_byte; /*muxtual button*/ // int report_idx; /*coordinate calculate start index*/ // int shift_byte; /*calculate shift*/ // int fbits; /*current finger/pen index is valid or not*/ int tool_type; /**/ }; struct elan_ts_data { struct ts_chip_hw_info hw_info; /*elan touch need gpio*/ struct i2c_client *client; struct elan_fw_info fw_info; struct elan_update_fw_info update_info; struct elan_i2c_operation *ops; struct elan_report_struct report; #ifdef CONFIG_HAS_EARLYSUSPEND struct early_suspend early_suspend; /*for early suspend*/ #endif struct regulator *vdd; /*tp vdd*/ struct regulator *vcc_i2c; /*tp vio*/ bool power_enabled; /*power setting flag*/ int power_lock; /*for i2ctransfer on power off flage*/ int recover; /*fw incomplete flag*/ struct miscdevice firmware; /*for misc dev*/ struct proc_dir_entry *p; /*creat proc dev*/ struct input_dev *finger_idev; /*for register finger input device*/ struct input_dev *pen_idev; /*for register pen inpur device*/ #if defined(CONFIG_FB) struct notifier_block fb_notif; /*FB callback*/ #endif int chip_type; /*chip protocol */ int report_type; /*report protocol*/ int fw_store_type; /*fw stroe*/ struct workqueue_struct *init_elan_ic_wq; /*for ic initial*/ struct delayed_work init_work; struct workqueue_struct *elan_wq; /*for irq handler*/ struct work_struct ts_work; uint8_t level; int int_val; /*for user space*/ int user_handle_irq; /*for switch user or kernel handle irq*/ wait_queue_head_t elan_userqueue; /*wait queue for user space read data*/ int irq_lock_flag; /*irq enable/disable flage, 1=>irq has been disable, 0=>has been enable*/ struct mutex irq_mutex; /* Guards against concurrent access to the irq_lock_flag*/ }; struct vendor_map { int vendor_id; //lcm ID char vendor_name[30]; //lcm vendor name uint8_t* fw_array; // lcm_vendor_fw int fw_size; int fw_id; }; enum elan_get_vendor_fw_type { FROM_SYS_ETC_FIRMWARE, FROM_SDCARD_FIRMWARE, FROM_DRIVER_FIRMWARE, }; enum elan_report_protocol_type { PROTOCOL_TYPE_A = 0x00, PROTOCOL_TYPE_B = 0x01, }; enum elan_chip_protocol_type { HID_TYPE_PROTOCOL = 0x01, NORMAL_TYPE_PROTOCOL = 0x00, }; enum elan_fw_status { HID_FW_NORMAL_MODE = 0x20, HID_FW_RECOVERY_MODE = 0x56, NORMAL_FW_NORMAL_MODE = 0x55, NORMAL_FW_RECOVERY_MODE = 0x80, }; enum fw_update_type { FORCED_UPGRADE = 0x01, COMPARE_UPGRADE = 0x02, UNKNOW_TYPE = -1, }; enum packet_head_type { CMD_S_PKT = 0x52, CMD_R_PKT = 0x53, CMD_W_PKT = 0x54, REG_R_PKT = 0x5B, REG_S_PKT = 0x9B, }; enum report_packet_size { NOR2_SIZE = 8, NOR5_SIZE = 18, NOR10_SIZE = 35, HID5_SIZE = 67, HID10_SIZE = 67*2, }; enum report_packet_id { NOR2_FID = 0x5A, NOR5_FID = 0x5D, NOR10_FID = 0x62, HID_FID = 0x01, HID_PID = 0x07, }; enum report_tool_type { ELAN_FINGER = 0x01, ELAN_PEN = 0x02, }; enum elan_power_status { PWR_STATE_DEEP_SLEEP = 0x00, PWR_STATE_NORMAL = 0x01, }; /*************************dev file macro switch********************/ #define ELAN_IAP_DEV #ifdef ELAN_IAP_DEV #define ELAN_IOCTLID 0xD0 #define IOCTL_I2C_SLAVE _IOW(ELAN_IOCTLID, 1, int) #define IOCTL_MAJOR_FW_VER _IOR(ELAN_IOCTLID, 2, int) #define IOCTL_MINOR_FW_VER _IOR(ELAN_IOCTLID, 3, int) #define IOCTL_RESET _IOR(ELAN_IOCTLID, 4, int) #define IOCTL_IAP_MODE_LOCK _IOR(ELAN_IOCTLID, 5, int) #define IOCTL_CHECK_RECOVERY_MODE _IOR(ELAN_IOCTLID, 6, int) #define IOCTL_FW_VER _IOR(ELAN_IOCTLID, 7, int) #define IOCTL_X_RESOLUTION _IOR(ELAN_IOCTLID, 8, int) #define IOCTL_Y_RESOLUTION _IOR(ELAN_IOCTLID, 9, int) #define IOCTL_FW_ID _IOR(ELAN_IOCTLID, 10, int) #define IOCTL_ROUGH_CALIBRATE _IOR(ELAN_IOCTLID, 11, int) #define IOCTL_IAP_MODE_UNLOCK _IOR(ELAN_IOCTLID, 12, int) #define IOCTL_I2C_INT _IOR(ELAN_IOCTLID, 13, int) #define IOCTL_RESUME _IOR(ELAN_IOCTLID, 14, int) #define IOCTL_POWER_LOCK _IOR(ELAN_IOCTLID, 15, int) #define IOCTL_POWER_UNLOCK _IOR(ELAN_IOCTLID, 16, int) #define IOCTL_FW_UPDATE _IOR(ELAN_IOCTLID, 17, int) #define IOCTL_BC_VER _IOR(ELAN_IOCTLID, 18, int) #define IOCTL_2WIREICE _IOR(ELAN_IOCTLID, 19, int) #define IOCTL_VIAROM _IOR(ELAN_IOCTLID, 20, int) #define IOCTL_VIAROM_CHECKSUM _IOW(ELAN_IOCTLID, 21, unsigned long) #define IOCTL_GET_UPDATE_PROGREE _IOR(CUSTOMER_IOCTLID, 2, int) #define IOCTL_USER_HANDLE_IRQ _IOR(ELAN_IOCTLID, 22, int) #define IOCTL_KERN_HANDLE_IRQ _IOR(ELAN_IOCTLID, 23, int) #endif //define print log //#define LOG_TAG(tag) "[tag]: %s() line: %d " #define TP_DEBUG 0//"dbg" #define TP_WARNING 1 #define TP_INFO 2//"info" #define TP_ERR 4//"err" #define print_log(level, fmt, args...) \ do { \ if (level > TP_WARNING) \ printk("[elan]:"fmt"\n",##args);\ } while(0) //extern function extern void elan_check_update_flage(struct elan_ts_data *ts); extern int elan__fw_packet_handler(struct i2c_client *client); extern int elan__hello_packet_handler(struct i2c_client *client, int chip_type); extern void elan_ts_hw_reset(struct ts_chip_hw_info *hw_info); extern void elan_switch_irq(struct elan_ts_data *ts, int on); extern int elan_ts_calibrate(struct i2c_client *client); extern int elan_FW_Update(struct i2c_client *client); extern int elan_ic_status(struct i2c_client *client); extern int elan_ts_check_calibrate(struct i2c_client *client); extern int elan_sysfs_attri_file(struct elan_ts_data *ts); extern void elan_sysfs_attri_file_remove(struct elan_ts_data *ts); extern int elan_get_vendor_fw(struct elan_ts_data *ts, int type); extern int elan_tp_module_test(struct elan_ts_data *ts); #endif /* _LINUX_ELAN_KTF_H */