summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/ist30xxa/ist30xx_update.h
blob: fa432b7a74eef037147ee9d61f9841da9b1ec231 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 *  Copyright (C) 2010, Imagis Technology Co. Ltd. All Rights Reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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.
 *
 */

#ifndef __IST30XX_UPDATE_H__
#define __IST30XX_UPDATE_H__

#include "ist30xx_tsp.h"

#define IST30XX_INTERNAL_BIN    	(1)
#define IST30XX_CHECK_CALIB     	(0)

#if IST30XX_INTERNAL_BIN
#define IST30XX_UPDATE_BY_WORKQUEUE	(0)
#define IST30XX_UPDATE_DELAY    	(3 * HZ)
#endif // IST30XX_INTERNAL_BIN

#if ((IMAGIS_TSP_IC == IMAGIS_IST30XX) || (IMAGIS_TSP_IC == IMAGIS_IST30XXB))
#define IST30XX_EEPROM_SIZE     	(0x8000)
#elif (IMAGIS_TSP_IC == IMAGIS_IST3038)
#define IST30XX_EEPROM_SIZE     	(0xA000)
#elif (IMAGIS_TSP_IC == IMAGIS_IST3044)
#define IST30XX_EEPROM_SIZE     	(0x10000)
#endif
#define EEPROM_PAGE_SIZE        	(64)
#define EEPROM_BASE_ADDR        	(0)

#define IST30XXB_ACCESS_ADDR    	(1 << 31)
#define IST30XXB_BURST_ACCESS   	(1 << 27)
#define IST30XXB_DA_ADDR(n)     	(n | IST30XXB_ACCESS_ADDR)

#define IST30XXB_REG_TSPTYPE    	IST30XXB_DA_ADDR(0x40002010)

#define IST30XXB_REG_WDTCON     	IST30XXB_DA_ADDR(0x40003000)
#define IST30XXB_REG_EEPMODE    	IST30XXB_DA_ADDR(0x40007000)
#define IST30XXB_REG_EEPADDR    	IST30XXB_DA_ADDR(0x40007004)
#define IST30XXB_REG_EEPWDAT    	IST30XXB_DA_ADDR(0x40007008)
#define IST30XXB_REG_EEPRDAT    	IST30XXB_DA_ADDR(0x4000700C)
#define IST30XXB_REG_EEPISPEN   	IST30XXB_DA_ADDR(0x40007010)
#define IST30XXB_REG_CHKSMOD    	IST30XXB_DA_ADDR(0x40007014)
#define IST30XXB_REG_EEPPWRCTRL 	IST30XXB_DA_ADDR(0x4000701C)
#define IST30XXB_REG_CHKSDAT    	IST30XXB_DA_ADDR(0x40007038)

#define IST30XXB_REG_CHIPID     	IST30XXB_DA_ADDR(0x40000000)
#define IST30XXB_REG_PADCTRL    	IST30XXB_DA_ADDR(0x40000024)
#define IST30XXB_REG_LDOOSC     	IST30XXB_DA_ADDR(0x40000030)
#define IST30XXB_REG_CLKDIV     	IST30XXB_DA_ADDR(0x4000004C)

#define IST30XXB_MEM_ADDR       	(0x20000000)
#define IST30XXB_MEM_ALGORITHM  	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x34)
#define IST30XXB_MEM_CMD        	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x3C)
#define IST30XXB_MEM_FINGERS    	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x4)

#define IST30XXB_MEM_COUNT      	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x30)

#if (IMAGIS_TSP_IC == IMAGIS_IST30XXB)
#define IST30XXB_MEM_KEYSENSITIVITY	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x5F0)
#elif (IMAGIS_TSP_IC == IMAGIS_IST3038)
#define IST30XXB_MEM_KEYSENSITIVITY	IST30XXB_DA_ADDR(IST30XXB_MEM_ADDR | 0x40)
#else
#error "Unknown IMAGIS_TSP_IC"
#endif

#define IST30XX_FW_NAME         	"ist30xx.fw"
#define IST30XXB_FW_NAME        	"ist30xxb.fw"
#define IST30XXB_CURVE_NAME     	"ist30xxb.cv"

#define MASK_FW_VER             	(0xFFFF0000)
#define IST30XX_FW_VER1         	(0x00010000)
#define IST30XX_FW_VER2         	(0x00020000)
#define IST30XX_FW_VER3         	(0x00030000)
#define IST30XX_FW_VER4         	(0x00040000)
#define IST30XX_FW_VER5         	(0x00050000)

#define IST30XX_FW_UPDATE_RETRY 	(3)

#define WAIT_CALIB_CNT          	(50)
#define CALIB_THRESHOLD         	(100)

#define CALIB_TO_GAP(n)         	((n >> 16) & 0xFFF)
#define CALIB_TO_STATUS(n)      	((n >> 12) & 0xF)

#define CALIB_TO_OS_VALUE(n)    	((n >> 12) & 0xFFFF)

#define MASK_UPDATE_INTERNAL    	(1)
#define MASK_UPDATE_FW          	(2)
#define MASK_UPDATE_SDCARD      	(3)
#define MASK_UPDATE_ERASE       	(4)

#define CHKSUM_FW               	(1)
#define CHKSUM_ALL              	(2)

#define FLAG_FW                 	(1)
#define FLAG_PARAM              	(2)
#define FLAG_SUB                	(3)

#define TAGS_PARSE_OK           	(0)

/* I2C Transaction size */
#define I2C_MAX_WRITE_SIZE      	(64)		/* bytes */
#define I2C_MAX_READ_SIZE       	(8)			/* bytes */

int ist30xx_read_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len);
int ist30xx_write_buf(struct i2c_client *client, u32 cmd, u32 *buf, u16 len);

int ist30xxb_burst_read(struct i2c_client *client, u32 addr, u32 *buf32, int len);

int ist30xxb_read_chksum(struct i2c_client *client, u32 *chksum);
int ist30xxb_read_chksum_all(struct i2c_client *client, u32 *chksum);

void ist30xx_get_update_info(struct ist30xx_data *data, const u8 *buf, const u32 size);

u32 ist30xx_parse_ver(int flag, const u8 *buf);

int ist30xx_fw_update(struct i2c_client *client, const u8 *buf, int size, bool mode);
int ist30xx_fw_param_update(struct i2c_client *client, const u8 *buf);
int ist30xx_fw_recovery(struct ist30xx_data *data);

int ist30xx_auto_fw_update(struct ist30xx_data *data);
int ist30xx_auto_param_update(struct ist30xx_data *data);
int ist30xx_auto_bin_update(struct ist30xx_data *data);

int ist30xx_calibrate(int wait_cnt);
int ist30xx_calib_wait(void);

int ist30xx_init_update_sysfs(void);

#endif  // __IST30XX_UPDATE_H__