VS-RK3288板卡 Android7.1 驱动实现i2c读写
VS-RK3288板卡 Android7.1 驱动实现i2c读写在驱动里面实现自己的i2c读函数===read
方法一:(建议用该方法)
static unsigned char my_i2c_read_reg(struct i2c_client *client, unsigned char reg)
{
unsigned char buf;
i2c_master_send(client, ®, 1); // 发送寄存器地址
i2c_master_recv(client, &buf, 1); // 接收寄存器的值
return buf;
}
参数:
i2c_client:为此次与主机通信的从机。
reg:表示设备的寄存器的值。
方法二:
static int my_i2c_read_reg(struct i2c_client *client, unsigned char reg, unsigned char *data)
{
int ret;
struct i2c_msg msgs[] = {
{
.addr = client->addr,
.flags = 0,
.len = 1,
.buf = ®, // 寄存器地址
},
{
.addr = client->addr,
.flags = I2C_M_RD,
.len = 1,
.buf = data, // 寄存器的值
},
};
ret = i2c_transfer(client->adapter, msgs, 2); // 这里 num = 2,通信成功 ret = 2
if (ret < 0)
tp_err("%s error: %d\n", __func__, ret);
return ret;
}
在驱动里面实现自己的i2c写函数===write
对于写I2C寄存器,我们需要做的就是给 i2c_master_send 函数传入两个字节的数据即可。
i2c_master_send 的三个参数:
client 为此次与主机通信的从机。
buf 为发送的数据指针,
count 为发送数据的字节数。
static int my_i2c_write_reg( struct i2c_client* client,uint8_t reg,uint8_t data)
{
unsigned char buffer[2];
buffer[0] = reg;
buffer[1] = data;
if( 2!= i2c_master_send(client,buffer,2) ) {
printk( KERN_ERR " xxxx_i2c_write fail! \n" );
return -1;
}
return 0;
}