处理器只支持3个i2c通道,常常会不够用,最近写了一个gpio模拟i2c的driver,把模拟的i2c通道加入了i2c-core中,作为第 4 通道,调用接口与标准i2c一致,代码如下:
#define DELAY 2
#define SCL_GPIO GPIO_I2C_SCL
#define SDA_GPIO GPIO_I2C_SDA
static inline void i2c_delay(uint16_t delay)
{
udelay(delay);
}
static inline void set_scl_low(void)
{
gpio_direction_output(SCL_GPIO, 0);
}
static inline void set_scl_high(void)
{
gpio_direction_output(SCL_GPIO, 1);
}
static inline void set_sda_low(void)
{
gpio_direction_output(SDA_GPIO, 0);
}
static inline void set_sda_high(void)
{
gpio_direction_output(SDA_GPIO, 1);
}
static inline void set_sda_in(void)
{
gpio_direction_input(SDA_GPIO);
}
static inline uint8_t get_sda_bit(void)
{
return __gpio_get_value(SDA_GPIO);
}
int i2c_gpio_init(void)
{
int err;
err = gpio_request(SCL_GPIO, NULL);
if (err != 0)
return err;
err = gpio_request(SDA_GPIO, NULL);
set_sda_high();
set_scl_high();
return err;
}
void i2c_gpio_free(void)
{
gpio_free(SDA_GPIO);
gpio_free(SCL_GPIO);
}
static inline void i2c_start(void)
{
set_sda_high();
i2c_delay(DELAY);
set_scl_high();
i2c_delay(DELAY);
set_sda_low();
i2c_delay(DELAY);
set_scl_low();
i2c_delay(DELAY);
}
static inline void i2c_stop(void)
{
set_sda_low();
i2c_delay(DELAY);
set_scl_high();
i2c_delay(4*DELAY);
set_sda_high();
i2c_delay(4*DELAY);
}
/*
* return value:
*