/*
|
*
|
* FocalTech fts TouchScreen driver.
|
*
|
* Copyright (c) 2012-2019, Focaltech Ltd. All rights reserved.
|
*
|
* This software is licensed under the terms of the GNU General Public
|
* License version 2, as published by the Free Software Foundation, and
|
* may be copied, distributed, and modified under those terms.
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
*/
|
|
/*****************************************************************************
|
*
|
* File Name: focaltech_upgrade_ft5422.c
|
*
|
* Author: Focaltech Driver Team
|
*
|
* Created: 2016-08-15
|
*
|
* Abstract:
|
*
|
* Reference:
|
*
|
*****************************************************************************/
|
/*****************************************************************************
|
* 1.Included header files
|
*****************************************************************************/
|
#include "../focaltech_flash.h"
|
|
/*****************************************************************************
|
* Static function prototypes
|
*****************************************************************************/
|
static int fts_ft5422_init(u8 *buf, u32 len)
|
{
|
if ((!buf) || (len < FTS_MIN_LEN)) {
|
FTS_ERROR("upg is null/fw length fail");
|
return -EINVAL;
|
}
|
|
upgrade_func_ft5422.fwveroff = len - 2;
|
return 0;
|
}
|
|
/************************************************************************
|
* Name: fts_ft5422_upgrade
|
* Brief:
|
* Input:
|
* Output:
|
* Return: return 0 if success, otherwise return error code
|
***********************************************************************/
|
static int fts_ft5422_upgrade(u8 *buf, u32 len)
|
{
|
int ret = 0;
|
u32 start_addr = 0;
|
u8 cmd[4] = { 0 };
|
int ecc_in_host = 0;
|
int ecc_in_tp = 0;
|
|
if (NULL == buf) {
|
FTS_ERROR("fw buf is null");
|
return -EINVAL;
|
}
|
|
if ((len < FTS_MIN_LEN) || (len > (60 * 1024))) {
|
FTS_ERROR("fw buffer len(%x) fail", len);
|
return -EINVAL;
|
}
|
|
/* enter into upgrade environment */
|
ret = fts_fwupg_enter_into_boot();
|
if (ret < 0) {
|
FTS_ERROR("enter into pramboot/bootloader fail,ret=%d", ret);
|
goto fw_reset;
|
}
|
|
cmd[0] = FTS_CMD_FLASH_MODE;
|
cmd[1] = FLASH_MODE_UPGRADE_VALUE;
|
ret = fts_write(cmd, 2);
|
if (ret < 0) {
|
FTS_ERROR("upgrade mode(09) cmd write fail");
|
goto fw_reset;
|
}
|
|
cmd[0] = FTS_CMD_DATA_LEN;
|
cmd[1] = BYTE_OFF_16(len);
|
cmd[2] = BYTE_OFF_8(len);
|
cmd[3] = BYTE_OFF_0(len);
|
ret = fts_write(cmd, FTS_CMD_DATA_LEN_LEN);
|
if (ret < 0) {
|
FTS_ERROR("data len cmd write fail");
|
goto fw_reset;
|
}
|
|
ret = fts_fwupg_erase(FTS_REASE_APP_DELAY);
|
if (ret < 0) {
|
FTS_ERROR("erase cmd write fail");
|
goto fw_reset;
|
}
|
|
/* write app */
|
start_addr = upgrade_func_ft5422.appoff;
|
ecc_in_host = fts_flash_write_buf(start_addr, buf, len, 1);
|
if (ecc_in_host < 0 ) {
|
FTS_ERROR("lcd initial code write fail");
|
goto fw_reset;
|
}
|
|
/* ecc */
|
ecc_in_tp = fts_fwupg_ecc_cal(start_addr, len);
|
if (ecc_in_tp < 0 ) {
|
FTS_ERROR("ecc read fail");
|
goto fw_reset;
|
}
|
|
FTS_INFO("ecc in tp:%x, host:%x", ecc_in_tp, ecc_in_host);
|
if (ecc_in_tp != ecc_in_host) {
|
FTS_ERROR("ecc check fail");
|
goto fw_reset;
|
}
|
|
FTS_INFO("upgrade success, reset to normal boot");
|
ret = fts_fwupg_reset_in_boot();
|
if (ret < 0) {
|
FTS_ERROR("reset to normal boot fail");
|
}
|
|
msleep(200);
|
return 0;
|
|
fw_reset:
|
FTS_INFO("upgrade fail, reset to normal boot");
|
ret = fts_fwupg_reset_in_boot();
|
if (ret < 0) {
|
FTS_ERROR("reset to normal boot fail");
|
}
|
return -EIO;
|
}
|
|
struct upgrade_func upgrade_func_ft5422 = {
|
.ctype = {0x02},
|
.fwveroff = 0x0000,
|
.fwcfgoff = 0xD780,
|
.appoff = 0x0000,
|
.pramboot_supported = false,
|
.hid_supported = true,
|
.init = fts_ft5422_init,
|
.upgrade = fts_ft5422_upgrade,
|
};
|