6 #include <linux/module.h>
7 #include <linux/kernel.h>
8 #include <linux/init.h>
10 #include <linux/interrupt.h>
11 #include <linux/platform_device.h>
12 #include <linux/device.h>
13 #include <linux/input.h>
16 #include <mach/irqs.h>
17 #include <asm/system.h>
19 #include <linux/delay.h>
20 #include <mach/regs-gpio.h>
22 #include "s5pc210_ts_gpio_i2c.h"
23 #include "s5pc210_ts.h"
25 #define GPD1CON (S5P_VA_GPIO + 0xC0)
26 #define GPD1DAT (S5P_VA_GPIO + 0xC4)
29 /* Touch I2C Address Define */
30 #define TOUCH_WR_ADDR 0xB8
31 #define TOUCH_RD_ADDR 0xB9
33 /* Touch I2C Port define */
34 #define GPIO_I2C_SDA_CON_PORT (*(unsigned long *)GPD1CON)
35 #define GPIO_I2C_SDA_DAT_PORT (*(unsigned long *)GPD1DAT)
36 #define GPIO_SDA_PIN 0
38 #define GPIO_I2C_CLK_CON_PORT (*(unsigned long *)GPD1CON)
39 #define GPIO_I2C_CLK_DAT_PORT (*(unsigned long *)GPD1DAT)
40 #define GPIO_CLK_PIN 1
42 #define DELAY_TIME 5 // us value
43 #define PORT_CHANGE_DELAY_TIME 5
44 #define GPIO_CON_PORT_MASK 0xF
45 #define GPIO_CON_PORT_OFFSET 0x4
47 #define GPIO_CON_INPUT 0x0
48 #define GPIO_CON_OUTPUT 0x1
53 /* debug enable flag */
54 //#define DEBUG_GPIO_I2C
56 * static function prototype
58 static void gpio_i2c_sda_port_control (unsigned char inout);
59 static void gpio_i2c_clk_port_control (unsigned char inout);
61 static unsigned char gpio_i2c_get_sda (void);
62 static void gpio_i2c_set_sda (unsigned char hi_lo);
63 static void gpio_i2c_set_clk (unsigned char hi_lo);
65 static void gpio_i2c_start (void);
66 static void gpio_i2c_stop (void);
68 static void gpio_i2c_send_ack (void);
69 static void gpio_i2c_send_noack (void);
70 static unsigned char gpio_i2c_chk_ack (void);
72 static void gpio_i2c_byte_write (unsigned char wdata);
73 static void gpio_i2c_byte_read (unsigned char *rdata);
75 /* extern function prototype */
76 int s5pv310_ts_write(unsigned char addr, unsigned char *wdata, unsigned char wsize);
77 int s5pv310_ts_read(unsigned char *rdata, unsigned char rsize);
78 void s5pv310_ts_port_init(void);
80 static void gpio_i2c_sda_port_control(unsigned char inout)
82 GPIO_I2C_SDA_CON_PORT &= (unsigned long)(~(GPIO_CON_PORT_MASK << (GPIO_SDA_PIN * GPIO_CON_PORT_OFFSET)));
83 GPIO_I2C_SDA_CON_PORT |= (unsigned long)( (inout << (GPIO_SDA_PIN * GPIO_CON_PORT_OFFSET)));
86 static void gpio_i2c_clk_port_control(unsigned char inout)
88 GPIO_I2C_CLK_CON_PORT &= (unsigned long)(~(GPIO_CON_PORT_MASK << (GPIO_CLK_PIN * GPIO_CON_PORT_OFFSET)));
89 GPIO_I2C_CLK_CON_PORT |= (unsigned long)( (inout << (GPIO_CLK_PIN * GPIO_CON_PORT_OFFSET)));
92 static unsigned char gpio_i2c_get_sda(void)
94 return GPIO_I2C_SDA_DAT_PORT & (HIGH << GPIO_SDA_PIN) ? 1 : 0;
97 static void gpio_i2c_set_sda(unsigned char hi_lo)
100 gpio_i2c_sda_port_control(GPIO_CON_INPUT);
101 udelay(PORT_CHANGE_DELAY_TIME);
104 GPIO_I2C_SDA_DAT_PORT &= ~(HIGH << GPIO_SDA_PIN);
105 gpio_i2c_sda_port_control(GPIO_CON_OUTPUT);
106 udelay(PORT_CHANGE_DELAY_TIME);
110 static void gpio_i2c_set_clk (unsigned char hi_lo)
114 gpio_i2c_clk_port_control(GPIO_CON_INPUT);
115 udelay(PORT_CHANGE_DELAY_TIME);
119 GPIO_I2C_CLK_DAT_PORT &= ~(HIGH << GPIO_CLK_PIN);
120 gpio_i2c_clk_port_control(GPIO_CON_OUTPUT);
121 udelay(PORT_CHANGE_DELAY_TIME);
125 static void gpio_i2c_start(void)
127 // Setup SDA, CLK output High
128 gpio_i2c_set_sda(HIGH);
129 gpio_i2c_set_clk(HIGH);
133 // SDA low before CLK low
134 gpio_i2c_set_sda(LOW); udelay(DELAY_TIME);
135 gpio_i2c_set_clk(LOW); udelay(DELAY_TIME);
138 static void gpio_i2c_stop(void)
140 // Setup SDA, CLK output low
141 gpio_i2c_set_sda(LOW);
142 gpio_i2c_set_clk(LOW);
146 // SDA high after CLK high
147 gpio_i2c_set_clk(HIGH); udelay(DELAY_TIME);
148 gpio_i2c_set_sda(HIGH); udelay(DELAY_TIME);
151 static void gpio_i2c_send_ack(void)
154 gpio_i2c_set_sda(LOW);
156 gpio_i2c_set_clk(HIGH);
158 gpio_i2c_set_clk(LOW);
162 static void gpio_i2c_send_noack(void)
165 gpio_i2c_set_sda(HIGH);
167 gpio_i2c_set_clk(HIGH);
169 gpio_i2c_set_clk(LOW);
173 static unsigned char gpio_i2c_chk_ack (void)
175 unsigned char count = 0, ret = 0;
177 gpio_i2c_set_sda(LOW);
179 gpio_i2c_set_clk(HIGH);
182 gpio_i2c_sda_port_control(GPIO_CON_INPUT);
183 udelay(PORT_CHANGE_DELAY_TIME);
185 while(gpio_i2c_get_sda())
196 gpio_i2c_set_clk(LOW); udelay(DELAY_TIME);
198 #if defined(DEBUG_GPIO_I2C)
200 printk("%s %d: no ack!!\n",__func__, ret);
202 printk("%s %d: ack !! \n" ,__func__, ret);
208 static void gpio_i2c_byte_write (unsigned char wdata)
210 unsigned char cnt, mask;
212 for(cnt = 0, mask = 0x80; cnt < 8; cnt++, mask >>= 1) {
213 if(wdata & mask) gpio_i2c_set_sda(HIGH);
214 else gpio_i2c_set_sda(LOW);
216 gpio_i2c_set_clk(HIGH); udelay(DELAY_TIME);
217 gpio_i2c_set_clk(LOW); udelay(DELAY_TIME);
221 static void gpio_i2c_byte_read (unsigned char *rdata)
223 unsigned char cnt, mask;
225 gpio_i2c_sda_port_control(GPIO_CON_INPUT);
226 udelay(PORT_CHANGE_DELAY_TIME);
228 for(cnt = 0, mask = 0x80, *rdata = 0; cnt < 8; cnt++, mask >>= 1) {
229 gpio_i2c_set_clk(HIGH); udelay(DELAY_TIME);
231 if(gpio_i2c_get_sda()) *rdata |= mask;
233 gpio_i2c_set_clk(LOW); udelay(DELAY_TIME);
238 int s5pv310_ts_write (unsigned char addr, unsigned char *wdata, unsigned char wsize)
240 unsigned char cnt, ack;
245 gpio_i2c_byte_write(TOUCH_WR_ADDR); // i2c address
247 if((ack = gpio_i2c_chk_ack())) {
248 #if defined(DEBUG_GPIO_I2C)
249 printk("%s [write address] : no ack\n",__FUNCTION__);
255 gpio_i2c_byte_write(addr); // register
257 if((ack = gpio_i2c_chk_ack())) {
258 #if defined(DEBUG_GPIO_I2C)
259 printk("%s [write register] : no ack\n",__FUNCTION__);
265 for(cnt = 0; cnt < wsize; cnt++) {
267 gpio_i2c_byte_write(wdata[cnt]);
269 if((ack = gpio_i2c_chk_ack())) {
270 #if defined(DEBUG_GPIO_I2C)
271 printk("%s [write register] : no ack\n",__FUNCTION__);
281 #if defined(CONFIG_TOUCHSCREEN_S5PV310_MT)
282 if(wsize) gpio_i2c_stop();
287 #if defined(DEBUG_GPIO_I2C)
288 printk("%s : %d\n", __FUNCTION__, ack);
293 int s5pv310_ts_read(unsigned char *rdata, unsigned char rsize)
295 unsigned char ack, cnt;
300 gpio_i2c_byte_write(TOUCH_RD_ADDR); // i2c address
302 if((ack = gpio_i2c_chk_ack())) {
303 #if defined(DEBUG_GPIO_I2C)
304 printk("%s [write address] : no ack\n",__FUNCTION__);
310 for(cnt=0; cnt < rsize; cnt++) {
312 gpio_i2c_byte_read(&rdata[cnt]);
315 gpio_i2c_send_noack();
324 #if defined(DEBUG_GPIO_I2C)
325 printk("%s : %d\n", __FUNCTION__, ack);
330 void s5pv310_ts_port_init (void)
332 gpio_i2c_set_sda(HIGH);
333 gpio_i2c_set_clk(HIGH);