mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 21:59:12 -04:00
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:
parent
5f718ceebc
commit
4ddfc550ae
5 changed files with 119 additions and 13 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue