mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 23:24:22 -04:00
goodix_berlin_mmi: active touch area feature
Added support for active touch area. This feature utilized by Rollable HAL in Felix. Goodix calls this feature display modes. Currently supports 5 modes that correspods to primary, rear and full touch active regions in different slider positions Change-Id: I0535c1a8c80947452bc20b92feded4d71b8a1905 Signed-off-by: Konstantin Makariev <hcv867@motorola.com> Reviewed-on: https://gerrit.mot.com/2360061 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Qing Chang <qing@motorola.com> Submit-Approved: Jira Key
This commit is contained in:
parent
a69a9b5793
commit
6c77e4e403
4 changed files with 71 additions and 2 deletions
|
|
@ -63,6 +63,9 @@ endif
|
|||
ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),)
|
||||
EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI
|
||||
goodix_brl_mmi-objs += goodix_ts_mmi.o
|
||||
ifneq ($(filter felix, $(USE_TARGET_PRODUCT)), )
|
||||
EXTRA_CFLAGS += -CONFIG_GTP_DISP_MODE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifneq ($(findstring _factory,$(TARGET_PRODUCT)),)
|
||||
|
|
|
|||
|
|
@ -395,6 +395,37 @@ static int brl_send_cmd(struct goodix_ts_core *cd,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GTP_DISP_MODE
|
||||
#define DISP_MODE_CMD_LEN 5
|
||||
#define DISP_MODE_CMD 0xbb
|
||||
#define DISP_MODE_MAX 4
|
||||
|
||||
static int brl_set_display_mode(struct goodix_ts_core *cd, int mode)
|
||||
{
|
||||
struct goodix_ts_cmd temp_cmd;
|
||||
int ret;
|
||||
|
||||
if (mode < 0 || mode > DISP_MODE_MAX) {
|
||||
ts_err("invalid mode: %d", mode);
|
||||
return -EINVAL;
|
||||
}
|
||||
temp_cmd.len = DISP_MODE_CMD_LEN;
|
||||
temp_cmd.cmd = DISP_MODE_CMD;
|
||||
temp_cmd.data[0] = mode;
|
||||
|
||||
ret = brl_send_cmd(cd, &temp_cmd);
|
||||
if (ret < 0) {
|
||||
ts_err("failed to set display mode");
|
||||
return -EIO;
|
||||
}
|
||||
ts_info("set display mode: %d", temp_cmd.data[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int inline brl_set_display_mode(struct goodix_ts_core *cd, int mode) { return -EINVAL; }
|
||||
#endif
|
||||
|
||||
#pragma pack(1)
|
||||
struct goodix_config_head {
|
||||
union {
|
||||
|
|
@ -1465,6 +1496,7 @@ static struct goodix_ts_hw_ops brl_hw_ops = {
|
|||
.event_handler = brl_event_handler,
|
||||
.after_event_handler = brl_after_event_handler,
|
||||
.get_capacitance_data = brl_get_capacitance_data,
|
||||
.display_mode = brl_set_display_mode,
|
||||
};
|
||||
|
||||
struct goodix_ts_hw_ops *goodix_get_hw_ops(void)
|
||||
|
|
|
|||
|
|
@ -451,6 +451,7 @@ struct goodix_ts_hw_ops {
|
|||
int (*event_handler)(struct goodix_ts_core *cd, struct goodix_ts_event *ts_event);
|
||||
int (*after_event_handler)(struct goodix_ts_core *cd); /* clean sync flag */
|
||||
int (*get_capacitance_data)(struct goodix_ts_core *cd, struct ts_rawdata_info *info);
|
||||
int (*display_mode)(struct goodix_ts_core *cd, int mode);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1136,17 +1136,50 @@ static int goodix_ts_mmi_update_fps_mode(struct device *dev, int mode) {
|
|||
}
|
||||
#endif
|
||||
|
||||
#define Y_MIN_ID 2
|
||||
#define Y_MAX_ID 3
|
||||
#define SCREEN_X_MAX 1080
|
||||
#define SCREEN_Y_MAX 2992
|
||||
#define SCREEN_EXTENDED 2600
|
||||
#define SCREEN_PRIM_COMPACT 1980
|
||||
#define DISP_MODE_REAR 3
|
||||
#define DISP_MODE_FULL 4
|
||||
#define DISP_MODE_EXTENDED 0
|
||||
#define DISP_MODE_PRIM_COMPACT 1
|
||||
#define DISP_MODE_PRIM_PEEK 2
|
||||
|
||||
static int rdArray[4];
|
||||
|
||||
static int goodix_ts_mmi_active_region(struct device *dev, int *reg_data)
|
||||
{
|
||||
struct goodix_ts_core *core_data;
|
||||
struct platform_device *pdev;
|
||||
int ret, dmode = -1;
|
||||
|
||||
GET_GOODIX_DATA(dev);
|
||||
|
||||
memcpy(rdArray, reg_data, sizeof(rdArray));
|
||||
ts_info("set active region: %d %d %d %d\n", rdArray[0], rdArray[1], rdArray[2], rdArray[3]);
|
||||
if (rdArray[Y_MIN_ID] > 0) { /* REAR */
|
||||
dmode = DISP_MODE_REAR; /* Mode4 */
|
||||
} else { /* FULL or PRIMARY */
|
||||
if (rdArray[Y_MAX_ID] == SCREEN_Y_MAX)
|
||||
dmode = DISP_MODE_FULL; /* Mode5 */
|
||||
else if (rdArray[Y_MAX_ID] > SCREEN_EXTENDED)
|
||||
dmode = DISP_MODE_EXTENDED; /* Mode1 */
|
||||
else if (rdArray[Y_MAX_ID] > SCREEN_PRIM_COMPACT)
|
||||
dmode = DISP_MODE_PRIM_COMPACT; /* Mode2 */
|
||||
else
|
||||
dmode = DISP_MODE_PRIM_PEEK; /* Mode3 */
|
||||
}
|
||||
if (dmode >= 0 ) {
|
||||
ret = core_data->hw_ops->display_mode(core_data, dmode);
|
||||
if (!ret)
|
||||
ts_info("set active region: %d %d %d %d; dmode=%d\n",
|
||||
rdArray[0], rdArray[1], rdArray[Y_MIN_ID], rdArray[Y_MAX_ID], dmode);
|
||||
} else
|
||||
dev_err(&pdev->dev, "Invalid display mode; reqion %d %d %d %d\n",
|
||||
rdArray[0], rdArray[1], rdArray[Y_MIN_ID], rdArray[Y_MAX_ID]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1158,7 +1191,7 @@ static int goodix_ts_mmi_methods_get_active_region(struct device *dev, void *uid
|
|||
GET_GOODIX_DATA(dev);
|
||||
|
||||
memcpy((int *)uidata, rdArray, sizeof(rdArray));
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct ts_mmi_methods goodix_ts_mmi_methods = {
|
||||
|
|
|
|||
Loading…
Reference in a new issue