RK3399使用GPIO口模拟i2c升级NT68411固件
sda = gpio_to_desc(129); //GPIO4_A1
scl = gpio_to_desc(130); //GPIO4_A2
gpiod_direction_output_raw(sda, 0);
gpiod_direction_output_raw(scl, 0);
static void write_data(struct gpio_desc *gpio_des, int data)
{
gpiod_direction_output_raw(gpio_des, data);
}
static void set_sda(int data)
{
gpiod_direction_output_raw(sda, data);
}
static void set_scl(int data)
{
gpiod_direction_output_raw(scl, data);
}
static unsigned char read_data(struct gpio_desc *gpio_des)
{
gpiod_direction_input(gpio_des);
return gpiod_get_value_cansleep(gpio_des);
}
static unsigned char get_sda(void)
{
return read_data(sda);
}
// static unsigned char get_scl(void)
// {
// return read_data(scl);
// }
void i2c_start(void)
{
//初始化GPIO口
set_sda(1); //设置SDA为高电平
set_scl(1); //设置SCL为高电平
udelay(8); //延时
//起始条件
set_sda(0); //SCL为高电平时,SDA由高变低
udelay(6);
}
/* I2C终止条件 */
void i2c_stop(void)
{
set_scl(1);
set_sda(0);
set_sda(0);
udelay(TIME);
set_sda(1); //SCL高电平时,SDA由低变高
}
/*
I2C读取ACK信号(写数据时使用)
返回值 :0表示ACK信号有效;非0表示ACK信号无效
*/
unsigned char i2c_read_ack(void)
{
unsigned char r;
get_sda(); //设置SDA方向为输入
set_scl(1); // SCL变高
udelay(TIME);
r = get_sda();; //读取ACK信号
udelay(TIME);
set_scl(0); // SCL变低
udelay(TIME);
return r;
}
/* I2C发出ACK信号(读数据时使用) */
void i2c_send_ack(void)
{
set_scl(0);
set_sda(0); //设置SDA方向为输出,并发送ack
udelay(TIME);
set_scl(1); // SCL变高
udelay(TIME);
set_scl(0);
}
/* I2C发出noACK信号(读数据时使用) */
void i2c_send_noack(void)
{
set_scl(0);
set_sda(1); //设置SDA方向为输出,并发送noack
udelay(TIME);
set_scl(1); // SCL变高
udelay(TIM