2 * Functions to access the TSC2000 controller on TRAB board (used for scanning
5 * Copyright (C) 2003 Martin Krause, TQ-Systems GmbH, martin.krause@tqs.de
7 * Copyright (C) 2002 DENX Software Engineering, Wolfgang Denk, wd@denx.de
9 * See file CREDITS for list of people who contributed to this
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
31 #include "Pt1000_temp_data.h"
33 /* temperature channel multiplexer definitions */
34 #define CON_MUX0 (gpio->PCCON = (gpio->PCCON & 0x0FFFFFCFF) | 0x00000100)
35 #define CLR_MUX0 (gpio->PCDAT &= 0x0FFEF)
36 #define SET_MUX0 (gpio->PCDAT |= 0x00010)
38 #define CON_MUX1 (gpio->PCCON = (gpio->PCCON & 0x0FFFFF3FF) | 0x00000400)
39 #define CLR_MUX1 (gpio->PCDAT &= 0x0FFDF)
40 #define SET_MUX1 (gpio->PCDAT |= 0x00020)
42 #define CON_MUX1_ENABLE (gpio->PCCON = (gpio->PCCON & 0x0FFFFCFFF) | 0x00001000)
43 #define CLR_MUX1_ENABLE (gpio->PCDAT |= 0x00040)
44 #define SET_MUX1_ENABLE (gpio->PCDAT &= 0x0FFBF)
46 #define CON_MUX2_ENABLE (gpio->PCCON = (gpio->PCCON & 0x0FFFF3FFF) | 0x00004000)
47 #define CLR_MUX2_ENABLE (gpio->PCDAT |= 0x00080)
48 #define SET_MUX2_ENABLE (gpio->PCDAT &= 0x0FF7F)
50 #define CON_MUX3_ENABLE (gpio->PCCON = (gpio->PCCON & 0x0FFFCFFFF) | 0x00010000)
51 #define CLR_MUX3_ENABLE (gpio->PCDAT |= 0x00100)
52 #define SET_MUX3_ENABLE (gpio->PCDAT &= 0x0FEFF)
54 #define CON_MUX4_ENABLE (gpio->PCCON = (gpio->PCCON & 0x0FFF3FFFF) | 0x00040000)
55 #define CLR_MUX4_ENABLE (gpio->PCDAT |= 0x00200)
56 #define SET_MUX4_ENABLE (gpio->PCDAT &= 0x0FDFF)
58 #define CON_SEL_TEMP_V_0 (gpio->PCCON = (gpio->PCCON & 0x0FFCFFFFF) | 0x00100000)
59 #define CLR_SEL_TEMP_V_0 (gpio->PCDAT &= 0x0FBFF)
60 #define SET_SEL_TEMP_V_0 (gpio->PCDAT |= 0x00400)
62 #define CON_SEL_TEMP_V_1 (gpio->PCCON = (gpio->PCCON & 0x0FF3FFFFF) | 0x00400000)
63 #define CLR_SEL_TEMP_V_1 (gpio->PCDAT &= 0x0F7FF)
64 #define SET_SEL_TEMP_V_1 (gpio->PCDAT |= 0x00800)
66 #define CON_SEL_TEMP_V_2 (gpio->PCCON = (gpio->PCCON & 0x0FCFFFFFF) | 0x01000000)
67 #define CLR_SEL_TEMP_V_2 (gpio->PCDAT &= 0x0EFFF)
68 #define SET_SEL_TEMP_V_2 (gpio->PCDAT |= 0x01000)
70 #define CON_SEL_TEMP_V_3 (gpio->PCCON = (gpio->PCCON & 0x0F3FFFFFF) | 0x04000000)
71 #define CLR_SEL_TEMP_V_3 (gpio->PCDAT &= 0x0DFFF)
72 #define SET_SEL_TEMP_V_3 (gpio->PCDAT |= 0x02000)
74 /* TSC2000 register definition */
75 #define TSC2000_REG_X ((0 << 11) | (0 << 5))
76 #define TSC2000_REG_Y ((0 << 11) | (1 << 5))
77 #define TSC2000_REG_Z1 ((0 << 11) | (2 << 5))
78 #define TSC2000_REG_Z2 ((0 << 11) | (3 << 5))
79 #define TSC2000_REG_BAT1 ((0 << 11) | (5 << 5))
80 #define TSC2000_REG_BAT2 ((0 << 11) | (6 << 5))
81 #define TSC2000_REG_AUX1 ((0 << 11) | (7 << 5))
82 #define TSC2000_REG_AUX2 ((0 << 11) | (8 << 5))
83 #define TSC2000_REG_TEMP1 ((0 << 11) | (9 << 5))
84 #define TSC2000_REG_TEMP2 ((0 << 11) | (0xA << 5))
85 #define TSC2000_REG_DAC ((0 << 11) | (0xB << 5))
86 #define TSC2000_REG_ZERO ((0 << 11) | (0x10 << 5))
87 #define TSC2000_REG_ADC ((1 << 11) | (0 << 5))
88 #define TSC2000_REG_DACCTL ((1 << 11) | (2 << 5))
89 #define TSC2000_REG_REF ((1 << 11) | (3 << 5))
90 #define TSC2000_REG_RESET ((1 << 11) | (4 << 5))
91 #define TSC2000_REG_CONFIG ((1 << 11) | (5 << 5))
93 /* bit definition of TSC2000 ADC register */
94 #define TC_PSM (1 << 15)
95 #define TC_STS (1 << 14)
96 #define TC_AD3 (1 << 13)
97 #define TC_AD2 (1 << 12)
98 #define TC_AD1 (1 << 11)
99 #define TC_AD0 (1 << 10)
100 #define TC_RS1 (1 << 9)
101 #define TC_RS0 (1 << 8)
102 #define TC_AV1 (1 << 7)
103 #define TC_AV0 (1 << 6)
104 #define TC_CL1 (1 << 5)
105 #define TC_CL0 (1 << 4)
106 #define TC_PV2 (1 << 3)
107 #define TC_PV1 (1 << 2)
108 #define TC_PV0 (1 << 1)
110 /* default value for TSC2000 ADC register for use with touch functions */
111 #define DEFAULT_ADC (TC_PV1 | TC_AV0 | TC_AV1 | TC_RS0)
113 #define TSC2000_DELAY_BASE 500
114 #define TSC2000_NO_SENSOR -0x10000
116 #define ERROR_BATTERY 220 /* must be adjusted, if R68 is changed on
119 static void tsc2000_write(unsigned short, unsigned short);
120 static unsigned short tsc2000_read (unsigned short);
121 static u16 tsc2000_read_channel (unsigned int);
122 static void tsc2000_set_mux (unsigned int);
123 static void tsc2000_set_range (unsigned int);
124 void tsc2000_reg_init (void);
125 s32 tsc2000_contact_temp (void);
126 static void spi_wait_transmit_done (void);
128 static int tsc2000_interpolate(long value, long data[][2], long *result);
129 static void adc_wait_conversion_done(void);
132 static inline void SET_CS_TOUCH(void)
134 S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
136 gpio->PDDAT &= 0x5FF;
140 static inline void CLR_CS_TOUCH(void)
142 S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
144 gpio->PDDAT |= 0x200;
147 #endif /* _TSC2000_H_ */