novatek: Support parameter upgrade method

Support to upgrade TP firmware through the
Parameter APK.

Change-Id: I370e175db38ab7f5de3aa4cc5aabae7ea2f219c6
Reviewed-on: https://gerrit.mot.com/1979783
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Konstantin Makariev <kmakariev@motorola.com>
Reviewed-by: Jun Weng <wengjun1@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
litong20 2021-06-16 19:53:56 +08:00 • committed by litong
commit 4ddfc550ae
5 changed files with 119 additions and 13 deletions

View file

@ -55,6 +55,11 @@ endif
ifeq ($(TOUCH_PANEL_NOTIFICATIONS),true)
KERNEL_CFLAGS += CONFIG_TOUCH_PANEL_NOTIFICATIONS=y
endif
ifeq ($(TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW),true)
KERNEL_CFLAGS += CONFIG_TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW=y
endif
include $(CLEAR_VARS)
ifneq ($(BOARD_USES_DOUBLE_TAP),)
LOCAL_ADDITIONAL_DEPENDENCIES += $(KERNEL_MODULES_OUT)/sensors_class.ko

View file

@ -62,5 +62,9 @@ ifneq ($(filter m y,$(CONFIG_INPUT_TOUCHSCREEN_MMI)),)
KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../touchscreen_mmi/$(GKI_OBJ_MODULE_DIR)/Module.symvers
EXTRA_CFLAGS += -DCONFIG_INPUT_TOUCHSCREEN_MMI
nova_0flash_mmi-objs += nt36xxx_mmi_class.o
ifneq ($(filter m y, $(CONFIG_TOUCHCLASS_MMI_MULTIWAY_UPDATE_FW)),)
EXTRA_CFLAGS += -DTS_MMI_TOUCH_MULTIWAY_UPDATE_FW
endif
endif
KBUILD_EXTRA_SYMBOLS += $(CURDIR)/../../kernel/msm-$(MODULE_KERNEL_VERSION)/Module.symvers

View file

@ -264,6 +264,9 @@ struct nvt_ts_data {
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
struct ts_mmi_class_methods *imports;
#endif
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
int flash_mode;
#endif
};
#if NVT_TOUCH_PROC

View file

@ -20,6 +20,7 @@
#include <linux/gpio.h>
#include "nt36xxx.h"
#include <linux/touchscreen_mmi.h>
#if BOOT_UPDATE_FIRMWARE
@ -285,6 +286,13 @@ return:
static void update_firmware_release(void)
{
if (fw_entry) {
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
if (ts->flash_mode == FW_PARAM_MODE) {
vfree(fw_entry->data);
fw_entry = NULL;
return;
}
#endif
release_firmware(fw_entry);
}
@ -302,6 +310,15 @@ static int32_t update_firmware_request(char *filename)
{
uint8_t retry = 0;
int32_t ret = 0;
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
char path[TS_MMI_MAX_FULL_FW_PATH] = { 0 };
void *data = NULL;
struct firmware *fw_tmp;
struct file *filp = NULL;
struct inode *inode;
loff_t pos = 0;
loff_t file_len = 0;
#endif
if (NULL == filename) {
return -ENOENT;
@ -310,10 +327,53 @@ static int32_t update_firmware_request(char *filename)
while (1) {
NVT_LOG("filename is %s\n", filename);
ret = request_firmware(&fw_entry, filename, &ts->client->dev);
if (ret) {
NVT_ERR("firmware load failed, ret=%d\n", ret);
goto request_fail;
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
if (ts->flash_mode == FW_PARAM_MODE) {
NVT_LOG("Read FW data from param path: %s\n", filename);
snprintf(path, TS_MMI_MAX_FULL_FW_PATH, "%s%s", TS_MMI_FW_PARAM_PATH, filename);
filp = filp_open(path, O_RDONLY, 0);
if (IS_ERR(filp)) {
NVT_ERR("Open %s file fail!\n", path);
return -ENOENT;
}
fw_tmp = vzalloc(sizeof(struct firmware));
if (!fw_tmp) {
NVT_ERR("Failed to malloc (struct) firmware!\n");
return -ENOMEM;
}
inode = filp->f_inode;
file_len = inode->i_size;
data = (u8 *)vzalloc(file_len);
if (NULL == data) {
NVT_ERR("Failed to malloc param firmware memory!\n");
filp_close(filp, NULL);
return -ENOMEM;
}
ret = kernel_read(filp, data, file_len, &pos);
if (ret < 0) {
NVT_ERR("Failed to read param firmware data, ret = %d\n", ret);
filp_close(filp, NULL);
vfree(data);
vfree(fw_tmp);
fw_entry = NULL;
return -EIO;
}
fw_tmp->data = data;
fw_tmp->size = file_len;
NVT_ERR("fw file len:%d pos:%d!\n", (u32)file_len, (u32)pos);
filp_close(filp, NULL);
fw_entry = fw_tmp;
} else
#endif
{
ret = request_firmware(&fw_entry, filename, &ts->client->dev);
if (ret) {
NVT_ERR("firmware load failed, ret=%d\n", ret);
goto request_fail;
}
}
// check FW need to write size

View file

@ -124,6 +124,28 @@ static int nvt_mmi_methods_get_flashprog(struct device *dev, void *idata)
return 0;
}
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
static int nvt_mmi_get_flash_mode(struct device *dev, void *idata)
{
struct nvt_ts_data *ts_data;
GET_TS_DATA(dev);
TO_INT(idata) = ts_data->flash_mode;
return 0;
}
static int nvt_mmi_flash_mode(struct device *dev, int mode)
{
struct nvt_ts_data *ts_data;
GET_TS_DATA(dev);
ts_data->flash_mode = mode;
return 0;
}
#endif
static int nvt_mmi_methods_drv_irq(struct device *dev, int state)
{
int ret = 0;
@ -168,8 +190,10 @@ static int nvt_mmi_firmware_update(struct device *dev, char *fwname)
GET_TS_DATA(dev);
mutex_lock(&ts->lock);
snprintf(nvt_boot_firmware_name, NVT_FILE_NAME_LENGTH, "%s", fwname);
snprintf(nvt_mp_firmware_name, NVT_FILE_NAME_LENGTH, "mp-%s", fwname);
if (strncmp(fwname, "Default", sizeof("Default"))) {
snprintf(nvt_boot_firmware_name, NVT_FILE_NAME_LENGTH, "%s", fwname);
snprintf(nvt_mp_firmware_name, NVT_FILE_NAME_LENGTH, "mp-%s", fwname);
}
nvt_update_firmware(nvt_boot_firmware_name);
mutex_unlock(&ts->lock);
@ -251,18 +275,22 @@ return:
static int nvt_mmi_pre_resume(struct device *dev)
{
struct nvt_ts_data *ts_data;
int ret = 0;
GET_TS_DATA(dev);
NVT_LOG("enter\n");
mutex_lock(&ts->lock);
ret = nvt_update_firmware(nvt_boot_firmware_name);
if (ret) {
NVT_ERR("download firmware failed, ignore check fw state\n");
} else {
nvt_check_fw_reset_state(RESET_STATE_REK);
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
if (ts_data->flash_mode == FW_PARAM_MODE)
{
NVT_LOG("update firmware through touchUpg service\n");
return 0;
}
#endif
mutex_lock(&ts->lock);
NVT_LOG("update firmware: %s\n", nvt_boot_firmware_name);
nvt_update_firmware(nvt_boot_firmware_name);
mutex_unlock(&ts->lock);
return 0;
@ -295,12 +323,18 @@ static struct ts_mmi_methods nvt_mmi_methods = {
.get_irq_status = nvt_mmi_methods_get_irq_status,
.get_drv_irq = nvt_mmi_methods_get_drv_irq,
.get_flashprog = nvt_mmi_methods_get_flashprog,
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
.get_flash_mode = nvt_mmi_get_flash_mode,
#endif
.get_poweron = nvt_mmi_methods_get_poweron,
/* SET methods */
.reset = nvt_mmi_methods_reset,
.drv_irq = nvt_mmi_methods_drv_irq,
.charger_mode = nvt_mmi_charger_mode,
/* Firmware */
#ifdef TS_MMI_TOUCH_MULTIWAY_UPDATE_FW
.flash_mode = nvt_mmi_flash_mode,
#endif
.firmware_update = nvt_mmi_firmware_update,
/* PM callback */
.panel_state = nvt_mmi_panel_state,