From d28d818543970b315042ea4c2ccfffb43e2322e9 Mon Sep 17 00:00:00 2001 From: haojl2 Date: Thu, 30 Aug 2018 15:20:48 +0800 Subject: [PATCH] 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 Reviewed-on: https://gerrit.mot.com/1235525 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Wei Deng Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- .../touchscreen/himax_mmi/himax_common.c | 84 +++++++++++++++++++ .../touchscreen/himax_mmi/himax_common.h | 8 +- .../touchscreen/himax_mmi/himax_ic_core.h | 7 ++ .../himax_mmi/himax_ic_incell_core.c | 36 ++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/himax_mmi/himax_common.c b/drivers/input/touchscreen/himax_mmi/himax_common.c index a4efc7b22adb..f7450b0ff0f4 100644 --- a/drivers/input/touchscreen/himax_mmi/himax_common.c +++ b/drivers/input/touchscreen/himax_mmi/himax_common.c @@ -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); diff --git a/drivers/input/touchscreen/himax_mmi/himax_common.h b/drivers/input/touchscreen/himax_mmi/himax_common.h index ac5313e1ccf8..bfab79d617b9 100644 --- a/drivers/input/touchscreen/himax_mmi/himax_common.h +++ b/drivers/input/touchscreen/himax_mmi/himax_common.h @@ -50,7 +50,7 @@ #include #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 diff --git a/drivers/input/touchscreen/himax_mmi/himax_ic_core.h b/drivers/input/touchscreen/himax_mmi/himax_ic_core.h index 83a18a754d98..9dc22158814d 100644 --- a/drivers/input/touchscreen/himax_mmi/himax_ic_core.h +++ b/drivers/input/touchscreen/himax_mmi/himax_ic_core.h @@ -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 diff --git a/drivers/input/touchscreen/himax_mmi/himax_ic_incell_core.c b/drivers/input/touchscreen/himax_mmi/himax_ic_incell_core.c index e4d08641b659..f58cce77452f 100644 --- a/drivers/input/touchscreen/himax_mmi/himax_ic_incell_core.c +++ b/drivers/input/touchscreen/himax_mmi/himax_ic_incell_core.c @@ -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));