#include <linux/slab.h>
#include <linux/firmware.h>
+#define IGNORE_CHECKSUM_MISMATCH
+
struct qtm_object {
struct qtm_obj_entry entry;
uint8_t report_id_min;
}
}
- /* configure the grip suppression table */
+ /* configure the grip face suppression table */
obj = find_obj(ts, QTM_OBJ_PROCI_GRIPFACESUPPRESSION);
if (obj && obj->entry.num_inst > 0) {
ret = qtouch_write_addr(ts, obj->entry.addr,
- &ts->pdata->grip_suppression_cfg,
+ &ts->pdata->grip_face_suppression_cfg,
min(sizeof
- (ts->pdata->grip_suppression_cfg),
+ (ts->pdata->grip_face_suppression_cfg),
obj->entry.size));
if (ret != 0) {
- pr_err("%s: Can't write the grip suppression config\n",
+ pr_err("%s: Can't write the grip face suppression config\n",
__func__);
return ret;
}
}
}
+ /* configure the grip suppression table */
+ obj = find_obj(ts, QTM_OBJ_PROCI_GRIPSUPPRESSION);
+ if (obj && obj->entry.num_inst > 0) {
+ ret = qtouch_write_addr(ts, obj->entry.addr,
+ &ts->pdata->gripsuppression_t40_cfg,
+ min(sizeof(ts->pdata->gripsuppression_t40_cfg),
+ obj->entry.size));
+ if (ret != 0) {
+ pr_err("%s: Can't write the grip suppression config\n",
+ __func__);
+ return ret;
+ }
+ }
+
+ /* configure the palm suppression table */
+ obj = find_obj(ts, QTM_OBJ_PROCI_PALMSUPPRESSION);
+ if (obj && obj->entry.num_inst > 0) {
+ ret = qtouch_write_addr(ts, obj->entry.addr,
+ &ts->pdata->palm_suppression_cfg,
+ min(sizeof(ts->pdata->palm_suppression_cfg),
+ obj->entry.size));
+ if (ret != 0) {
+ pr_err("%s: Can't write the palm suppression config\n",
+ __func__);
+ return ret;
+ }
+ }
+
+ /* configure the Digitizer HID config */
+ obj = find_obj(ts, QTM_OBJ_SPT_DIGITIZER);
+ if (obj && obj->entry.num_inst > 0) {
+ ret = qtouch_write_addr(ts, obj->entry.addr,
+ &ts->pdata->spt_digitizer_cfg,
+ min(sizeof(ts->pdata->spt_digitizer_cfg),
+ obj->entry.size));
+ if (ret != 0) {
+ pr_err("%s: Can't write the Digitizer HID config\n",
+ __func__);
+ return ret;
+ }
+ }
+
ret = qtouch_force_calibration(ts);
if (ret != 0) {
pr_err("%s: Unable to recalibrate after reset\n", __func__);
#endif
}
- pr_info("%s: %s found.\n family 0x%x, variant 0x%x, ver 0x%x\n"
- " build 0x%x, matrix %dx%d, %d objects.\n", __func__,
+ pr_info("%s: %s found.\n"
+ " family 0x%x, variant 0x%x, ver 0x%x, build 0x%x\n"
+ " matrix %dx%d, %d objects, info blk chksum 0x%x\n", __func__,
QTOUCH_TS_NAME, qtm_info.family_id, qtm_info.variant_id,
qtm_info.version, qtm_info.build, qtm_info.matrix_x_size,
- qtm_info.matrix_y_size, qtm_info.num_objs);
+ qtm_info.matrix_y_size, qtm_info.num_objs, our_csum);
ts->eeprom_checksum = ts->pdata->nv_checksum;
ts->family_id = qtm_info.family_id;
#define QTM_OBP_BOOT_CRC_PASSED 0x04
#define QTM_OBP_SLEEP_WAIT_FOR_BOOT 100
-#define QTM_OBP_SLEEP_WAIT_FOR_RESET 500
+#define QTM_OBP_SLEEP_WAIT_FOR_RESET 6000
#define QTM_OBP_SLEEP_WAIT_FOR_BACKUP 500
#define QTM_OBP_SLEEP_RESET_HOLD 20
#define QTM_OBP_SLEEP_WAIT_FOR_HW_RESET 40
QTM_OBJ_PROCI_TWO_TOUCH_GESTURE_PROC = 27,
QTM_OBJ_SPT_CTE_CONFIG = 28,
QTM_OBJ_NOISESUPPRESSION_1 = 36,
+ QTM_OBJ_DEBUG_DIAGNOSTIC = 37,
+ QTM_OBJ_SPT_USERDATA = 38,
+ QTM_OBJ_PROCI_GRIPSUPPRESSION = 40,
+ QTM_OBJ_PROCI_PALMSUPPRESSION = 41,
+ QTM_OBJ_SPT_DIGITIZER = 43,
+ QTM_OBJ_SPT_MESSAGECOUNT = 44,
/* Max number of objects currently defined */
- QTM_OBP_MAX_OBJECT_NUM = QTM_OBJ_NOISESUPPRESSION_1 + 1,
+ QTM_OBP_MAX_OBJECT_NUM = QTM_OBJ_SPT_MESSAGECOUNT + 1,
};
/* OBP structures as defined by the wire protocol. */
/* GEN_ACQUIRECONFIG_T8 */
struct qtm_gen_acquire_cfg {
uint8_t charge_time; /* in 250ns */
- uint8_t atouch_drift; /* in 200ms */
+ uint8_t reserve1;
uint8_t touch_drift; /* in 200ms */
uint8_t drift_susp; /* in 200ms */
uint8_t touch_autocal; /* in 200ms */
- uint8_t sync;
+ uint8_t reserve5;
uint8_t atch_cal_suspend_time;
uint8_t atch_cal_suspend_thres;
+ uint8_t atch_cal_force_thres;
+ uint8_t atch_cal_force_ratio;
} __attribute__ ((packed));
/* TOUCH_MULTITOUCHSCREEN_T9 */
uint8_t y_edge_ctrl;
uint8_t y_edge_dist;
uint8_t jump_limit;
+ uint8_t tch_thres_hyst;
+ uint8_t xpitch;
+ uint8_t ypitch;
} __attribute__ ((packed));
/* TOUCH_KEYARRAY_T15 */
uint8_t burst_len;
uint8_t tch_det_thr;
uint8_t tch_det_int;
- uint8_t rsvd1;
- uint8_t rsvd2;
+ uint8_t reserve9;
+ uint8_t reserve10;
} __attribute__ ((packed));
/* PROCG_SIGNALFILTER_T16 */
} __attribute__ ((packed));
/* PROCI_GRIPFACESUPPRESSION_T20 */
-struct qtm_proci_grip_suppression_cfg {
+struct qtm_proci_grip_face_suppression_cfg {
uint8_t ctrl;
uint8_t xlogrip;
uint8_t xhigrip;
uint8_t ylogrip;
uint8_t yhigrip;
uint8_t maxtchs;
- uint8_t reserve0;
+ uint8_t reserve6;
uint8_t szthr1;
uint8_t szthr2;
uint8_t shpthr1;
/* PROCG_NOISESUPPRESSION_T22 */
struct qtm_procg_noise_suppression_cfg {
uint8_t ctrl;
- uint8_t outlier_filter_len;
- uint8_t reserve0;
- uint16_t gcaf_upper_limit;
- uint16_t gcaf_lower_limit;
- uint8_t gcaf_low_count;
- uint8_t noise_threshold;
uint8_t reserve1;
+ uint8_t reserve2;
+ uint8_t reserve3;
+ uint8_t reserve4;
+ uint8_t reserve5;
+ uint8_t reserve6;
+ uint8_t reserve7;
+ uint8_t noise_thres;
+ uint8_t reserve9;
uint8_t freq_hop_scale;
uint8_t burst_freq_0;
uint8_t burst_freq_1;
uint8_t burst_freq_2;
uint8_t burst_freq_3;
uint8_t burst_freq_4;
- uint8_t idle_gcaf_valid;
+ uint8_t reserve16;
} __attribute__ ((packed));
/* TOUCH_PROXIMITY_T23 */
uint8_t y_origin;
uint8_t x_size;
uint8_t y_size;
- uint8_t reserve0;
+ uint8_t reserve5;
uint8_t blen;
uint16_t tch_thresh;
uint8_t tch_detect_int;
/* PROCI_ONETOUCHGESTUREPROCESSOR_T24 */
struct qtm_proci_one_touch_gesture_proc_cfg {
uint8_t ctrl;
- uint8_t reserve0;
+ uint8_t num_gestures;
uint16_t gesture_enable;
uint8_t pres_proc;
uint8_t tap_time_out;
/* PROCI_TWOTOUCHGESTUREPROCESSOR_T27 */
struct qtm_proci_two_touch_gesture_proc_cfg {
uint8_t ctrl;
- uint8_t reserved0;
- uint8_t reserved1;
+ uint8_t num_gestures;
+ uint8_t reserve2;
uint8_t gesture_enable;
uint8_t rotate_threshold;
uint16_t zoom_threshold;
struct qtm_spt_cte_config_cfg {
uint8_t ctrl;
uint8_t command;
- uint8_t mode;
+ uint8_t reserve2;
uint8_t idle_gcaf_depth;
uint8_t active_gcaf_depth;
uint8_t voltage;
uint8_t x_short;
} __attribute__ ((packed));
+/* QTM_OBJ_PROCI_GRIPSUPPRESSION T40 */
+struct qtm_proci_gripsuppression_cfg {
+ uint8_t ctrl;
+ uint8_t xlo_grip;
+ uint8_t xhi_grip;
+ uint8_t ylo_grip;
+ uint8_t yhi_grip;
+} __attribute__ ((packed));
+
+/* QTM_OBJ_PROCI_PALMSUPPRESSION T41 */
+struct qtm_proci_palm_suppression_cfg {
+ uint8_t ctrl;
+ uint8_t small_obj_thr;
+ uint8_t sig_spread_thr;
+ uint8_t large_obj_thr;
+ uint8_t distance_thr;
+ uint8_t sup_ext_to;
+} __attribute__ ((packed));
+
+/* QTM_OBJ_SPT_DIGITIZER T43 */
+struct qtm_spt_digitizer_cfg {
+ uint8_t ctrl;
+ uint8_t hid_idlerate;
+ uint16_t xlength;
+ uint16_t ylength;
+} __attribute__ ((packed));
+
/*******************************/
/******** platform data ********/
/*******************************/
struct qtm_proci_linear_tbl_cfg linear_tbl_cfg;
struct spt_comms_config_cfg comms_config_cfg;
struct qtm_spt_gpio_pwm_cfg gpio_pwm_cfg;
- struct qtm_proci_grip_suppression_cfg grip_suppression_cfg;
+ struct qtm_proci_grip_face_suppression_cfg grip_face_suppression_cfg;
struct qtm_procg_noise_suppression_cfg noise_suppression_cfg;
struct qtm_touch_proximity_cfg touch_proximity_cfg;
struct qtm_proci_one_touch_gesture_proc_cfg one_touch_gesture_proc_cfg;
struct qtm_proci_two_touch_gesture_proc_cfg two_touch_gesture_proc_cfg;
struct qtm_spt_cte_config_cfg cte_config_cfg;
struct qtm_proci_noise1_suppression_cfg noise1_suppression_cfg;
+ struct qtm_proci_gripsuppression_cfg gripsuppression_t40_cfg;
+ struct qtm_proci_palm_suppression_cfg palm_suppression_cfg;
+ struct qtm_spt_digitizer_cfg spt_digitizer_cfg;
struct virt_keys vkeys;
};