1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * FocalTech ftxxxx TouchScreen driver. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2012-2018, Focaltech Ltd. All rights reserved. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This software is licensed under the terms of the GNU General Public 8*4882a593Smuzhiyun * License version 2, as published by the Free Software Foundation, and 9*4882a593Smuzhiyun * may be copied, distributed, and modified under those terms. 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 12*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*4882a593Smuzhiyun * GNU General Public License for more details. 15*4882a593Smuzhiyun * 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef __LINUX_FOCALTECH_FLASH_H__ 19*4882a593Smuzhiyun #define __LINUX_FOCALTECH_FLASH_H__ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun /***************************************************************************** 22*4882a593Smuzhiyun * 1.Included header files 23*4882a593Smuzhiyun *****************************************************************************/ 24*4882a593Smuzhiyun #include "focaltech_core.h" 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /***************************************************************************** 27*4882a593Smuzhiyun * Private constant and macro definitions using #define 28*4882a593Smuzhiyun *****************************************************************************/ 29*4882a593Smuzhiyun #define FTS_CMD_RESET 0x07 30*4882a593Smuzhiyun #define FTS_ROMBOOT_CMD_WRITE 0xAE 31*4882a593Smuzhiyun #define FTS_ROMBOOT_CMD_START_APP 0x08 32*4882a593Smuzhiyun #define FTS_DELAY_PRAMBOOT_START 10 33*4882a593Smuzhiyun #define FTS_ROMBOOT_CMD_ECC 0xCC 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define FTS_CMD_READ 0x03 36*4882a593Smuzhiyun #define FTS_CMD_READ_DELAY 1 37*4882a593Smuzhiyun #define FTS_CMD_READ_LEN 4 38*4882a593Smuzhiyun #define FTS_CMD_FLASH_TYPE 0x05 39*4882a593Smuzhiyun #define FTS_CMD_FLASH_MODE 0x09 40*4882a593Smuzhiyun #define FLASH_MODE_WRITE_FLASH_VALUE 0x0A 41*4882a593Smuzhiyun #define FLASH_MODE_UPGRADE_VALUE 0x0B 42*4882a593Smuzhiyun #define FLASH_MODE_LIC_VALUE 0x0C 43*4882a593Smuzhiyun #define FLASH_MODE_PARAM_VALUE 0x0D 44*4882a593Smuzhiyun #define FTS_CMD_ERASE_APP 0x61 45*4882a593Smuzhiyun #define FTS_REASE_APP_DELAY 1350 46*4882a593Smuzhiyun #define FTS_ERASE_SECTOR_DELAY 60 47*4882a593Smuzhiyun #define FTS_RETRIES_REASE 50 48*4882a593Smuzhiyun #define FTS_RETRIES_DELAY_REASE 200 49*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS 0x6A 50*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS_LEN 2 51*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS_NOP 0x0000 52*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS_ECC_OK 0xF055 53*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS_ERASE_OK 0xF0AA 54*4882a593Smuzhiyun #define FTS_CMD_FLASH_STATUS_WRITE_OK 0x1000 55*4882a593Smuzhiyun #define FTS_CMD_ECC_INIT 0x64 56*4882a593Smuzhiyun #define FTS_CMD_ECC_CAL 0x65 57*4882a593Smuzhiyun #define FTS_CMD_ECC_CAL_LEN 6 58*4882a593Smuzhiyun #define FTS_RETRIES_ECC_CAL 10 59*4882a593Smuzhiyun #define FTS_RETRIES_DELAY_ECC_CAL 50 60*4882a593Smuzhiyun #define FTS_CMD_ECC_READ 0x66 61*4882a593Smuzhiyun #define FTS_CMD_DATA_LEN 0xB0 62*4882a593Smuzhiyun #define FTS_CMD_APP_DATA_LEN_INCELL 0x7A 63*4882a593Smuzhiyun #define FTS_CMD_DATA_LEN_LEN 4 64*4882a593Smuzhiyun #define FTS_CMD_WRITE 0xBF 65*4882a593Smuzhiyun #define FTS_RETRIES_WRITE 100 66*4882a593Smuzhiyun #define FTS_RETRIES_DELAY_WRITE 1 67*4882a593Smuzhiyun #define FTS_CMD_WRITE_LEN 6 68*4882a593Smuzhiyun #define FTS_DELAY_READ_ID 20 69*4882a593Smuzhiyun #define FTS_DELAY_UPGRADE_RESET 80 70*4882a593Smuzhiyun #define PRAMBOOT_MIN_SIZE 0x120 71*4882a593Smuzhiyun #define PRAMBOOT_MAX_SIZE (64*1024) 72*4882a593Smuzhiyun #define FTS_FLASH_PACKET_LENGTH 32 /* max=128 */ 73*4882a593Smuzhiyun #define FTS_MAX_LEN_ECC_CALC 0xFFFE /* must be even */ 74*4882a593Smuzhiyun #define FTS_MIN_LEN 0x120 75*4882a593Smuzhiyun #define FTS_MAX_LEN_FILE (128 * 1024) 76*4882a593Smuzhiyun #define FTS_MAX_LEN_APP (64 * 1024) 77*4882a593Smuzhiyun #define FTS_MAX_LEN_SECTOR (4 * 1024) 78*4882a593Smuzhiyun #define FTS_CONIFG_VENDORID_OFF 0x04 79*4882a593Smuzhiyun #define FTS_CONIFG_MODULEID_OFF 0x1E 80*4882a593Smuzhiyun #define FTS_CONIFG_PROJECTID_OFF 0x20 81*4882a593Smuzhiyun #define FTS_APPINFO_OFF 0x100 82*4882a593Smuzhiyun #define FTS_APPINFO_APPLEN_OFF 0x00 83*4882a593Smuzhiyun #define FTS_APPINFO_APPLEN2_OFF 0x12 84*4882a593Smuzhiyun #define FTS_REG_UPGRADE 0xFC 85*4882a593Smuzhiyun #define FTS_UPGRADE_AA 0xAA 86*4882a593Smuzhiyun #define FTS_UPGRADE_55 0x55 87*4882a593Smuzhiyun #define FTS_DELAY_FC_AA 10 88*4882a593Smuzhiyun #define FTS_UPGRADE_LOOP 30 89*4882a593Smuzhiyun #define FTS_HEADER_LEN 32 90*4882a593Smuzhiyun #define FTS_FW_BIN_FILEPATH "/sdcard/" 91*4882a593Smuzhiyun #define FTS_FW_IDE_SIG "IDE_" 92*4882a593Smuzhiyun #define FTS_FW_IDE_SIG_LEN 4 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun #define FTS_ROMBOOT_CMD_ECC_NEW_LEN 7 95*4882a593Smuzhiyun #define FTS_ROMBOOT_CMD_ECC_FINISH 0xCE 96*4882a593Smuzhiyun #define FTS_CMD_READ_ECC 0xCD 97*4882a593Smuzhiyun #define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun enum FW_STATUS { 100*4882a593Smuzhiyun FTS_RUN_IN_ERROR, 101*4882a593Smuzhiyun FTS_RUN_IN_APP, 102*4882a593Smuzhiyun FTS_RUN_IN_ROM, 103*4882a593Smuzhiyun FTS_RUN_IN_PRAM, 104*4882a593Smuzhiyun FTS_RUN_IN_BOOTLOADER, 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun enum FW_FLASH_MODE { 108*4882a593Smuzhiyun FLASH_MODE_APP, 109*4882a593Smuzhiyun FLASH_MODE_LIC, 110*4882a593Smuzhiyun FLASH_MODE_PARAM, 111*4882a593Smuzhiyun FLASH_MODE_ALL, 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun enum ECC_CHECK_MODE { 115*4882a593Smuzhiyun ECC_CHECK_MODE_XOR, 116*4882a593Smuzhiyun ECC_CHECK_MODE_CRC16, 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /***************************************************************************** 120*4882a593Smuzhiyun * Private enumerations, structures and unions using typedef 121*4882a593Smuzhiyun *****************************************************************************/ 122*4882a593Smuzhiyun /* IC info */ 123*4882a593Smuzhiyun struct upgrade_func { 124*4882a593Smuzhiyun u64 ctype[FTX_MAX_COMPATIBLE_TYPE]; 125*4882a593Smuzhiyun int newmode; 126*4882a593Smuzhiyun u32 fwveroff; 127*4882a593Smuzhiyun u32 fwcfgoff; 128*4882a593Smuzhiyun u32 appoff; 129*4882a593Smuzhiyun u32 licoff; 130*4882a593Smuzhiyun u32 paramcfgoff; 131*4882a593Smuzhiyun u32 paramcfgveroff; 132*4882a593Smuzhiyun u32 paramcfg2off; 133*4882a593Smuzhiyun int ecc_check_mode; 134*4882a593Smuzhiyun bool read_boot_id_need_reset; 135*4882a593Smuzhiyun bool hid_supported; 136*4882a593Smuzhiyun bool pramboot_supported; 137*4882a593Smuzhiyun u8 *pramboot; 138*4882a593Smuzhiyun u32 pb_length; 139*4882a593Smuzhiyun int (*init)(void); 140*4882a593Smuzhiyun int (*upgrade)(struct i2c_client *, u8 *, u32); 141*4882a593Smuzhiyun int (*get_hlic_ver)(u8 *); 142*4882a593Smuzhiyun int (*lic_upgrade)(struct i2c_client *, u8 *, u32); 143*4882a593Smuzhiyun int (*param_upgrade)(struct i2c_client *, u8 *, u32); 144*4882a593Smuzhiyun int (*force_upgrade)(struct i2c_client *, u8 *, u32); 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct fts_upgrade { 148*4882a593Smuzhiyun u8 *fw; 149*4882a593Smuzhiyun u32 fw_length; 150*4882a593Smuzhiyun u8 *lic; 151*4882a593Smuzhiyun u32 lic_length; 152*4882a593Smuzhiyun struct upgrade_func *func; 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun struct upgrade_fw { 156*4882a593Smuzhiyun u16 vendor_id; 157*4882a593Smuzhiyun u8 *fw_file; 158*4882a593Smuzhiyun u32 fw_len; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /***************************************************************************** 162*4882a593Smuzhiyun * Global variable or extern global variabls/functions 163*4882a593Smuzhiyun *****************************************************************************/ 164*4882a593Smuzhiyun extern struct fts_upgrade *fwupgrade; 165*4882a593Smuzhiyun extern struct upgrade_func upgrade_func_ft8006m; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /***************************************************************************** 168*4882a593Smuzhiyun * Static function prototypes 169*4882a593Smuzhiyun *****************************************************************************/ 170*4882a593Smuzhiyun bool fts_fwupg_check_fw_valid(struct i2c_client *client); 171*4882a593Smuzhiyun int fts_fwupg_get_boot_state(struct i2c_client *client, enum FW_STATUS *fw_sts); 172*4882a593Smuzhiyun bool fts_fwupg_check_state(struct i2c_client *client, enum FW_STATUS rstate); 173*4882a593Smuzhiyun int fts_fwupg_reset_in_boot(struct i2c_client *client); 174*4882a593Smuzhiyun int fts_fwupg_reset_to_boot(struct i2c_client *client); 175*4882a593Smuzhiyun int fts_fwupg_reset_to_romboot(struct i2c_client *client); 176*4882a593Smuzhiyun int fts_fwupg_enter_into_boot(struct i2c_client *client); 177*4882a593Smuzhiyun int fts_fwupg_erase(struct i2c_client *client, u32 delay); 178*4882a593Smuzhiyun int fts_fwupg_ecc_cal(struct i2c_client *client, u32 saddr, u32 len); 179*4882a593Smuzhiyun int fts_flash_write_buf(struct i2c_client *client, u32 saddr, u8 *buf, u32 len, u32 delay); 180*4882a593Smuzhiyun int fts_fwupg_upgrade(struct i2c_client *client, struct fts_upgrade *upg); 181*4882a593Smuzhiyun u16 fts_crc16_calc_host(u8 *pbuf, u16 length); 182*4882a593Smuzhiyun #endif 183