summaryrefslogtreecommitdiff
path: root/board/trab/tsc2000.h
blob: 4f118692cb235290ef8bad2cf94feb3da737ee9e (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
/*
 * Functions to access the TSC2000 controller on TRAB board (used for scanning
 * thermo sensors)
 *
 * Copyright (C) 2003 Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
 *
 * Copyright (C) 2002 DENX Software Engineering, Wolfgang Denk, wd@denx.de
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#ifndef _TSC2000_H_
#define _TSC2000_H_

#include "Pt1000_temp_data.h"

/* temperature channel multiplexer definitions */
#define CON_MUX0         	(gpio->PCCON = (gpio->PCCON & 0x0FFFFFCFF) | 0x00000100)
#define CLR_MUX0         	(gpio->PCDAT &= 0x0FFEF)
#define SET_MUX0         	(gpio->PCDAT |= 0x00010)

#define CON_MUX1         	(gpio->PCCON = (gpio->PCCON & 0x0FFFFF3FF) | 0x00000400)
#define CLR_MUX1         	(gpio->PCDAT &= 0x0FFDF)
#define SET_MUX1         	(gpio->PCDAT |= 0x00020)

#define CON_MUX1_ENABLE  	(gpio->PCCON = (gpio->PCCON & 0x0FFFFCFFF) | 0x00001000)
#define CLR_MUX1_ENABLE  	(gpio->PCDAT |= 0x00040)
#define SET_MUX1_ENABLE  	(gpio->PCDAT &= 0x0FFBF)

#define CON_MUX2_ENABLE  	(gpio->PCCON = (gpio->PCCON & 0x0FFFF3FFF) | 0x00004000)
#define CLR_MUX2_ENABLE  	(gpio->PCDAT |= 0x00080)
#define SET_MUX2_ENABLE  	(gpio->PCDAT &= 0x0FF7F)

#define CON_MUX3_ENABLE  	(gpio->PCCON = (gpio->PCCON & 0x0FFFCFFFF) | 0x00010000)
#define CLR_MUX3_ENABLE  	(gpio->PCDAT |= 0x00100)
#define SET_MUX3_ENABLE  	(gpio->PCDAT &= 0x0FEFF)

#define CON_MUX4_ENABLE  	(gpio->PCCON = (gpio->PCCON & 0x0FFF3FFFF) | 0x00040000)
#define CLR_MUX4_ENABLE  	(gpio->PCDAT |= 0x00200)
#define SET_MUX4_ENABLE  	(gpio->PCDAT &= 0x0FDFF)

#define CON_SEL_TEMP_V_0 	(gpio->PCCON = (gpio->PCCON & 0x0FFCFFFFF) | 0x00100000)
#define CLR_SEL_TEMP_V_0 	(gpio->PCDAT &= 0x0FBFF)
#define SET_SEL_TEMP_V_0 	(gpio->PCDAT |= 0x00400)

#define CON_SEL_TEMP_V_1 	(gpio->PCCON = (gpio->PCCON & 0x0FF3FFFFF) | 0x00400000)
#define CLR_SEL_TEMP_V_1 	(gpio->PCDAT &= 0x0F7FF)
#define SET_SEL_TEMP_V_1 	(gpio->PCDAT |= 0x00800)

#define CON_SEL_TEMP_V_2 	(gpio->PCCON = (gpio->PCCON & 0x0FCFFFFFF) | 0x01000000)
#define CLR_SEL_TEMP_V_2 	(gpio->PCDAT &= 0x0EFFF)
#define SET_SEL_TEMP_V_2 	(gpio->PCDAT |= 0x01000)

#define CON_SEL_TEMP_V_3 	(gpio->PCCON = (gpio->PCCON & 0x0F3FFFFFF) | 0x04000000)
#define CLR_SEL_TEMP_V_3 	(gpio->PCDAT &= 0x0DFFF)
#define SET_SEL_TEMP_V_3 	(gpio->PCDAT |= 0x02000)

/* TSC2000 register definition */
#define TSC2000_REG_X		((0 << 11) | (0 << 5))
#define TSC2000_REG_Y		((0 << 11) | (1 << 5))
#define TSC2000_REG_Z1		((0 << 11) | (2 << 5))
#define TSC2000_REG_Z2		((0 << 11) | (3 << 5))
#define TSC2000_REG_BAT1	((0 << 11) | (5 << 5))
#define TSC2000_REG_BAT2	((0 << 11) | (6 << 5))
#define TSC2000_REG_AUX1	((0 << 11) | (7 << 5))
#define TSC2000_REG_AUX2	((0 << 11) | (8 << 5))
#define TSC2000_REG_TEMP1	((0 << 11) | (9 << 5))
#define TSC2000_REG_TEMP2	((0 << 11) | (0xA << 5))
#define TSC2000_REG_DAC		((0 << 11) | (0xB << 5))
#define TSC2000_REG_ZERO	((0 << 11) | (0x10 << 5))
#define TSC2000_REG_ADC		((1 << 11) | (0 << 5))
#define TSC2000_REG_DACCTL	((1 << 11) | (2 << 5))
#define TSC2000_REG_REF		((1 << 11) | (3 << 5))
#define TSC2000_REG_RESET	((1 << 11) | (4 << 5))
#define TSC2000_REG_CONFIG	((1 << 11) | (5 << 5))

/* bit definition of TSC2000 ADC register */
#define TC_PSM          (1 << 15)
#define TC_STS          (1 << 14)
#define TC_AD3          (1 << 13)
#define TC_AD2          (1 << 12)
#define TC_AD1          (1 << 11)
#define TC_AD0          (1 << 10)
#define TC_RS1          (1 << 9)
#define TC_RS0          (1 << 8)
#define TC_AV1          (1 << 7)
#define TC_AV0          (1 << 6)
#define TC_CL1          (1 << 5)
#define TC_CL0          (1 << 4)
#define TC_PV2          (1 << 3)
#define TC_PV1          (1 << 2)
#define TC_PV0          (1 << 1)

/* default value for TSC2000 ADC register for use with touch functions */
#define DEFAULT_ADC		(TC_PV1 | TC_AV0 | TC_AV1 | TC_RS0)

#define TSC2000_DELAY_BASE	500
#define TSC2000_NO_SENSOR	-0x10000

#define ERROR_BATTERY   220     /* must be adjusted, if R68 is changed on
                                 * TRAB */

static void tsc2000_write(unsigned short, unsigned short);
static unsigned short tsc2000_read (unsigned short);
static u16 tsc2000_read_channel (unsigned int);
static void tsc2000_set_mux (unsigned int);
static void tsc2000_set_range (unsigned int);
void tsc2000_reg_init (void);
s32 tsc2000_contact_temp (void);
static void spi_wait_transmit_done (void);
void spi_init(void);
static int tsc2000_interpolate(long value, long data[][2], long *result);
static void adc_wait_conversion_done(void);


static inline void SET_CS_TOUCH(void)
{
	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

	gpio->PDDAT &= 0x5FF;
}


static inline void CLR_CS_TOUCH(void)
{
	S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

	gpio->PDDAT |= 0x200;
}

#endif	/* _TSC2000_H_ */