xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/vtl_ts/chip.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun #include <linux/types.h>
4*4882a593Smuzhiyun #include <linux/i2c.h>
5*4882a593Smuzhiyun #include <linux/delay.h>
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include "vtl_ts.h"
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #define		FLASH_I2C_ADDR	0X7F
11*4882a593Smuzhiyun #define		CHIP_ID_ADDR	0xf000
12*4882a593Smuzhiyun #define 		RW_FLAG		0xff
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define		CHIP_WRITE_FLASH_CMD	0x55
15*4882a593Smuzhiyun #define		CHIP_FLASH_SOURCE_SIZE	8
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define 	TB1_USE_F402            0
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun struct chip_cmd {
20*4882a593Smuzhiyun 	unsigned short	addr;
21*4882a593Smuzhiyun 	unsigned char	data;
22*4882a593Smuzhiyun };
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun static struct ts_info * ts_object = NULL;
26*4882a593Smuzhiyun static struct chip_cmd (*chip) = NULL;
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun enum cmd_index {
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	FW_VERSION = 0X00,
33*4882a593Smuzhiyun 	FW_CHECKSUM_CMD,
34*4882a593Smuzhiyun 	FW_CHECKSUM_VAL,
35*4882a593Smuzhiyun 	CHIP_SLEEP,
36*4882a593Smuzhiyun 	CHIP_ID_CMD,
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	/***********flash***********/
39*4882a593Smuzhiyun 	FLASH_SECTOR_ERASE_CMD,
40*4882a593Smuzhiyun 	FLASH_SECTOR_NUM,
41*4882a593Smuzhiyun 	FLASH_SECTOR_SIZE,
42*4882a593Smuzhiyun 	FLASH_MASS_ERASE_CMD
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun static struct chip_cmd ct360_cmd[] = {
46*4882a593Smuzhiyun 	{0x0f2a,RW_FLAG},	//fw version
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	{0x0fff,0xe1}, 		//fw checksum cmd
49*4882a593Smuzhiyun 	{0x0a0d,RW_FLAG}, 	//fw checksum val
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	{0x0f2b,0x00}, 		//chip sleep cmd
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	{0xf000,RW_FLAG},	//chip id cmd
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	/************flash*************/
56*4882a593Smuzhiyun 	{0x33,RW_FLAG},		//FLASH_SECTOR_ERASE_CMD
57*4882a593Smuzhiyun 	{8,RW_FLAG},		//FLASH_SECTOR_NUM
58*4882a593Smuzhiyun 	{2048,RW_FLAG},		//FLASH_SECTOR_SIZE
59*4882a593Smuzhiyun 	{RW_FLAG,RW_FLAG},	//FLASH_MASS_ERASE_CMD
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun static struct chip_cmd ct36x_cmd[] = {
63*4882a593Smuzhiyun 	{0x3fff,RW_FLAG}, 	//fw version
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	{0x8fff,0xe1},		//fw checksum cmd
66*4882a593Smuzhiyun 	{0x8e0e,RW_FLAG},	//fw checksum val
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun 	{0x8fff,0xaf},		//chip sleep cmd
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	{0xf000,RW_FLAG},	//chip id cmd
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	/************flash*************/
73*4882a593Smuzhiyun 	{0x30,RW_FLAG},		//FLASH_SECTOR_ERASE_CMD
74*4882a593Smuzhiyun 	{256,RW_FLAG},		//FLASH_SECTOR_NUM
75*4882a593Smuzhiyun 	{128,RW_FLAG},		//FLASH_SECTOR_SIZE
76*4882a593Smuzhiyun 	{0x33,RW_FLAG},		//FLASH_MASS_ERASE_CMD
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #if 0
80*4882a593Smuzhiyun unsigned int ct36x_cmd[4][2] = {
81*4882a593Smuzhiyun 	{0x3fff,0x00}, //fw version
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	{0x0fff,0xe1}, //fw checksum cmd
84*4882a593Smuzhiyun 	{0x0a0d,0x00}, //fw checksum val
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	{0x8fff,0xaf},//chip sleep cmd
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun unsigned int (*chip)[2] = ct36x_cmd;
90*4882a593Smuzhiyun #endif
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun 
chip_i2c_read(struct i2c_client * client,__u16 addr,__u8 * buf,__u16 len)93*4882a593Smuzhiyun static int chip_i2c_read(struct i2c_client *client, __u16 addr, __u8 *buf, __u16 len)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	struct i2c_msg msgs;
96*4882a593Smuzhiyun 	int ret;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	DEBUG();
99*4882a593Smuzhiyun 	msgs.addr = addr;
100*4882a593Smuzhiyun 	msgs.flags = 0x01;  // 0x00: write 0x01:read
101*4882a593Smuzhiyun 	msgs.len = len;
102*4882a593Smuzhiyun 	msgs.buf = buf;
103*4882a593Smuzhiyun 	//#if(PLATFORM == ROCKCHIP)
104*4882a593Smuzhiyun 	//msgs.scl_rate = TS_I2C_SPEED;
105*4882a593Smuzhiyun 	//#endif
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	ret = i2c_transfer(client->adapter, &msgs, 1);
108*4882a593Smuzhiyun 	if(ret != 1){
109*4882a593Smuzhiyun 		printk("___%s:i2c read error___\n",__func__);
110*4882a593Smuzhiyun 		return -1;
111*4882a593Smuzhiyun 	}
112*4882a593Smuzhiyun 	return 0;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
chip_i2c_write(struct i2c_client * client,__u16 addr,__u8 * buf,__u16 len)115*4882a593Smuzhiyun static int chip_i2c_write(struct i2c_client *client, __u16 addr, __u8 *buf, __u16 len)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct i2c_msg msgs;
118*4882a593Smuzhiyun 	int ret;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 	DEBUG();
121*4882a593Smuzhiyun 	msgs.addr = addr;
122*4882a593Smuzhiyun 	msgs.flags = 0x00;  // 0x00: write 0x01:read
123*4882a593Smuzhiyun 	msgs.len = len;
124*4882a593Smuzhiyun 	msgs.buf = buf;
125*4882a593Smuzhiyun 	//#if(PLATFORM == ROCKCHIP)
126*4882a593Smuzhiyun 	//msgs.scl_rate = TS_I2C_SPEED;
127*4882a593Smuzhiyun 	//#endif
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	ret = i2c_transfer(client->adapter, &msgs, 1);
130*4882a593Smuzhiyun 	if(ret != 1){
131*4882a593Smuzhiyun 		printk("___%s:i2c write error___\n",__func__);
132*4882a593Smuzhiyun 		return -1;
133*4882a593Smuzhiyun 	}
134*4882a593Smuzhiyun 	return 0;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun 
chip_ram_write_1byte(unsigned short addr,unsigned char data)138*4882a593Smuzhiyun static int chip_ram_write_1byte(unsigned short addr,unsigned char data)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun 	struct i2c_client *client = ts_object->driver->client;
141*4882a593Smuzhiyun 	unsigned char buf[3];
142*4882a593Smuzhiyun 	int ret = 0;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	DEBUG();
145*4882a593Smuzhiyun 	buf[0] = 0xff;
146*4882a593Smuzhiyun 	buf[1] = addr >> 8;
147*4882a593Smuzhiyun 	buf[2] = addr & 0x00ff;
148*4882a593Smuzhiyun 	//printk("addr = %x,buf[0] = %x,buf[1] = %x,buf[2] = %x,data = %x\n",addr,buf[0],buf[1],buf[2],data);
149*4882a593Smuzhiyun 	ret = chip_i2c_write(client, client->addr, buf,3);
150*4882a593Smuzhiyun 	if(ret)
151*4882a593Smuzhiyun 	{
152*4882a593Smuzhiyun 		return ret;
153*4882a593Smuzhiyun 	}
154*4882a593Smuzhiyun 	udelay(10);
155*4882a593Smuzhiyun 	buf[0] = 0x00;
156*4882a593Smuzhiyun 	buf[1] = data;
157*4882a593Smuzhiyun 	ret = chip_i2c_write(client, client->addr, buf,2);
158*4882a593Smuzhiyun 	udelay(10);
159*4882a593Smuzhiyun 	return ret;
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
chip_ram_read(unsigned short addr,unsigned char * rx_buf,unsigned short len)162*4882a593Smuzhiyun static int chip_ram_read(unsigned short addr,unsigned char *rx_buf,unsigned short len)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	struct i2c_client *client = ts_object->driver->client;
165*4882a593Smuzhiyun 	unsigned char buf[3];
166*4882a593Smuzhiyun 	int ret = 0;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	DEBUG();
169*4882a593Smuzhiyun 	buf[0] = 0xff;
170*4882a593Smuzhiyun 	buf[1] = addr >> 8;
171*4882a593Smuzhiyun 	buf[2] = addr & 0x00ff;
172*4882a593Smuzhiyun 	//printk("addr = %x,buf[0] = %x,buf[1] = %x,buf[2] = %x\n",addr,buf[0],buf[1],buf[2]);
173*4882a593Smuzhiyun 	ret = chip_i2c_write(client, client->addr, buf,3);
174*4882a593Smuzhiyun 	if(ret)
175*4882a593Smuzhiyun 	{
176*4882a593Smuzhiyun 		return ret;
177*4882a593Smuzhiyun 	}
178*4882a593Smuzhiyun 	udelay(10);
179*4882a593Smuzhiyun 	buf[0] = 0x00;
180*4882a593Smuzhiyun 	ret = chip_i2c_write(client, client->addr, buf,1);
181*4882a593Smuzhiyun 	udelay(10);
182*4882a593Smuzhiyun 	if(ret)
183*4882a593Smuzhiyun 	{
184*4882a593Smuzhiyun 		return ret;
185*4882a593Smuzhiyun 	}
186*4882a593Smuzhiyun 	udelay(10);
187*4882a593Smuzhiyun 	ret = chip_i2c_read(client,client->addr,rx_buf,len);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	return ret;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun 
chip_get_fw_version(unsigned char * buf)192*4882a593Smuzhiyun int chip_get_fw_version(unsigned char *buf)
193*4882a593Smuzhiyun {
194*4882a593Smuzhiyun 	int ret = 0;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	DEBUG();
197*4882a593Smuzhiyun 	ret = chip_ram_read(chip[FW_VERSION].addr,buf,1);
198*4882a593Smuzhiyun 	return ret;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #if 0
202*4882a593Smuzhiyun int chip_get_chip_id(unsigned char *buf)
203*4882a593Smuzhiyun {
204*4882a593Smuzhiyun 	int ret = 0;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun 	DEBUG();
207*4882a593Smuzhiyun 	ret = chip_ram_read(chip[CHIP_ID_CMD].addr,buf,1);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	return ret;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun #endif
212*4882a593Smuzhiyun 
chip_enter_sleep_mode(void)213*4882a593Smuzhiyun int chip_enter_sleep_mode(void)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun 	int ret = 0;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	DEBUG();
218*4882a593Smuzhiyun 	if(chip == NULL)
219*4882a593Smuzhiyun 	{
220*4882a593Smuzhiyun 			return -1;
221*4882a593Smuzhiyun 	}
222*4882a593Smuzhiyun 	ret = chip_ram_write_1byte(chip[CHIP_SLEEP].addr,chip[CHIP_SLEEP].data);
223*4882a593Smuzhiyun 	return ret;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun 
chip_function(enum cmd_index cmd_index,unsigned char * rx_buf,unsigned char len)227*4882a593Smuzhiyun int chip_function(enum cmd_index cmd_index,unsigned char *rx_buf,unsigned char len)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun 	int ret = 0;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	DEBUG();
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	if(chip[cmd_index].data != RW_FLAG)  //write
234*4882a593Smuzhiyun 	{
235*4882a593Smuzhiyun 		ret = chip_ram_write_1byte(chip[cmd_index].addr,chip[cmd_index].data);
236*4882a593Smuzhiyun 	}
237*4882a593Smuzhiyun 	else  				  //read
238*4882a593Smuzhiyun 	{
239*4882a593Smuzhiyun 		ret = chip_ram_read(chip[cmd_index].addr,rx_buf,len);
240*4882a593Smuzhiyun 	}
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	return ret;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /***************flash********************/
246*4882a593Smuzhiyun #if 0
247*4882a593Smuzhiyun static int chip_flash_init(struct i2c_client *client)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 	unsigned char buf[2];
250*4882a593Smuzhiyun 	int ret = 0;
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	DEBUG();
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	buf[0] = 0x00;
255*4882a593Smuzhiyun 	buf[1] = 0x00;
256*4882a593Smuzhiyun 	ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,2);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	return ret;
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun #endif
261*4882a593Smuzhiyun 
chip_read_bus_status(struct i2c_client * client,unsigned char * rx_buf)262*4882a593Smuzhiyun static int chip_read_bus_status(struct i2c_client *client,unsigned char *rx_buf)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun 	unsigned char buf[1];
265*4882a593Smuzhiyun 	int ret = 0;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	DEBUG();
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun 	buf[0] = 0x00;
270*4882a593Smuzhiyun 	ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,1);
271*4882a593Smuzhiyun 	if(ret)
272*4882a593Smuzhiyun 	{
273*4882a593Smuzhiyun 		return ret;
274*4882a593Smuzhiyun 	}
275*4882a593Smuzhiyun 	mdelay(1);
276*4882a593Smuzhiyun 	ret = chip_i2c_read(client,FLASH_I2C_ADDR,rx_buf,1);
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	return ret;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
chip_enter_idle_mode(struct i2c_client * client)281*4882a593Smuzhiyun static int chip_enter_idle_mode(struct i2c_client *client)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun 	unsigned char buf[2];
284*4882a593Smuzhiyun 	int ret = 0;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	DEBUG();
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	buf[0] = 0x00;
289*4882a593Smuzhiyun 	buf[1] = 0xa5;
290*4882a593Smuzhiyun 	ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,2);
291*4882a593Smuzhiyun 	mdelay(5);
292*4882a593Smuzhiyun 	//mdelay(10);
293*4882a593Smuzhiyun 	return ret;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun 
chip_solfware_reset(struct i2c_client * client)296*4882a593Smuzhiyun int chip_solfware_reset(struct i2c_client *client)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun 	unsigned char buf[2];
299*4882a593Smuzhiyun 	int ret = 0;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	DEBUG();
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	buf[0] = 0x00;
304*4882a593Smuzhiyun 	buf[1] = 0x5a;
305*4882a593Smuzhiyun 	ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,2);
306*4882a593Smuzhiyun 	msleep(200);//ct36x
307*4882a593Smuzhiyun 	//msleep(100);
308*4882a593Smuzhiyun 	return ret;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun 
chip_erase_flash(struct i2c_client * client)311*4882a593Smuzhiyun static int chip_erase_flash(struct i2c_client *client)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun 	unsigned char buf[4];
314*4882a593Smuzhiyun 	int sec,sec_addr;
315*4882a593Smuzhiyun 	int ret = 0;
316*4882a593Smuzhiyun 
317*4882a593Smuzhiyun 	DEBUG();
318*4882a593Smuzhiyun 	if(chip[FLASH_MASS_ERASE_CMD].addr == 0x33)//ct36x mass erase
319*4882a593Smuzhiyun 	{
320*4882a593Smuzhiyun 		ret = chip_read_bus_status(client,buf);
321*4882a593Smuzhiyun 		if(buf[0] != 0xaa)
322*4882a593Smuzhiyun 		{
323*4882a593Smuzhiyun 			printk("___i2c bus busy,bus_status = %d___\n",buf[0]);
324*4882a593Smuzhiyun 			return -1;
325*4882a593Smuzhiyun 		}
326*4882a593Smuzhiyun 		buf[0] = 0x00;
327*4882a593Smuzhiyun 		buf[1] = chip[FLASH_MASS_ERASE_CMD].addr;
328*4882a593Smuzhiyun 		buf[2] = 0x00;
329*4882a593Smuzhiyun 		buf[3] = 0x00;
330*4882a593Smuzhiyun 		ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,4);
331*4882a593Smuzhiyun 		if(ret)
332*4882a593Smuzhiyun 		{
333*4882a593Smuzhiyun 			printk("vtl chip flash erase fail\n");
334*4882a593Smuzhiyun 			return ret;
335*4882a593Smuzhiyun 		}
336*4882a593Smuzhiyun 		//printk("mass erase\n");
337*4882a593Smuzhiyun 		//mdelay(10);
338*4882a593Smuzhiyun 		msleep(10);
339*4882a593Smuzhiyun 	}
340*4882a593Smuzhiyun 	else 					  //ct360/ct36x sector erase
341*4882a593Smuzhiyun 	{
342*4882a593Smuzhiyun 		for(sec = 0;sec < chip[FLASH_SECTOR_NUM].addr;sec++)
343*4882a593Smuzhiyun 		{
344*4882a593Smuzhiyun 			ret = chip_read_bus_status(client,buf);
345*4882a593Smuzhiyun 			if(buf[0] != 0xaa)
346*4882a593Smuzhiyun 			{
347*4882a593Smuzhiyun 				printk("___i2c bus busy,bus_status = %x,sec = %d___\n",buf[0],sec);
348*4882a593Smuzhiyun 				return -1;
349*4882a593Smuzhiyun 			}
350*4882a593Smuzhiyun 			sec_addr = sec * chip[FLASH_SECTOR_SIZE].addr;
351*4882a593Smuzhiyun 			buf[0] = 0x00;
352*4882a593Smuzhiyun 			buf[1] = chip[FLASH_SECTOR_ERASE_CMD].addr;
353*4882a593Smuzhiyun 			buf[2] = sec_addr >> 8;
354*4882a593Smuzhiyun 			buf[3] = sec_addr & 0x00ff;
355*4882a593Smuzhiyun 			ret = chip_i2c_write(client, FLASH_I2C_ADDR, buf,4);
356*4882a593Smuzhiyun 			if(ret)
357*4882a593Smuzhiyun 			{
358*4882a593Smuzhiyun 				printk("vtl chip flash erase fail\n");
359*4882a593Smuzhiyun 				return ret;
360*4882a593Smuzhiyun 			}
361*4882a593Smuzhiyun 			//msleep(10);//ct36x
362*4882a593Smuzhiyun 			msleep(100);//ct360
363*4882a593Smuzhiyun 		}
364*4882a593Smuzhiyun 		//printk("sector erase\n");
365*4882a593Smuzhiyun 	}
366*4882a593Smuzhiyun 	return 0;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun extern unsigned char *gtpfw;
chip_set_code(unsigned int flash_addr,unsigned char * buf)370*4882a593Smuzhiyun static int chip_set_code(unsigned int flash_addr, unsigned char *buf)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	unsigned char i;
373*4882a593Smuzhiyun 	static unsigned char *binary_data = NULL;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	if (binary_data == NULL) {
376*4882a593Smuzhiyun 		binary_data = gtpfw;
377*4882a593Smuzhiyun 	}
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun 	buf[2] = (flash_addr >> 8);
380*4882a593Smuzhiyun 	buf[3] = (flash_addr & 0xFF);
381*4882a593Smuzhiyun 	buf[4] = 0x08;
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	DEBUG();
384*4882a593Smuzhiyun 	if ( (flash_addr == 160) || (flash_addr == 168) )
385*4882a593Smuzhiyun 	{
386*4882a593Smuzhiyun 		for(i=0;i<8;i++)
387*4882a593Smuzhiyun 		{
388*4882a593Smuzhiyun 			buf[i+6] = ~binary_data[flash_addr + i];
389*4882a593Smuzhiyun 		}
390*4882a593Smuzhiyun 	}
391*4882a593Smuzhiyun 	else
392*4882a593Smuzhiyun 	{
393*4882a593Smuzhiyun 		for(i=0;i<8;i++)
394*4882a593Smuzhiyun 		{
395*4882a593Smuzhiyun 			buf[i+6] = binary_data[flash_addr + i];
396*4882a593Smuzhiyun 		}
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 	buf[5] = ~(buf[2]+buf[3]+buf[4]+buf[6]+buf[7]+buf[8]+buf[9]+buf[10]+buf[11]+buf[12]+buf[13]) + 1;
399*4882a593Smuzhiyun 	return buf[5];
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun 
chip_get_bin_checksum(void)402*4882a593Smuzhiyun static int chip_get_bin_checksum(void)
403*4882a593Smuzhiyun {
404*4882a593Smuzhiyun 	unsigned char buf[14];
405*4882a593Smuzhiyun 	int sec,cod;
406*4882a593Smuzhiyun 	int flash_addr;
407*4882a593Smuzhiyun 	unsigned short bin_checksum = 0;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	DEBUG();
410*4882a593Smuzhiyun 	flash_addr = 0x00;
411*4882a593Smuzhiyun 	cod = chip[FLASH_SECTOR_NUM].addr * (chip[FLASH_SECTOR_SIZE].addr/CHIP_FLASH_SOURCE_SIZE);
412*4882a593Smuzhiyun 	for(sec=0;sec<cod;sec++)
413*4882a593Smuzhiyun 	{
414*4882a593Smuzhiyun 		bin_checksum += chip_set_code(flash_addr,buf);
415*4882a593Smuzhiyun 		flash_addr += CHIP_FLASH_SOURCE_SIZE;
416*4882a593Smuzhiyun 		//printk("sec = %d\n",sec);
417*4882a593Smuzhiyun 	}
418*4882a593Smuzhiyun 	return bin_checksum;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
chip_get_fwchksum(struct i2c_client * client,int * fwchksum)421*4882a593Smuzhiyun int chip_get_fwchksum(struct i2c_client *client,int *fwchksum)
422*4882a593Smuzhiyun {
423*4882a593Smuzhiyun 	unsigned char buf[2];
424*4882a593Smuzhiyun 	int ret = 0;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	DEBUG();
427*4882a593Smuzhiyun 	if(chip == NULL){
428*4882a593Smuzhiyun 		return -1;
429*4882a593Smuzhiyun 	}
430*4882a593Smuzhiyun 	ret = chip_ram_write_1byte(chip[FW_CHECKSUM_CMD].addr,chip[FW_CHECKSUM_CMD].data);
431*4882a593Smuzhiyun 	if(ret)
432*4882a593Smuzhiyun 	{
433*4882a593Smuzhiyun 		return -1;
434*4882a593Smuzhiyun 	}
435*4882a593Smuzhiyun 	msleep(700);
436*4882a593Smuzhiyun 	ret = chip_ram_read(chip[FW_CHECKSUM_VAL].addr,buf,2);
437*4882a593Smuzhiyun 	*fwchksum = (buf[0]<<8)|buf[1];
438*4882a593Smuzhiyun 	//chip_solfware_reset(client);
439*4882a593Smuzhiyun 	vtl_ts_hw_reset();
440*4882a593Smuzhiyun 	return 0;
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun 
chip_write_flash(struct i2c_client * client)443*4882a593Smuzhiyun static int chip_write_flash(struct i2c_client *client)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun 	unsigned char buf[14];
446*4882a593Smuzhiyun #if 0
447*4882a593Smuzhiyun 	unsigned char bus_status[1];
448*4882a593Smuzhiyun #endif
449*4882a593Smuzhiyun 	int sec,cod,sec_8byte_num;
450*4882a593Smuzhiyun 	int flash_addr;
451*4882a593Smuzhiyun 	int ret = 0;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	DEBUG();
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	buf[0] = 0x00;
456*4882a593Smuzhiyun 	buf[1] = CHIP_WRITE_FLASH_CMD;
457*4882a593Smuzhiyun 	sec_8byte_num = chip[FLASH_SECTOR_SIZE].addr/CHIP_FLASH_SOURCE_SIZE;
458*4882a593Smuzhiyun 	cod = chip[FLASH_SECTOR_NUM].addr * sec_8byte_num;
459*4882a593Smuzhiyun 	flash_addr = 0x00;
460*4882a593Smuzhiyun 	for(sec=0;sec<cod;)
461*4882a593Smuzhiyun 	{
462*4882a593Smuzhiyun 		chip_set_code(flash_addr,buf);
463*4882a593Smuzhiyun 		flash_addr += CHIP_FLASH_SOURCE_SIZE;
464*4882a593Smuzhiyun #if 0
465*4882a593Smuzhiyun 		ret = chip_read_bus_status(client,bus_status);
466*4882a593Smuzhiyun 		if(bus_status[0] != 0xaa)
467*4882a593Smuzhiyun 		{
468*4882a593Smuzhiyun 			printk("i2c bus busy,sec = %d,bus_status = %x\n",sec,bus_status[0]);
469*4882a593Smuzhiyun 			return -1;
470*4882a593Smuzhiyun 		}
471*4882a593Smuzhiyun #endif
472*4882a593Smuzhiyun 		ret = chip_i2c_write(client,FLASH_I2C_ADDR, buf,14);
473*4882a593Smuzhiyun 		if(ret)
474*4882a593Smuzhiyun 		{
475*4882a593Smuzhiyun 			return ret;
476*4882a593Smuzhiyun 		}
477*4882a593Smuzhiyun 		sec++;
478*4882a593Smuzhiyun 		if(!(sec%sec_8byte_num))
479*4882a593Smuzhiyun 		{
480*4882a593Smuzhiyun 			msleep(10);
481*4882a593Smuzhiyun 			//mdelay(10);
482*4882a593Smuzhiyun 		}
483*4882a593Smuzhiyun 		mdelay(1);//ct360
484*4882a593Smuzhiyun 	}
485*4882a593Smuzhiyun 	return 0;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
chip_get_checksum(struct i2c_client * client,int * bin_checksum,int * fw_checksum)488*4882a593Smuzhiyun int chip_get_checksum(struct i2c_client *client,int *bin_checksum,int *fw_checksum)
489*4882a593Smuzhiyun {
490*4882a593Smuzhiyun 	DEBUG();
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun 	if(chip == NULL){
493*4882a593Smuzhiyun 		return -1;
494*4882a593Smuzhiyun 	}
495*4882a593Smuzhiyun 	*bin_checksum = chip_get_bin_checksum();
496*4882a593Smuzhiyun 	chip_get_fwchksum(client,fw_checksum);
497*4882a593Smuzhiyun 	//printk("bin_checksum = 0x%x,fw_checksum = 0x%x\n",*bin_checksum,*fw_checksum);
498*4882a593Smuzhiyun 	return 0;
499*4882a593Smuzhiyun }
500*4882a593Smuzhiyun 
update(struct i2c_client * client)501*4882a593Smuzhiyun int update(struct i2c_client *client)
502*4882a593Smuzhiyun {
503*4882a593Smuzhiyun 	unsigned char buf[20];
504*4882a593Smuzhiyun 	int ret = 0;
505*4882a593Smuzhiyun 	DEBUG();
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun 	if(chip == NULL)
508*4882a593Smuzhiyun 	{
509*4882a593Smuzhiyun 		return -1;
510*4882a593Smuzhiyun 	}
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	printk("___chip update start___\n");
513*4882a593Smuzhiyun 	ret = chip_enter_idle_mode(client);
514*4882a593Smuzhiyun 	if(ret)
515*4882a593Smuzhiyun 	{
516*4882a593Smuzhiyun 		return -1;
517*4882a593Smuzhiyun 	}
518*4882a593Smuzhiyun 	ret = chip_read_bus_status(client,buf);
519*4882a593Smuzhiyun 	if(buf[0] != 0xaa)
520*4882a593Smuzhiyun 	{
521*4882a593Smuzhiyun 		printk("___i2c bus busy,bus_status = %x___\n",buf[0]);
522*4882a593Smuzhiyun 		return -1;
523*4882a593Smuzhiyun 	}
524*4882a593Smuzhiyun 	ret = chip_erase_flash(client);
525*4882a593Smuzhiyun 	if(ret)
526*4882a593Smuzhiyun 	{
527*4882a593Smuzhiyun 		printk("___erase flash fail___\n");
528*4882a593Smuzhiyun 		return -1;
529*4882a593Smuzhiyun 	}
530*4882a593Smuzhiyun 	ret = chip_write_flash(client);
531*4882a593Smuzhiyun 	if(ret)
532*4882a593Smuzhiyun 	{
533*4882a593Smuzhiyun 		printk("___write flash fail___\n");
534*4882a593Smuzhiyun 		return -1;
535*4882a593Smuzhiyun 	}
536*4882a593Smuzhiyun 	vtl_ts_hw_reset();
537*4882a593Smuzhiyun 	printk("___chip update end___\n");
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	return 0;
540*4882a593Smuzhiyun }
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 
chip_update(struct i2c_client * client)543*4882a593Smuzhiyun int chip_update(struct i2c_client *client)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun 	int bin_checksum = 0xff;
546*4882a593Smuzhiyun 	int fw_checksum = 0;
547*4882a593Smuzhiyun 	int cnt = 0;
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	DEBUG();
550*4882a593Smuzhiyun 	if(chip == NULL)
551*4882a593Smuzhiyun 	{
552*4882a593Smuzhiyun 		return -1;
553*4882a593Smuzhiyun 	}
554*4882a593Smuzhiyun 
555*4882a593Smuzhiyun 	chip_get_checksum(client,&bin_checksum,&fw_checksum);
556*4882a593Smuzhiyun 	printk("bin_checksum = 0x%x,fw_checksum = 0x%x\n",bin_checksum,fw_checksum);
557*4882a593Smuzhiyun 	cnt = 2;
558*4882a593Smuzhiyun 	while((bin_checksum != fw_checksum) && (cnt--))
559*4882a593Smuzhiyun 	{
560*4882a593Smuzhiyun 		if(update(client) < 0)
561*4882a593Smuzhiyun 		{
562*4882a593Smuzhiyun 			vtl_ts_hw_reset();
563*4882a593Smuzhiyun 			continue;
564*4882a593Smuzhiyun 		}
565*4882a593Smuzhiyun 		chip_get_fwchksum(client,&fw_checksum);
566*4882a593Smuzhiyun 		printk("bin_checksum = %x,fw_checksum = %x,cnt = %d\n",bin_checksum,fw_checksum,cnt);
567*4882a593Smuzhiyun 	}
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun 	if(bin_checksum != fw_checksum)
570*4882a593Smuzhiyun 	{
571*4882a593Smuzhiyun 		return -1;
572*4882a593Smuzhiyun 	}
573*4882a593Smuzhiyun 	return 0;
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun /*
577*4882a593Smuzhiyun int chip_update(struct i2c_client *client)
578*4882a593Smuzhiyun {
579*4882a593Smuzhiyun 	unsigned char buf[20];
580*4882a593Smuzhiyun 	int bin_checksum,fw_checksum,cnt;
581*4882a593Smuzhiyun 	int ret = 0;
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	DEBUG();
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun 	if(chip == NULL)
586*4882a593Smuzhiyun 	{
587*4882a593Smuzhiyun 		return -1;
588*4882a593Smuzhiyun 	}
589*4882a593Smuzhiyun 	bin_checksum = chip_get_bin_checksum();
590*4882a593Smuzhiyun 	chip_get_fwchksum(client,&fw_checksum);
591*4882a593Smuzhiyun 	printk("bin_checksum = %x,fw_checksum = %x\n",bin_checksum,fw_checksum);
592*4882a593Smuzhiyun 	cnt = 2;
593*4882a593Smuzhiyun 	while((bin_checksum != fw_checksum) && (cnt--))
594*4882a593Smuzhiyun 	//while(cnt--)
595*4882a593Smuzhiyun 	{
596*4882a593Smuzhiyun 		printk("___chip update start___\n");
597*4882a593Smuzhiyun 		ret = chip_enter_idle_mode(client);
598*4882a593Smuzhiyun 		if(ret)
599*4882a593Smuzhiyun 		{
600*4882a593Smuzhiyun 			//return ret;
601*4882a593Smuzhiyun 			continue;
602*4882a593Smuzhiyun 		}
603*4882a593Smuzhiyun 		ret = chip_read_bus_status(client,buf);
604*4882a593Smuzhiyun 		if(buf[0] != 0xaa)
605*4882a593Smuzhiyun 		{
606*4882a593Smuzhiyun 			printk("___i2c bus busy,bus_status = %x___\n",buf[0]);
607*4882a593Smuzhiyun 			//return ret;
608*4882a593Smuzhiyun 			continue;
609*4882a593Smuzhiyun 		}
610*4882a593Smuzhiyun 		ret = chip_erase_flash(client);
611*4882a593Smuzhiyun 		if(ret)
612*4882a593Smuzhiyun 		{
613*4882a593Smuzhiyun 			printk("___erase flash fail___\n");
614*4882a593Smuzhiyun 			//return ret;
615*4882a593Smuzhiyun 			continue;
616*4882a593Smuzhiyun 		}
617*4882a593Smuzhiyun 		ret = chip_write_flash(client);
618*4882a593Smuzhiyun 		if(ret)
619*4882a593Smuzhiyun 		{
620*4882a593Smuzhiyun 			printk("___write flash fail___\n");
621*4882a593Smuzhiyun 			//return ret;
622*4882a593Smuzhiyun 			continue;
623*4882a593Smuzhiyun 		}
624*4882a593Smuzhiyun 		vtl_ts_hw_reset();
625*4882a593Smuzhiyun 		//chip_solfware_reset(client);
626*4882a593Smuzhiyun 		ret = chip_get_fwchksum(client,&fw_checksum);
627*4882a593Smuzhiyun 		if(ret)
628*4882a593Smuzhiyun 		{
629*4882a593Smuzhiyun 			printk("___get fwchksum fail___\n");
630*4882a593Smuzhiyun 			//return ret;
631*4882a593Smuzhiyun 			continue;
632*4882a593Smuzhiyun 		}
633*4882a593Smuzhiyun 		printk("___chip update end___\n");
634*4882a593Smuzhiyun 		printk("bin_checksum = %x,fw_checksum = %x\n",bin_checksum,fw_checksum);
635*4882a593Smuzhiyun 	}
636*4882a593Smuzhiyun 	//vtl_ts_hw_reset();
637*4882a593Smuzhiyun 	if(bin_checksum != fw_checksum)
638*4882a593Smuzhiyun 	{
639*4882a593Smuzhiyun 		return -1;
640*4882a593Smuzhiyun 	}
641*4882a593Smuzhiyun 	return 0;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun */
644*4882a593Smuzhiyun 
chip_get_chip_id(struct i2c_client * client,unsigned char * rx_buf)645*4882a593Smuzhiyun int chip_get_chip_id(struct i2c_client *client,unsigned char *rx_buf)
646*4882a593Smuzhiyun {
647*4882a593Smuzhiyun 	unsigned char buf[3];
648*4882a593Smuzhiyun 	int ret = 0;
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun 	DEBUG();
651*4882a593Smuzhiyun 	ret = chip_enter_idle_mode(client);
652*4882a593Smuzhiyun 	if(ret)
653*4882a593Smuzhiyun 	{
654*4882a593Smuzhiyun 		return ret;
655*4882a593Smuzhiyun 	}
656*4882a593Smuzhiyun 	ret = chip_read_bus_status(client,buf);
657*4882a593Smuzhiyun 	if(buf[0]!= 0xaa)
658*4882a593Smuzhiyun 	{
659*4882a593Smuzhiyun 		printk("___i2c bus status = %x,ret = %d___\n",buf[0],ret);
660*4882a593Smuzhiyun 		return -1;
661*4882a593Smuzhiyun 	}
662*4882a593Smuzhiyun 	mdelay(1);
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun 	buf[0] = 0xff;
665*4882a593Smuzhiyun 	buf[1] = CHIP_ID_ADDR>>8;
666*4882a593Smuzhiyun 	buf[2] = CHIP_ID_ADDR & 0x00ff;
667*4882a593Smuzhiyun 	ret = chip_i2c_write(client,0x01, buf,3);
668*4882a593Smuzhiyun 	if(ret)
669*4882a593Smuzhiyun 	{
670*4882a593Smuzhiyun 		return ret;
671*4882a593Smuzhiyun 	}
672*4882a593Smuzhiyun 	mdelay(1);
673*4882a593Smuzhiyun 	buf[0] = 0x00;
674*4882a593Smuzhiyun 	ret = chip_i2c_write(client,0x01, buf,1);
675*4882a593Smuzhiyun 	if(ret)
676*4882a593Smuzhiyun 	{
677*4882a593Smuzhiyun 		return ret;
678*4882a593Smuzhiyun 	}
679*4882a593Smuzhiyun 	mdelay(1);
680*4882a593Smuzhiyun 	ret = chip_i2c_read(client,0x01,rx_buf,1);
681*4882a593Smuzhiyun 	//chip_solfware_reset(client);
682*4882a593Smuzhiyun 	vtl_ts_hw_reset();
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	//printk("___chip ID = %d___\n",*rx_buf);
685*4882a593Smuzhiyun 	return ret;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun 
689*4882a593Smuzhiyun 
chip_read_infoblk(struct i2c_client * client)690*4882a593Smuzhiyun static int chip_read_infoblk(struct i2c_client *client)
691*4882a593Smuzhiyun {
692*4882a593Smuzhiyun 	unsigned char buf[20] = {0};
693*4882a593Smuzhiyun 
694*4882a593Smuzhiyun 	DEBUG();
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	buf[0] = 0x00;
697*4882a593Smuzhiyun 	buf[1] = 0x62;
698*4882a593Smuzhiyun 	buf[2] = 0x00;
699*4882a593Smuzhiyun 	buf[3] = 0x00;
700*4882a593Smuzhiyun 	buf[4] = 0x08;
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	chip_i2c_write(client,0x7F, buf,5);
703*4882a593Smuzhiyun 	mdelay(1);
704*4882a593Smuzhiyun 	chip_i2c_read(client,0x7f, buf,14);
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun 	if(buf[5] & 0x10)
707*4882a593Smuzhiyun 	{
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun 		return 0;
710*4882a593Smuzhiyun 	}
711*4882a593Smuzhiyun 	return 1;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
chip_erase_infoblk(struct i2c_client * client)714*4882a593Smuzhiyun static int chip_erase_infoblk(struct i2c_client *client)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	unsigned char buf[20]={0};
717*4882a593Smuzhiyun 	int ret = -1;
718*4882a593Smuzhiyun 
719*4882a593Smuzhiyun 	DEBUG();
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	// info block erase command
722*4882a593Smuzhiyun 	buf[0] = 0x00;
723*4882a593Smuzhiyun 	buf[1] = 0x60;
724*4882a593Smuzhiyun 	buf[2] = 0x00;
725*4882a593Smuzhiyun 	chip_i2c_write(client, 0x7F, buf, 3);
726*4882a593Smuzhiyun 	mdelay(10);
727*4882a593Smuzhiyun 
728*4882a593Smuzhiyun 	ret = chip_read_bus_status(client,buf);
729*4882a593Smuzhiyun 	if(buf[0]!= 0xaa)
730*4882a593Smuzhiyun 	{
731*4882a593Smuzhiyun 		printk("___i2c bus status = %x,ret = %d___\n",buf[0],ret);
732*4882a593Smuzhiyun 		return -1;
733*4882a593Smuzhiyun 	}
734*4882a593Smuzhiyun 	return 0;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun 
chip_write_infoblk(struct i2c_client * client)737*4882a593Smuzhiyun static int chip_write_infoblk(struct i2c_client *client)
738*4882a593Smuzhiyun {
739*4882a593Smuzhiyun 	//int ret = -1;
740*4882a593Smuzhiyun 	unsigned char buf[20]={0};
741*4882a593Smuzhiyun 	int cod;
742*4882a593Smuzhiyun 	unsigned int flash_addr;
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun 	DEBUG();
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	flash_addr = 0x00;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun 	// write info block 0
749*4882a593Smuzhiyun 	buf[0] = 0x00;
750*4882a593Smuzhiyun 	buf[1] = 0x61;
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun 	for ( cod = 0; cod < 16; cod++ ) {
753*4882a593Smuzhiyun 	// Flash address
754*4882a593Smuzhiyun 	// data length
755*4882a593Smuzhiyun 	buf[2] = (char)(flash_addr >> 8);
756*4882a593Smuzhiyun 	buf[3] = (char)(flash_addr & 0xFF);
757*4882a593Smuzhiyun 	buf[4] = 0x08;
758*4882a593Smuzhiyun 	if ( flash_addr == 0x0000 )
759*4882a593Smuzhiyun 	buf[6] = 0x17;
760*4882a593Smuzhiyun 	else
761*4882a593Smuzhiyun 	buf[6] = 0x00;
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun 	buf[7] = 0x00;
764*4882a593Smuzhiyun 	buf[8] = 0x00;
765*4882a593Smuzhiyun 	buf[9] = 0x00;
766*4882a593Smuzhiyun 	buf[10] = 0x00;
767*4882a593Smuzhiyun 	buf[11] = 0x00;
768*4882a593Smuzhiyun 	buf[12] = 0x00;
769*4882a593Smuzhiyun 	buf[13] = 0x00;
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun 	buf[5] = (~(buf[2]+buf[3]+buf[4]+buf[6]+buf[7]+buf[8]+buf[9]+buf[10]+buf[11]+buf[12]+buf[13]))+1;
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun 	chip_i2c_write(client, 0x7F, buf, 14);
774*4882a593Smuzhiyun 	mdelay(10);
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun 	flash_addr += 8;
777*4882a593Smuzhiyun 	}
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	return 0;
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun 
chip_trim_info_init(struct i2c_client * client)782*4882a593Smuzhiyun static int chip_trim_info_init(struct i2c_client *client)
783*4882a593Smuzhiyun {
784*4882a593Smuzhiyun 	int retry =5;
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun 	while(chip_read_infoblk(client) && (retry--))
787*4882a593Smuzhiyun 	{
788*4882a593Smuzhiyun 		chip_erase_infoblk(client);
789*4882a593Smuzhiyun 		chip_write_infoblk(client);
790*4882a593Smuzhiyun 	}
791*4882a593Smuzhiyun 	vtl_ts_hw_reset();
792*4882a593Smuzhiyun 	return 0;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun 
chip_init(void)795*4882a593Smuzhiyun int chip_init(void)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun 	struct i2c_client *client;
798*4882a593Smuzhiyun 	unsigned char chip_id = 0xff;
799*4882a593Smuzhiyun 	unsigned char retry;
800*4882a593Smuzhiyun 	int ret = 0;
801*4882a593Smuzhiyun 
802*4882a593Smuzhiyun 	DEBUG();
803*4882a593Smuzhiyun 
804*4882a593Smuzhiyun 	ts_object = vtl_ts_get_object();
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun 	if(ts_object == NULL)
807*4882a593Smuzhiyun 	{
808*4882a593Smuzhiyun 		return -1;
809*4882a593Smuzhiyun 	}
810*4882a593Smuzhiyun 	client = ts_object->driver->client;
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun 	chip = NULL;
813*4882a593Smuzhiyun 	for(retry = 0;retry<3;retry++)
814*4882a593Smuzhiyun 	{
815*4882a593Smuzhiyun 		ret = chip_get_chip_id(client,&chip_id);
816*4882a593Smuzhiyun 		printk("___chip ID = %d___cnt = %d\n",chip_id,retry);
817*4882a593Smuzhiyun 		switch(chip_id)
818*4882a593Smuzhiyun 		{
819*4882a593Smuzhiyun 			case 1:	{			//chip: CT362, CT363, CT365, CT368, CT369
820*4882a593Smuzhiyun 					chip = ct36x_cmd;
821*4882a593Smuzhiyun 					chip_trim_info_init(client);
822*4882a593Smuzhiyun 				}break;
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 			case 2:	{			//chip: CT360
825*4882a593Smuzhiyun 					chip = ct360_cmd;
826*4882a593Smuzhiyun 				}break;
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun 			case 6:	{			//chip: CT362M, CT363M, CT365M, CT368M, CT369M
829*4882a593Smuzhiyun 					chip = ct36x_cmd;
830*4882a593Smuzhiyun 				}break;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 			default : {
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun 					chip = NULL;
835*4882a593Smuzhiyun 				}
836*4882a593Smuzhiyun 		}
837*4882a593Smuzhiyun 		if(chip != NULL)
838*4882a593Smuzhiyun 		{
839*4882a593Smuzhiyun 			break;
840*4882a593Smuzhiyun 		}
841*4882a593Smuzhiyun 	}
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun 	if(chip == NULL)
844*4882a593Smuzhiyun 	{
845*4882a593Smuzhiyun 		return -1;
846*4882a593Smuzhiyun 	}
847*4882a593Smuzhiyun 
848*4882a593Smuzhiyun 	#if(CHIP_UPDATE_ENABLE)
849*4882a593Smuzhiyun 	if(chip_update(client)<0)
850*4882a593Smuzhiyun 	{
851*4882a593Smuzhiyun 		printk("___chip updata faile___\n");
852*4882a593Smuzhiyun 		return -1;
853*4882a593Smuzhiyun 	}
854*4882a593Smuzhiyun 	#endif
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	return 0;
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun 
861