xref: /OK3568_Linux_fs/kernel/drivers/input/touchscreen/elan/elan_tool.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * ELAN HID-I2C TouchScreen driver.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2014 Elan Microelectronics Corporation.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Chuming Zhang <chuming.zhang@elanic.com.cn>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "elan_ts.h"
11*4882a593Smuzhiyun #include <linux/of_gpio.h>
12*4882a593Smuzhiyun #include <linux/buffer_head.h>
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun #include <linux/irq.h>
15*4882a593Smuzhiyun #include <linux/interrupt.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define IntToASCII(c)   (c)>9?((c)+0x37):((c)+0x30)
18*4882a593Smuzhiyun 
store_disable_irq(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)19*4882a593Smuzhiyun static ssize_t store_disable_irq(struct device *dev,
20*4882a593Smuzhiyun 		struct device_attribute *attr,
21*4882a593Smuzhiyun 		const char *buf, size_t count)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
24*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
25*4882a593Smuzhiyun /*
26*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
27*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
28*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
29*4882a593Smuzhiyun 	}
30*4882a593Smuzhiyun */
31*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
32*4882a593Smuzhiyun 	dev_info(&client->dev, "Disable IRQ.\n");
33*4882a593Smuzhiyun 	return count;
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun static DEVICE_ATTR(disable_irq, S_IWUSR, NULL, store_disable_irq);
36*4882a593Smuzhiyun 
store_enable_irq(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)37*4882a593Smuzhiyun static ssize_t store_enable_irq(struct device *dev,
38*4882a593Smuzhiyun 		struct device_attribute *attr,
39*4882a593Smuzhiyun 		const char *buf, size_t count)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
42*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
43*4882a593Smuzhiyun 	/*
44*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
45*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
46*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
47*4882a593Smuzhiyun 	}
48*4882a593Smuzhiyun 	*/
49*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
50*4882a593Smuzhiyun 	dev_info(&client->dev, "Enable IRQ.\n");
51*4882a593Smuzhiyun 	return count;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun static DEVICE_ATTR(enable_irq, S_IWUSR, NULL, store_enable_irq);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 
store_reset(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)56*4882a593Smuzhiyun static ssize_t store_reset(struct device *dev,
57*4882a593Smuzhiyun 		struct device_attribute *attr,
58*4882a593Smuzhiyun 		const char *buf, size_t count)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
61*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	elan_ts_hw_reset(&ts->hw_info);
64*4882a593Smuzhiyun 	dev_info(&client->dev,
65*4882a593Smuzhiyun 			"Reset Touch Screen Controller!\n");
66*4882a593Smuzhiyun 	return count;
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun static DEVICE_ATTR(reset, S_IWUSR, NULL, store_reset);
69*4882a593Smuzhiyun 
show_gpio_int(struct device * dev,struct device_attribute * attr,char * buf)70*4882a593Smuzhiyun static ssize_t show_gpio_int(struct device *dev,
71*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
74*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	return sprintf(buf, "%d\n",
77*4882a593Smuzhiyun 			gpio_get_value(ts->hw_info.intr_gpio));
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun static DEVICE_ATTR(gpio_int, S_IRUGO, show_gpio_int, NULL);
80*4882a593Smuzhiyun 
store_calibrate(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)81*4882a593Smuzhiyun static ssize_t store_calibrate(struct device *dev,
82*4882a593Smuzhiyun 		struct device_attribute *attr,
83*4882a593Smuzhiyun 		const char *buf, size_t count)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
86*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
87*4882a593Smuzhiyun 	int ret = 0;
88*4882a593Smuzhiyun /*
89*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
90*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
91*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
92*4882a593Smuzhiyun 	}
93*4882a593Smuzhiyun */
94*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
95*4882a593Smuzhiyun 	ret = elan_ts_calibrate(client);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	if (ret == 0)
98*4882a593Smuzhiyun 		dev_info(&client->dev, "ELAN CALIBRATE Success\n");
99*4882a593Smuzhiyun 	else
100*4882a593Smuzhiyun 		dev_err(&client->dev, "ELAN CALIBRATE Fail\n");
101*4882a593Smuzhiyun /*
102*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
103*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
104*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
105*4882a593Smuzhiyun 	}
106*4882a593Smuzhiyun */
107*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
108*4882a593Smuzhiyun 	return count;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun static DEVICE_ATTR(calibrate, S_IWUSR, NULL, store_calibrate);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 
store_check_rek(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)113*4882a593Smuzhiyun static ssize_t store_check_rek(struct device *dev,
114*4882a593Smuzhiyun 		struct device_attribute *attr,
115*4882a593Smuzhiyun 		const char *buf, size_t count)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
118*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
119*4882a593Smuzhiyun 	int ret = 0;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /*
122*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
123*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
124*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
125*4882a593Smuzhiyun 	}
126*4882a593Smuzhiyun */
127*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
128*4882a593Smuzhiyun 	ret = elan_ts_check_calibrate(client);
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 	if (ret)
131*4882a593Smuzhiyun 		dev_err(&client->dev, "ELAN CALIBRATE CHECK Fail\n");
132*4882a593Smuzhiyun 	else
133*4882a593Smuzhiyun 		dev_info(&client->dev, "ELAN CHECK CALIBRATE Success\n");
134*4882a593Smuzhiyun /*
135*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
136*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
137*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
138*4882a593Smuzhiyun 	}
139*4882a593Smuzhiyun */
140*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
141*4882a593Smuzhiyun 	return count;
142*4882a593Smuzhiyun }
143*4882a593Smuzhiyun static DEVICE_ATTR(check_rek, S_IWUSR, NULL, store_check_rek);
144*4882a593Smuzhiyun 
show_fw_info(struct device * dev,struct device_attribute * attr,char * buf)145*4882a593Smuzhiyun static ssize_t show_fw_info(struct device *dev,
146*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
149*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	return sprintf(buf, "FW VER = 0x%04x, FW ID = 0x%04x, BC VER = 0x%04x, tx:rx = %d:%d\n",\
152*4882a593Smuzhiyun 			ts->fw_info.fw_ver, ts->fw_info.fw_id, ts->fw_info.fw_bcv, ts->fw_info.tx, ts->fw_info.rx);
153*4882a593Smuzhiyun }
store_fw_info(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)154*4882a593Smuzhiyun static ssize_t store_fw_info(struct device *dev,
155*4882a593Smuzhiyun 		struct device_attribute *attr,
156*4882a593Smuzhiyun 		const char *buf, size_t count)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
159*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
162*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
163*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
164*4882a593Smuzhiyun 	}
165*4882a593Smuzhiyun */
166*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	elan__fw_packet_handler(ts->client);
169*4882a593Smuzhiyun /*
170*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
171*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
172*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
173*4882a593Smuzhiyun 	}
174*4882a593Smuzhiyun */
175*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	return count;
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun static DEVICE_ATTR(fw_info, S_IWUSR | S_IRUSR, show_fw_info, store_fw_info);
180*4882a593Smuzhiyun 
store_iap_status(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)181*4882a593Smuzhiyun static ssize_t store_iap_status(struct device *dev,
182*4882a593Smuzhiyun 		struct device_attribute *attr,
183*4882a593Smuzhiyun 		const char *buf, size_t count)
184*4882a593Smuzhiyun {
185*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
186*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
187*4882a593Smuzhiyun /*
188*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
189*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
190*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
191*4882a593Smuzhiyun 	}
192*4882a593Smuzhiyun */
193*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
194*4882a593Smuzhiyun 	elan_ts_hw_reset(&ts->hw_info);
195*4882a593Smuzhiyun 	mdelay(200);
196*4882a593Smuzhiyun 	elan__hello_packet_handler(client, ts->chip_type);
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /*
199*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
200*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
201*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
202*4882a593Smuzhiyun 	}
203*4882a593Smuzhiyun */
204*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
205*4882a593Smuzhiyun 	return count;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun 
show_iap_status(struct device * dev,struct device_attribute * attr,char * buf)208*4882a593Smuzhiyun static ssize_t show_iap_status(struct device *dev,
209*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
213*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	return sprintf(buf, "IAP STATUS = %s\n",(ts->recover < 0 ? "UNKNOW":(ts->recover == 0x01 ? "RECOVERY":"NORMAL")));
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun static DEVICE_ATTR(iap_status, S_IWUSR | S_IRUSR, show_iap_status, store_iap_status);
218*4882a593Smuzhiyun 
store_fw_upgrade(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)219*4882a593Smuzhiyun static ssize_t store_fw_upgrade(struct device *dev,
220*4882a593Smuzhiyun 		struct device_attribute *attr,
221*4882a593Smuzhiyun 		const char *buf, size_t count)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
224*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
225*4882a593Smuzhiyun /*
226*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
227*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
228*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
229*4882a593Smuzhiyun 	}
230*4882a593Smuzhiyun */
231*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
232*4882a593Smuzhiyun //	elan_get_vendor_fw(ts,ts->fw_store_type);
233*4882a593Smuzhiyun 	// elan_FW_Update(ts->client);
234*4882a593Smuzhiyun 	elan_check_update_flage(ts);
235*4882a593Smuzhiyun /*
236*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
237*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
238*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
239*4882a593Smuzhiyun 	}
240*4882a593Smuzhiyun */
241*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
242*4882a593Smuzhiyun 	return count;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun static DEVICE_ATTR(fw_update, S_IWUSR, NULL,  store_fw_upgrade);
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun 
show_fw_store(struct device * dev,struct device_attribute * attr,char * buf)247*4882a593Smuzhiyun static ssize_t show_fw_store(struct device *dev,
248*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
251*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	if (ts->fw_store_type > -1 && ts->fw_store_type < 3) {
254*4882a593Smuzhiyun 		return sprintf(buf, "FW STORE = %s\n",\
255*4882a593Smuzhiyun 				(ts->fw_store_type == FROM_SYS_ETC_FIRMWARE ? "/system/etc/firmware/elants_i2c.ekt":\
256*4882a593Smuzhiyun 				(ts->fw_store_type == FROM_SDCARD_FIRMWARE ? "/data/local/tmp/elants_i2c.ekt":"build in driver")));
257*4882a593Smuzhiyun 	} else {
258*4882a593Smuzhiyun 		return  sprintf(buf, "FW STORE TYPE OUT OF RANGE\n");
259*4882a593Smuzhiyun 	}
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 
store_fw_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)263*4882a593Smuzhiyun static ssize_t store_fw_store(struct device *dev,
264*4882a593Smuzhiyun 		struct device_attribute *attr,
265*4882a593Smuzhiyun 		const char *buf, size_t count)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
269*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
270*4882a593Smuzhiyun 	int type;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	sscanf(buf,"%d",&type);
273*4882a593Smuzhiyun 	if (type > -1 && type < 3) {
274*4882a593Smuzhiyun 		ts->fw_store_type = type;
275*4882a593Smuzhiyun 	} else {
276*4882a593Smuzhiyun 		dev_info(&client->dev, "[elan] fw store type out of range!!!\n");
277*4882a593Smuzhiyun 	}
278*4882a593Smuzhiyun 	return count;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun static DEVICE_ATTR(fw_store, S_IWUSR | S_IRUSR, show_fw_store, store_fw_store);
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun #if 0
284*4882a593Smuzhiyun static ssize_t store_tp_module_test(struct device *dev,
285*4882a593Smuzhiyun 		struct device_attribute *attr,
286*4882a593Smuzhiyun 		const char *buf, size_t count)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
290*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
291*4882a593Smuzhiyun 	int ret = 0;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	ret = elan_tp_module_test(ts);
294*4882a593Smuzhiyun 	return count;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun static DEVICE_ATTR(elan_tp_module_test, S_IWUSR, NULL,  store_tp_module_test);
297*4882a593Smuzhiyun #endif
store_tp_print_level(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)298*4882a593Smuzhiyun static ssize_t store_tp_print_level(struct device *dev,
299*4882a593Smuzhiyun 		struct device_attribute *attr,
300*4882a593Smuzhiyun 		const char *buf, size_t count)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	int level = 0;
303*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
304*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	sscanf(buf, "%x", &level);
307*4882a593Smuzhiyun 	ts->level = level;
308*4882a593Smuzhiyun 	return count;
309*4882a593Smuzhiyun }
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 
show_tp_print_level(struct device * dev,struct device_attribute * attr,char * buf)312*4882a593Smuzhiyun static ssize_t show_tp_print_level(struct device *dev,
313*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
316*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	return sprintf(buf, "PRINT LEVEL = %s\n",\
319*4882a593Smuzhiyun 			(ts->level == TP_DEBUG ? "DEBUG":(ts->level == TP_INFO ? "INFO" : (ts->level == TP_WARNING ?"WARNING":"ERROR"))));
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun static DEVICE_ATTR(tp_print_level, S_IWUSR | S_IRUSR, show_tp_print_level, store_tp_print_level);
322*4882a593Smuzhiyun 
store_tp_cmd_send(struct device * dev,struct device_attribute * attr,const char * buf,size_t count)323*4882a593Smuzhiyun static ssize_t store_tp_cmd_send(struct device *dev,
324*4882a593Smuzhiyun 		struct device_attribute *attr,
325*4882a593Smuzhiyun 		const char *buf, size_t count)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	int valid_size = 0;
329*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
330*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
331*4882a593Smuzhiyun 	char cmd[37] = {0x04, 0x00, 0x23, 0x00, 0x03};
332*4882a593Smuzhiyun 	int ret = 0;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	sscanf(buf, "%d:%x:%x:%x:%x:%x:%x:%x:%x", &valid_size,\
335*4882a593Smuzhiyun 		(int *)&cmd[5], (int *)&cmd[6], (int *)&cmd[7], (int *)&cmd[8],\
336*4882a593Smuzhiyun 		(int *)&cmd[9], (int *)&cmd[10], (int *)&cmd[11], (int *)&cmd[12]);
337*4882a593Smuzhiyun /*
338*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 0) {
339*4882a593Smuzhiyun 		disable_irq(ts->hw_info.irq_num);
340*4882a593Smuzhiyun 		ts->irq_lock_flag = 1;
341*4882a593Smuzhiyun 	}
342*4882a593Smuzhiyun */
343*4882a593Smuzhiyun 	elan_switch_irq(ts, 0);
344*4882a593Smuzhiyun 	dev_info(&client->dev, "cmd: %x:%x:%x:%x:%x:%x:%x:%x\n",cmd[5],cmd[6],cmd[7],cmd[8],cmd[9],cmd[10],cmd[11],cmd[12]);
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	if (ts->chip_type == HID_TYPE_PROTOCOL) {
348*4882a593Smuzhiyun 		ret = ts->ops->send(cmd, sizeof(cmd));
349*4882a593Smuzhiyun 		if (ret != sizeof(cmd))
350*4882a593Smuzhiyun 			dev_err(&client->dev, "send cmd failed %d:%ld\n", ret, sizeof(cmd));
351*4882a593Smuzhiyun 	} else {
352*4882a593Smuzhiyun 		ret = ts->ops->send(&cmd[7], valid_size);
353*4882a593Smuzhiyun 		if (ret != valid_size)
354*4882a593Smuzhiyun 			dev_err(&client->dev, "send cmd failed %d:%d\n",ret, valid_size);
355*4882a593Smuzhiyun 	}
356*4882a593Smuzhiyun 	return count;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun 
show_tp_cmd_recv(struct device * dev,struct device_attribute * attr,char * buf)359*4882a593Smuzhiyun static ssize_t show_tp_cmd_recv(struct device *dev,
360*4882a593Smuzhiyun 		struct device_attribute *attr, char *buf)
361*4882a593Smuzhiyun {
362*4882a593Smuzhiyun 	struct i2c_client *client = to_i2c_client(dev);
363*4882a593Smuzhiyun 	struct elan_ts_data *ts = i2c_get_clientdata(client);
364*4882a593Smuzhiyun 	uint8_t rbuf[67] = {0x00};
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	int i = 0;
367*4882a593Smuzhiyun 	char c1;
368*4882a593Smuzhiyun 	char out[1024];
369*4882a593Smuzhiyun 	int shift = 0;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	while(!ts->ops->poll()) {
372*4882a593Smuzhiyun 		ts->ops->recv(rbuf, 67);
373*4882a593Smuzhiyun 		dev_info(&client->dev, "rbuf: %x:%x:%x:%x:%x:%x:%x:%x\n",
374*4882a593Smuzhiyun 			 rbuf[1],rbuf[2],rbuf[3],rbuf[4],rbuf[5],rbuf[6],rbuf[7],rbuf[8]);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 		for(i = 0; i < sizeof(rbuf); i++) {
377*4882a593Smuzhiyun 			c1 = rbuf[i] & 0xF0;
378*4882a593Smuzhiyun 			out[3 * i + 0 + shift] = IntToASCII(c1 >> 4);
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun 			c1 = rbuf[i]&0x0F;
381*4882a593Smuzhiyun 			out[3 * i + 1 + shift] = IntToASCII(c1);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 			if((i %7 ==0) && (i !=0)) {
384*4882a593Smuzhiyun 				out[3 * i + 2 + shift] = 0x0A;//'\n' = 0x0A;
385*4882a593Smuzhiyun 			} else {
386*4882a593Smuzhiyun 				out[3 * i + 2 + shift] = 0x20;//space = 0x20;
387*4882a593Smuzhiyun 			}
388*4882a593Smuzhiyun 		}
389*4882a593Smuzhiyun 		printk("%s\n", out);
390*4882a593Smuzhiyun 		sprintf(buf + strlen(buf), "%s\n", out+shift);
391*4882a593Smuzhiyun 		shift += 3 * i;
392*4882a593Smuzhiyun 	}
393*4882a593Smuzhiyun 	/*
394*4882a593Smuzhiyun 	if (ts->irq_lock_flag == 1) {
395*4882a593Smuzhiyun 		enable_irq(ts->hw_info.irq_num);
396*4882a593Smuzhiyun 		ts->irq_lock_flag = 0;
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 	*/
399*4882a593Smuzhiyun 	elan_switch_irq(ts, 1);
400*4882a593Smuzhiyun 	return strlen(buf);
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun static DEVICE_ATTR(raw_cmd, S_IWUSR | S_IRUSR, show_tp_cmd_recv, store_tp_cmd_send);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun static struct attribute *elan_default_attributes[] = {
407*4882a593Smuzhiyun 	&dev_attr_enable_irq.attr,
408*4882a593Smuzhiyun 	&dev_attr_disable_irq.attr,
409*4882a593Smuzhiyun 	&dev_attr_gpio_int.attr,
410*4882a593Smuzhiyun 	&dev_attr_reset.attr,
411*4882a593Smuzhiyun 	&dev_attr_calibrate.attr,
412*4882a593Smuzhiyun 	&dev_attr_check_rek.attr,
413*4882a593Smuzhiyun 	&dev_attr_fw_info.attr,
414*4882a593Smuzhiyun 	&dev_attr_iap_status.attr,
415*4882a593Smuzhiyun 	&dev_attr_fw_update.attr,
416*4882a593Smuzhiyun 	&dev_attr_fw_store.attr,
417*4882a593Smuzhiyun //	&dev_attr_tp_module_test.attr,
418*4882a593Smuzhiyun 	&dev_attr_tp_print_level.attr,
419*4882a593Smuzhiyun 	&dev_attr_raw_cmd.attr,
420*4882a593Smuzhiyun 	NULL
421*4882a593Smuzhiyun };
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun static struct attribute_group elan_default_attribute_group = {
424*4882a593Smuzhiyun 	.name = "elan_ktf",
425*4882a593Smuzhiyun 	.attrs = elan_default_attributes,
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun 
elan_sysfs_attri_file(struct elan_ts_data * ts)428*4882a593Smuzhiyun int elan_sysfs_attri_file(struct elan_ts_data *ts)
429*4882a593Smuzhiyun {
430*4882a593Smuzhiyun 	int err = 0;
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun 	err = sysfs_create_group(&ts->client->dev.kobj, &elan_default_attribute_group);
433*4882a593Smuzhiyun 	if ( err ) {
434*4882a593Smuzhiyun 		dev_err(&ts->client->dev, "[elan] %s sysfs create group error\n",__func__);
435*4882a593Smuzhiyun 	} else {
436*4882a593Smuzhiyun 		dev_err(&ts->client->dev,"[elan] %s sysfs create group success\n",__func__);
437*4882a593Smuzhiyun 	}
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	return err;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
elan_sysfs_attri_file_remove(struct elan_ts_data * ts)442*4882a593Smuzhiyun void elan_sysfs_attri_file_remove(struct elan_ts_data *ts)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	 sysfs_remove_group(&ts->client->dev.kobj, &elan_default_attribute_group);
445*4882a593Smuzhiyun }
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 
448*4882a593Smuzhiyun 
449