From 36ef1c705b96fd121865092e0f42ec859be044ec Mon Sep 17 00:00:00 2001 From: Wenge Zhu Date: Thu, 10 Aug 2023 11:12:29 +0800 Subject: [PATCH] Optimize force touch sensor firmware update flow Add imperative debug logs on firmware update flow and allow user config FW name. Change-Id: Id61e8b2520bc755e2a5444f5540c43c0e8cbaf82 Signed-off-by: Wenge Zhu Reviewed-on: https://gerrit.mot.com/2706122 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- drivers/input/misc/cs_press_mmi/cs_press.c | 39 ++++++++++++++++------ drivers/input/misc/cs_press_mmi/cs_press.h | 3 +- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/drivers/input/misc/cs_press_mmi/cs_press.c b/drivers/input/misc/cs_press_mmi/cs_press.c index c2e649baad96..45f5186ac562 100644 --- a/drivers/input/misc/cs_press_mmi/cs_press.c +++ b/drivers/input/misc/cs_press_mmi/cs_press.c @@ -1319,7 +1319,7 @@ char cs_press_fw_force_update(const unsigned char *fw_array) if(ret >= 0){ fw_read_version = ((((unsigned short)fw_read_code[2]<<8)&0xff00)|fw_read_code[3]); } - LOG_INFO("update version:%x,read version:%x\n", fw_default_version, fw_read_version); + LOG_INFO("update version:0x%04x,read version:0x%04x\n", fw_default_version, fw_read_version); if(fw_read_version != fw_default_version){ LOG_ERR("ERR:fw_read_version != fw_default_version\n"); result = (char)-1; @@ -1370,6 +1370,9 @@ char cs_press_fw_high_version_update(const unsigned char *fw_array) LOG_ERR("read AP_VERSION_REG failed\n"); } + + LOG_INFO("FW on file version:0x%04x, FW on IC version:0x%04x, need update flag:%d\n", + default_version, read_version, flag_update); if(flag_update == 0) { LOG_INFO("no need update\n"); @@ -1381,10 +1384,9 @@ char cs_press_fw_high_version_update(const unsigned char *fw_array) { result = cs_press_fw_force_update(fw_array); if(result < 0 || result >= 0x80){ - LOG_ERR("update failed,ret:%d\n",result); + LOG_ERR("update failed,ret:%d, retry count:%d\n",result, retry); } }while((result!=0)&&(retry--)); - LOG_INFO("update finished,default version:%d,read version:%d\n",default_version,read_version); return result; } @@ -1408,16 +1410,16 @@ int fml_firmware_send_data(unsigned char *data, int len) } fw_body_len = ((int)data[FW_ADDR_CODE_LENGTH]<<8)|((int)data[FW_ADDR_CODE_LENGTH+1]); fw_len = fw_body_len + 256; - LOG_INFO("[fw file len:%x,fw body len: %x]\n", len, fw_body_len); + LOG_INFO("[fw file len:%d,fw body len: %d]\n", len, fw_body_len); if(fw_body_len <= 0 || fw_body_len > FW_UPDATA_MAX_LEN) { - LOG_ERR("[err!fw body len err!len=%x]\n", len); + LOG_ERR("[err!fw body len err!len=%d]\n", len); ret = -1; goto exit_fw_buf; } if(fw_len != len) { - LOG_ERR("[err!fw file len err! len=%x]\n", fw_len); + LOG_ERR("[err!fw file len err! len=%d]\n", fw_len); ret = -1; goto exit_fw_buf; } @@ -1434,6 +1436,8 @@ int fml_firmware_send_data(unsigned char *data, int len) { ret = -1; LOG_ERR("Burning firmware fails\n"); + } else { + LOG_ERR("Burning firmware success\n"); } exit_fw_buf: LOG_INFO("end\n"); @@ -1475,15 +1479,20 @@ int fml_fw_update_by_file(void) int ret_error = 0; struct cs_press_t *fw_st = NULL; - fw_st = devm_kzalloc(&(g_cs_press.client->dev), sizeof(*fw_st), GFP_KERNEL ); + if (strlen(g_cs_press.cs_fw_name) == 0) { + LOG_ERR("cs FW name is not specified\n"); + return -1; + } + + fw_st = devm_kzalloc(&(g_cs_press.client->dev), sizeof(*fw_st), GFP_KERNEL); if(!fw_st) { LOG_ERR("devm_kzalloc failed\n"); return -1; } fw_st->client = g_cs_press.client; - ret_error = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, FW_FILE_NAME, &(g_cs_press.client->dev), GFP_KERNEL, - fw_st, fml_firmware_config_cb); + ret_error = request_firmware_nowait(THIS_MODULE, FW_ACTION_HOTPLUG, g_cs_press.cs_fw_name, + &(g_cs_press.client->dev), GFP_KERNEL, fw_st, fml_firmware_config_cb); devm_kfree(&(g_cs_press.client->dev), fw_st); if(ret_error) { @@ -2908,7 +2917,8 @@ exit: int cs_parse_dts(struct i2c_client *pdev) { int ret = -1; -struct regulator *power_3v3 = NULL; + struct regulator *power_3v3 = NULL; + const char *name_tmp; #ifdef INT_SET_EN @@ -2998,6 +3008,15 @@ struct regulator *power_3v3 = NULL; return ret; } + ret = of_property_read_string((pdev->dev).of_node, "cs,fw-name", &name_tmp); + if (!ret) { + strncpy(g_cs_press.cs_fw_name, name_tmp, sizeof(g_cs_press.cs_fw_name)); + LOG_INFO("firmware name from dt: %s", g_cs_press.cs_fw_name); + } else { + strncpy(g_cs_press.cs_fw_name, FW_FILE_NAME, sizeof(g_cs_press.cs_fw_name)); + LOG_INFO("can't find firmware name, use default: %s", g_cs_press.cs_fw_name); + } + LOG_ERR("end---\n"); return 0; } diff --git a/drivers/input/misc/cs_press_mmi/cs_press.h b/drivers/input/misc/cs_press_mmi/cs_press.h index 4fca46e5ffab..091955b88f34 100644 --- a/drivers/input/misc/cs_press_mmi/cs_press.h +++ b/drivers/input/misc/cs_press_mmi/cs_press.h @@ -79,6 +79,7 @@ #endif #define FW_FILE_NAME "cs_press.nfw" +#define CS_MAX_STR_LABEL_LEN 64 /* *@ LOG format @@ -349,7 +350,7 @@ struct cs_press_t { unsigned int panel_max_y; unsigned int panel_max_w; /*major and minor*/ unsigned int nav_mode; - + char cs_fw_name[CS_MAX_STR_LABEL_LEN]; }; #endif