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:
Konstantin Makariev 2022-08-10 13:53:07 -05:00 • committed by Konstantin Makariev
commit 6c77e4e403
4 changed files with 71 additions and 2 deletions

View file

@ -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)),)

View file

@ -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)

View file

@ -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);
};
/*

View file

@ -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 = {