#define SCK_TIME 2
#define ACK_TIME 3
#define START_TIME 5
static void i2c_start(void)
{
gpio_direction_output(SDA, 1);
gpio_direction_output (SCL, 1);
udelay(SCK_TIME);
gpio_set_value(SDA, 0);
udelay(START_TIME);
gpio_set_value(SCL, 0);
}
static void i2c_stop(void)
{
udelay(SCK_TIME);
gpio_direction_output(SDA, 0);
gpio_set_value(SCL, 1);
udelay(SCK_TIME);
gpio_set_value(SDA, 1);
}
static unsigned char i2c_read_ack(void)
{
unsigned char r;
gpio_direction_input(SDA);
udelay(ACK_TIME);
gpio_set_value(SCL,1);
udelay(1);
r = gpio_get_value(SDA);
udelay(1);
gpio_set_value(SCL,0);
return r;
}
static void i2c_send_ack(void)
{
udelay(SCK_TIME);
gpio_direction_output(SDA, 1);
gpio_set_value(SCL,1);
udelay(SCK_TIME);
gpio_set_value(SCL,0);
}
static void i2c_write_byte(unsigned char b)
{
int i;
for (i=7; i>=0; i--) {
udelay(SCK_TIME);
gpio_direction_output(SDA, b & (1<<i));
udelay(SCK_TIME - 2);
gpio_set_value(SCL, 1);
udelay(SCK_TIME);
gpio_set_value(SCL, 0);
}
i2c_read_ack();
}
static unsigned char i2c_read_byte(void)
{
int i;
unsigned char r = 0;
gpio_direction_input(SDA);
for (i=7; i>=0; i--) {
udelay(SCK_TIME * 5);
gpio_set_value(SCL, 1);
r |= (gpio_get_value(SDA) << i);
udelay(SCK_TIME * 5);
gpio_set_value(SCL, 0);
}
i2c_send_ack();
return r;
}
static void i2c_read(unsigned char addr, unsigned char reg, unsigned char* buf, int len)
{
int i;
unsigned char t;
i2c_start();
t = (addr << 1) | 0;
i2c_write_byte(t);
i2c_write_byte(reg);
i2c_start();
t = (addr << 1) | 1;
i2c_write_byte(t);
for (i=0; i<len; i++)
buf[i] = i2c_read_byte();
i2c_stop();
}
static void i2c_write (unsigned char addr, unsigned char reg, unsigned char* buf, int len)
{
int i;
unsigned char t;
i2c_start();
t = (addr << 1) | 0;
i2c_write_byte(t);
i2c_write_byte(reg);
for (i=0; i<len; i++)
i2c_write_byte(buf[i]);
i2c_stop();
}