summaryrefslogtreecommitdiff
path: root/drivers/input/touchscreen/vt1609_ts/vt1609_ts.h
blob: 3121057936af6e572a049e06adb7806844adeb87 (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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
#ifndef __VT1603_TS_H__
#define __VT1603_TS_H__
#include <linux/mfd/vt1603/core.h>
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif

#define DEV_NAME  				"wmtts"
#define VT1603_DRIVER_NAME  	"vt1603-touch"

#undef abs
#define abs(x) (((x)>0)?(x):(-(x)))

#define FALSE 						0
#define TRUE   						1
#define VT1603_TS_NR_DEVS     		1
#define VT1603_TS_DEV_MAJOR   		160
#define TS_DEBOUNCE    				50
#define VT1603_FILTER_HEAD_COUNT 	2
#define VT1603_JITTER_THRESHOLD 	1200//单点前后2点之间的x/y 变化最大容许值

#define None_TOUCH  				0x00
#define Single_TOUCH 				0x01
#define Multi_TOUCH 				0x02

#define ADC_DATA(low, high)  		((((high) & 0x0F) << 8) + (low))

/* touch panel type config   */
#define PANEL_TYPE_4WIRED     	0x10
#define PANEL_TYPE_5WIRED     	0x11

/* enable calibration or not */
#define CALIBRATION_ENABLE    	0x01
#define CALIBRATION_DISABLE   	0x00

/* VT1603 working mode       */
#define VT1603_TS_MODE      	BIT1
#define VT1603_TEMP_MODE    	BIT2
#define VT1603_BAT_MODE     	BIT3

/* VT1603 touch panel state  */
#define TS_PENDOWN_STATE     	0x00
#define TS_PENUP_STATE       	0x01

struct vt1603_ts_pos {
    int x;
    int y;
};

#define VT1603_FIFO_LEN 		3
struct vt1603_fifo{
	int head;
	int full;
	int buf[VT1603_FIFO_LEN];
};

#define I2C_BUS					0x00
#define SPI_BUS					0x01

#define VT1603_SPI_FIX_CS   	0x00
#define VT1603_SPI_FAKE_CS  	0x03
#define VT1603_SPI_BUS_0    	0x00
#define VT1603_SPI_BUS_1    	0x01
#define VT1603_MAX_SPI_CLK    	(20*1000*1000)
#define SPI_DEFAULT_CLK       	(4*1000*1000)  
#define IDLE_DATA_NUM         	5

#define  VT1603_I2C_FIX_ADDR  	0x1A
#define  VT1603_I2C_FAKE_ADDR 	0xFF
#define  VT1603_TS_I2C_WCMD   	0x00
#define  VT1603_TS_I2C_RCMD   	0x01
#define  VT1603_TS_I2C_RWCMD  	0x02
#define VT1603_I2C_BUS_0     	0x00
#define VT1603_I2C_BUS_1     	0x01

///////////////////////////////
//#define TOUCH_KEY
#define KEY_DETLA 				300
#define TOUCH_KEY_NUM 			4
#define TOUCH_KEY_LED_GPIO 	    4

#define HIGH	1
#define LOW		0

struct tsc_key{
	int pos;
	int idx;
};

struct tsc_key_st{
	int key_num;
	int low;
	int upper;
    int delta;
	struct tsc_key key[TOUCH_KEY_NUM];
};

enum key_idx{
	_SEARCH,
	_BACK,
	_HOME,
	_MENU,
	_MAX_NUM,
};
/////////////////////////

enum gpio_irq_type {
      HIGH_ACTIVE         		= 0,
      LOW_ACTIVE          		= 1,
      RISING_EDGE_ACTIVE  	    = 3,
      FALLING_EDGE_ACTIVE 	    = 4,
      UNKOWN_TYPE         		= 0xFF
};

/*
 * vt1603_ts_platform_data - vt1603 configuration data
 * @panel_type:           touch panel type: 4-wired or 5-wired
 * @cal_en:                 enable calibration circuit or not
 * @cal_sel:                 calibratin capacitor control bits
 * @shfit:                    conversion data shfit
 * @sclk_div:               initial value of sclk dividor if mclk = 12.288MHZ 0x04 = 200ksps 0x08 = 100ksps
 * @soc_gpio_irq:         soc gpio interrupts, connect with vt1603 gpio1
 */
struct vt1603_ts_platform_data {
    u8 panel_type;
    u8 cal_en;
    u8 cal_sel:2;
    u8 shift;
    u8 sclk_div;
    int soc_gpio_irq;
    int gpio_num;
    enum gpio_irq_type irq_type;
};

struct vt1609_dual_st{
	int vxy;

	int scale_x;
	int scale_y;

	int F1_CNT;
	int F2_CNT;
	int F2T1_CNT;
	int SAMPLE_CNT;
	
	int THR_MIN_DX;
	int THR_MAX_DX;

    int exch;
};

struct vt1603_ts_drvdata {
    struct vt1603 *tdev;
    //spinlock_t spinlock;
    struct mutex ts_mutex;
    struct input_dev *input;
    struct work_struct work;
    struct delayed_work read_work;
    struct delayed_work dual_work;
    struct workqueue_struct *workqueue;
    struct vt1603_ts_platform_data *pdata;

    int earlysus;
#ifdef CONFIG_HAS_EARLYSUSPEND
    struct early_suspend earlysuspend;
#endif
    char dev_id[32];

    struct cdev cdev;
    int major;
    int minor;
	
    int gpio_irq;
    
    int intgpio;

    u8 pen_state;
    int ts_stamp;
    int hcnt;

    int resl_x;
    int resl_y;
	int lcd_exchg;
	
    int raw_x;
    int raw_y;

    int dual_enable;
    struct vt1609_dual_st dual_dev;

    int ledgpio;
#ifdef TOUCH_KEY
    int key_idx;
    int key_pressed;
    int touch_key_used;
    struct timer_list led_timer;
    struct tsc_key_st tsc_key;
#endif

};

/* VT1603 Register address */
#define VT1603_BTHD_REG       	0x78
#define VT1603_BCLK_REG       	0x88
#define VT1603_BAEN_REG       	0x04

#define VT1603_PWC_REG        	0xC0
#define VT1603_CR_REG         	0xC1
#define VT1603_CCCR_REG       	0xC2
#define VT1603_CDPR_REG       	0xC3
#define VT1603_TSPC_REG       	0xC4
#define VT1603_AMCR_REG       	0xC7
#define VT1603_INTCR_REG      	0xC8
#define VT1603_INTEN_REG      	0xC9
#define VT1603_INTS_REG       	0xCA
#define VT1603_DCR_REG        	0xCB

#define VT1603_TODCL_REG      	0xCC
#define VT1603_TODCH_REG      	0xCD

#define VT1603_DATL_REG       	0xCE
#define VT1603_DATH_REG       	0xCF

#define VT1603_XPL_REG        	0xD0
#define VT1603_XPH_REG        	0xD1
#define VT1603_YPL_REG        	0xD2
#define VT1603_YPH_REG        	0xD3

#define VT1603_BATL_REG       	0xD4
#define VT1603_BATH_REG       	0xD5

#define VT1603_TEMPL_REG      	0xD6
#define VT1603_TEMPH_REG      	0xD7

#define VT1603_ERR8_REG       	0xD8
#define VT1603_ERR7_REG       	0xD9
#define VT1603_ERR6_REG       	0xDA
#define VT1603_ERR5_REG       	0xDB
#define VT1603_ERR4_REG       	0xDC
#define VT1603_ERR3_REG       	0xDD
#define VT1603_ERR2_REG       	0xDE
#define VT1603_ERR1_REG       	0xDF

#define VT1603_DBG8_REG       	0xE0
#define VT1603_DBG7_REG       	0xE1
#define VT1603_DBG6_REG       	0xE2
#define VT1603_DBG5_REG       	0xE3
#define VT1603_DBG4_REG       	0xE4
#define VT1603_DBG3_REG       	0xE5
#define VT1603_DBG2_REG       	0xE6
#define VT1603_DBG1_REG       	0xE7

/* for VT1603 GPIO1 interrupt setting */
#define VT1603_IMASK_REG27    	27
#define VT1603_IMASK_REG28    	28
#define VT1603_IMASK_REG29    	29
#define VT1603_IPOL_REG33     	33
#define VT1603_ISEL_REG36     	36

struct vt1603_ts_cal_info {
    int   a1;
    int   b1;
    int   c1;
    int   a2;
    int   b2;
    int   c2;
    int   delta;
};

/* VT1603 TS and SAR-ADC IOCTL   */
#define VT1603_TS_IOC_MAGIC  	't'

/* for touch screen calibration  */
#define VT1603_TS_IOC_CAL_START      	_IO(VT1603_TS_IOC_MAGIC,  1)
#define VT1603_TS_IOC_CAL_DONE       	_IOW(VT1603_TS_IOC_MAGIC, 2, int *)
#define VT1603_TS_IOC_CAL_RAWDATA    	_IOR(VT1603_TS_IOC_MAGIC, 3, int *)
#define VT1603_TS_IOC_CAL_QUIT       	_IOW(VT1603_TS_IOC_MAGIC, 4, int *)

extern int wmt_setsyspara(char *varname, unsigned char *varval);
extern int wmt_getsyspara(char *varname, unsigned char *varval, int *varlenex);

int vt1603_clr_ts_irq(struct vt1603_ts_drvdata *ts_drv, u8 mask);
int vt1603_set_reg8(struct vt1603_ts_drvdata *ts_drv, u8 reg, u8 val);
u8 vt1603_get_reg8(struct vt1603_ts_drvdata *ts_drv, u8 reg);
void vt1603_setbits(struct vt1603_ts_drvdata *ts_drv, u8 reg, u8 mask);
void vt1603_clrbits(struct vt1603_ts_drvdata *ts_drv, u8 reg, u8 mask);

void vt1603_ts_report_pos(struct vt1603_ts_drvdata *ts_drv, struct vt1603_ts_pos *pos);
int vt1603_ts_pos_calibration(struct vt1603_ts_drvdata *ts_drv,struct vt1603_ts_pos *to_cal);

#ifdef TOUCH_KEY
void vt1603_ts_report_key(struct vt1603_ts_drvdata *ts_drv);
int vt1603_ts_get_key(struct vt1603_ts_drvdata *ts_drv,struct vt1603_ts_pos pos);
int set_key_led_gpio(struct vt1603_ts_drvdata *ts_drv,int val);
#endif

int vt1603_dual_init(struct vt1603_ts_drvdata *ts_drv);
void vt1603_dual_exit(struct vt1603_ts_drvdata *ts_drv);
void vt1603_ts_dual_support(struct work_struct* work);

#endif  /* __VT1603_TS_H__ */