himax_mmi: Add edge Inhibition sys entry

Add an sys entry to enable different edge inhibition function.
echo 0,1,2,3 to edge_en.
0 turn_off
1 Vertical inhibition
2 Horizental clockwise inhibition
3 Horizental anticlockwise inhibition

Change-Id: Id7023e8952ee7df46b5b77ad564be51dc9e74511
Signed-off-by: haojl2 <haojl2@motorola.com>
Reviewed-on: https://gerrit.mot.com/1235525
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Wei Deng <dengwei1@motorola.com>
Reviewed-by: Jianqi Yang <yangj@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
haojl2 2018-08-30 15:20:48 +08:00 • committed by Jialei Hao
commit d28d818543
4 changed files with 134 additions and 1 deletions

View file

@ -171,6 +171,11 @@ uint8_t HX_PROC_SEND_FLAG;
struct proc_dir_entry *himax_proc_GESTURE_file = NULL;
uint8_t HX_SMWP_EN = 0;
#endif
#ifdef HX_EDGE_LIMIT
#define HIMAX_PROC_EDGE_LIMIT_FILE "edge_en"
struct proc_dir_entry *himax_proc_edge_limit_file = NULL;
#endif
#if defined(HX_SMART_WAKEUP) || defined(CONFIG_TOUCHSCREEN_HIMAX_INSPECT)
bool FAKE_POWER_KEY_SEND = true;
#endif
@ -512,6 +517,68 @@ static struct file_operations himax_proc_Gesture_ops = {
};
#endif
#ifdef HX_EDGE_LIMIT
static ssize_t himax_edge_limit_read(struct file *file, char *buf,
size_t len, loff_t *pos)
{
size_t count = 0;
struct himax_ts_data *ts = private_ts;
char *temp_buf;
if (!HX_PROC_SEND_FLAG) {
temp_buf = kzalloc(len, GFP_KERNEL);
count = snprintf(temp_buf, PAGE_SIZE, "%d\n", ts->edge_limit_enable);
if (copy_to_user(buf, temp_buf, len))
I("%s,here:%d\n", __func__, __LINE__);
kfree(temp_buf);
HX_PROC_SEND_FLAG = 1;
} else {
HX_PROC_SEND_FLAG = 0;
}
return count;
}
static ssize_t himax_edge_limit_write(struct file *file, const char *buff,
size_t len, loff_t *pos)
{
struct himax_ts_data *ts = private_ts;
char buf[80] = {0};
if (len >= 80) {
I("%s: no command exceeds 80 chars.\n", __func__);
return -EFAULT;
}
if (copy_from_user(buf, buff, len)) {
return -EFAULT;
}
if (buf[0] == '0')
ts->edge_limit_enable = 0;
else if (buf[0] == '1')
ts->edge_limit_enable = 1;/*Portrait*/
else if (buf[0] == '2')
ts->edge_limit_enable = 2;/*Landscape-Right*/
else if (buf[0] == '3')
ts->edge_limit_enable = 3;/*Landscape-Left*/
else
return -EINVAL;
g_core_fp.fp_set_edge_limit_enable(ts->edge_limit_enable, ts->suspended);
I("%s: edge_limit_enable = %d.\n", __func__, ts->edge_limit_enable);
return len;
}
static struct file_operations himax_proc_edge_limit_ops = {
.owner = THIS_MODULE,
.read = himax_edge_limit_read,
.write = himax_edge_limit_write,
};
#endif
#ifdef CONFIG_TOUCHSCREEN_HIMAX_INSPECT
extern void (*fp_himax_self_test_init)(void);
#endif
@ -569,7 +636,21 @@ int himax_common_proc_init(void)
goto fail_5;
}
#endif
#ifdef HX_EDGE_LIMIT
himax_proc_edge_limit_file = proc_create(HIMAX_PROC_EDGE_LIMIT_FILE, (S_IWUSR | S_IRUGO | S_IWUGO),
himax_touch_proc_dir, &himax_proc_edge_limit_ops);
if (himax_proc_edge_limit_file == NULL) {
E(" %s: proc edge limit file create failed!\n", __func__);
goto fail_6;
}
#endif
return 0;
#ifdef HX_EDGE_LIMIT
remove_proc_entry(HIMAX_PROC_EDGE_LIMIT_FILE, himax_touch_proc_dir);
fail_6:
#endif
#ifdef HX_SMART_WAKEUP
remove_proc_entry(HIMAX_PROC_GESTURE_FILE, himax_touch_proc_dir);
fail_5:
@ -591,6 +672,9 @@ void himax_common_proc_deinit(void)
{
remove_proc_entry(HIMAX_PROC_SELF_TEST_FILE, himax_touch_proc_dir);
remove_proc_entry(HIMAX_PROC_SELF_TEST_RAW_FILE, himax_touch_proc_dir);
#ifdef HX_EDGE_LIMIT
remove_proc_entry(HIMAX_PROC_EDGE_LIMIT_FILE, himax_touch_proc_dir);
#endif
#ifdef HX_SMART_WAKEUP
remove_proc_entry(HIMAX_PROC_GESTURE_FILE, himax_touch_proc_dir);
remove_proc_entry(HIMAX_PROC_SMWP_FILE, himax_touch_proc_dir);

View file

@ -50,7 +50,7 @@
#include <linux/of_gpio.h>
#endif
#define HIMAX_DRIVER_VER "1.2.2.50_moto_05"
#define HIMAX_DRIVER_VER "1.2.2.50_moto_06"
#define FLASH_DUMP_FILE "/sdcard/HX_Flash_Dump.bin"
@ -75,6 +75,7 @@
/*#define HX_FIX_TOUCH_INFO*/ /* if open, you need to change the touch info in the fix_touch_info*/
/*#define HX_ZERO_FLASH*/
/*#define CONFIG_CHIP_DTCFG*/
#define HX_EDGE_LIMIT
/*#undef CONFIG_FB*/ /* Enable it if driver go into suspend/resume twice */
/*#define HX_EN_SEL_BUTTON*/ /* Support Self Virtual key ,default is close*/
@ -359,6 +360,11 @@ struct himax_ts_data {
struct wake_lock ts_SMWP_wake_lock;
#endif
#ifdef HX_EDGE_LIMIT
uint8_t edge_limit_enable;
uint8_t edge_limit_en[8];
#endif
#ifdef HX_HIGH_SENSE
uint8_t HSEN_enable;
#endif

View file

@ -106,6 +106,7 @@
#define fw_addr_flag_reset_event 0x900000e4
#define fw_addr_hsen_enable 0x10007F14
#define fw_addr_smwp_enable 0x10007F10
#define fw_addr_edge_limit_enable 0x10007F3C
#define fw_usb_detect_addr 0x10007F38
#define fw_addr_program_reload_from 0x00000000
#define fw_addr_program_reload_to 0x08000000
@ -166,6 +167,10 @@
#define fw_func_handshaking_pwd 0xA55AA55A
#define fw_func_handshaking_end 0x77887788
#define fw_func_edge_portrait_pwd 0xA55AA55A
#define fw_func_edge_lsp_left_pwd 0xA11AA11A
#define fw_func_edge_lsp_right_pwd 0xA33AA33A
#define on_fw_addr_smwp_enable 0xA2
#define on_fw_usb_detect_addr 0xA4
#define on_fw_addr_program_reload_from 0x00000000
@ -342,6 +347,7 @@ struct fw_operation {
uint8_t addr_flag_reset_event[4];
uint8_t addr_hsen_enable[4];
uint8_t addr_smwp_enable[4];
uint8_t addr_edge_limit_enable[4];
uint8_t addr_program_reload_from[4];
uint8_t addr_program_reload_to[4];
uint8_t addr_program_reload_page_write[4];
@ -627,6 +633,7 @@ struct himax_core_fp {
void (*fp_set_reload_cmd)(uint8_t *write_data, int idx, uint32_t cmd_from, uint32_t cmd_to, uint32_t cmd_beat);
bool (*fp_program_reload)(void);
void (*fp_set_SMWP_enable)(uint8_t SMWP_enable, bool suspended);
void (*fp_set_edge_limit_enable)(uint8_t edge_limit_enable, bool suspended);
void (*fp_set_HSEN_enable)(uint8_t HSEN_enable, bool suspended);
void (*fp_diag_register_set)(uint8_t diag_command, uint8_t storage_type);
#ifdef HX_TP_SELF_TEST_DRIVER

View file

@ -580,6 +580,37 @@ static void himax_mcu_set_SMWP_enable(uint8_t SMWP_enable, bool suspended)
} while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES);
}
static void himax_mcu_set_edge_limit_enable(uint8_t edge_limit_enable, bool suspended)
{
uint8_t tmp_data[FOUR_BYTE_DATA_SZ];
uint8_t back_data[FOUR_BYTE_DATA_SZ];
uint8_t retry_cnt = 0;
do {
if (edge_limit_enable == 0x01) {/*Portrait*/
himax_in_parse_assign_cmd(fw_func_edge_portrait_pwd, tmp_data, 4);
g_core_fp.fp_flash_write_burst(pfw_op->addr_edge_limit_enable, tmp_data);
himax_in_parse_assign_cmd(fw_func_edge_portrait_pwd, back_data, 4);
} else if (edge_limit_enable == 0x02) {/*Landscape-Right*/
himax_in_parse_assign_cmd(fw_func_edge_lsp_right_pwd, tmp_data, 4);
g_core_fp.fp_flash_write_burst(pfw_op->addr_edge_limit_enable, tmp_data);
himax_in_parse_assign_cmd(fw_func_edge_lsp_right_pwd, back_data, 4);
} else if (edge_limit_enable == 0x03) {/*Landscape-Left*/
himax_in_parse_assign_cmd(fw_func_edge_lsp_left_pwd, tmp_data, 4);
g_core_fp.fp_flash_write_burst(pfw_op->addr_edge_limit_enable, tmp_data);
himax_in_parse_assign_cmd(fw_func_edge_lsp_left_pwd, back_data, 4);
} else {
himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, tmp_data, 4);
g_core_fp.fp_flash_write_burst(pfw_op->addr_edge_limit_enable, tmp_data);
himax_in_parse_assign_cmd(fw_data_safe_mode_release_pw_reset, back_data, 4);
}
g_core_fp.fp_register_read(pfw_op->addr_edge_limit_enable, FOUR_BYTE_DATA_SZ, tmp_data, 0);
I("%s: tmp_data[0]=%d, SMWP_enable=%d, retry_cnt=%d \n", __func__, tmp_data[0], edge_limit_enable, retry_cnt);
retry_cnt++;
} while ((tmp_data[3] != back_data[3] || tmp_data[2] != back_data[2] || tmp_data[1] != back_data[1] || tmp_data[0] != back_data[0]) && retry_cnt < HIMAX_REG_RETRY_TIMES);
}
static void himax_mcu_set_HSEN_enable(uint8_t HSEN_enable, bool suspended)
{
uint8_t tmp_data[FOUR_BYTE_DATA_SZ];
@ -1735,6 +1766,9 @@ static void himax_mcu_resend_cmd_func (bool suspended)
#ifdef HX_SMART_WAKEUP
g_core_fp.fp_set_SMWP_enable(ts->SMWP_enable, suspended);
#endif
#ifdef HX_EDGE_LIMIT
g_core_fp.fp_set_edge_limit_enable(ts->edge_limit_enable, suspended);
#endif
#ifdef HX_HIGH_SENSE
g_core_fp.fp_set_HSEN_enable(ts->HSEN_enable, suspended);
#endif
@ -2466,6 +2500,7 @@ static void himax_mcu_fp_init(void)
g_core_fp.fp_set_reload_cmd = himax_mcu_set_reload_cmd;
g_core_fp.fp_program_reload = himax_mcu_program_reload;
g_core_fp.fp_set_SMWP_enable = himax_mcu_set_SMWP_enable;
g_core_fp.fp_set_edge_limit_enable = himax_mcu_set_edge_limit_enable;
g_core_fp.fp_set_HSEN_enable = himax_mcu_set_HSEN_enable;
g_core_fp.fp_usb_detect_set = himax_mcu_usb_detect_set;
g_core_fp.fp_diag_register_set = himax_mcu_diag_register_set;
@ -2645,6 +2680,7 @@ void himax_mcu_in_cmd_init(void)
himax_in_parse_assign_cmd(fw_addr_flag_reset_event, pfw_op->addr_flag_reset_event, sizeof(pfw_op->addr_flag_reset_event));
himax_in_parse_assign_cmd(fw_addr_hsen_enable, pfw_op->addr_hsen_enable, sizeof(pfw_op->addr_hsen_enable));
himax_in_parse_assign_cmd(fw_addr_smwp_enable, pfw_op->addr_smwp_enable, sizeof(pfw_op->addr_smwp_enable));
himax_in_parse_assign_cmd(fw_addr_edge_limit_enable, pfw_op->addr_edge_limit_enable, sizeof(pfw_op->addr_edge_limit_enable));
himax_in_parse_assign_cmd(fw_addr_program_reload_from, pfw_op->addr_program_reload_from, sizeof(pfw_op->addr_program_reload_from));
himax_in_parse_assign_cmd(fw_addr_program_reload_to, pfw_op->addr_program_reload_to, sizeof(pfw_op->addr_program_reload_to));
himax_in_parse_assign_cmd(fw_addr_program_reload_page_write, pfw_op->addr_program_reload_page_write, sizeof(pfw_op->addr_program_reload_page_write));