我们下面开始分析i2c的通信,即读写过程。
我们先看读函数,对应i2c core中的i2c_master_recv:
int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
{
struct i2c_adapter *adap=client->adapter;//通过client访问adapter
struct i2c_msg msg;//i2c传输的单位
int ret;
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;
msg.flags |= I2C_M_RD;//读标记,如果没有就是写
msg.len = count;//数据字节数
msg.buf = buf;//数据保存的地方
ret = i2c_transfer(adap, &msg, 1);//传输1个msg
/* If everything went ok (i.e. 1 msg transmitted), return #bytes
transmitted, else error code. */
return (ret == 1) ? count : ret;
}
在看下写函数,对应i2c core中的i2c_master_send:
int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
{
int ret;
struct i2c_adapter *adap=client->adapter;//通过client访问adapter
struct i2c_msg msg;//这个就是i2c传输的单位
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;//没有读标记就代表写操作
msg.len = count;//数据字节数
msg.buf = (char *)buf;//要写的buf
ret = i2c_transfer(adap, &msg, 1);//传输1个msg
/* If everything went ok (i.e. 1 msg transmitted), return #bytes
transmitted, else error code. */
return (ret == 1) ? count : ret;
}
我们发现无论读还是写函数最终都使用i2c_transfer()进行传输msg,下面具体分析一下i2c_transfer:
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
unsigned long orig_jiffies;
int ret, try;
/* REVISIT the fault reporting model here is weak:
*
* - When we get an error after receiving N bytes from a slave,
* there is no way to repor
我们先看读函数,对应i2c core中的i2c_master_recv:
int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
{
struct i2c_adapter *adap=client->adapter;//通过client访问adapter
struct i2c_msg msg;//i2c传输的单位
int ret;
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;
msg.flags |= I2C_M_RD;//读标记,如果没有就是写
msg.len = count;//数据字节数
msg.buf = buf;//数据保存的地方
ret = i2c_transfer(adap, &msg, 1);//传输1个msg
/* If everything went ok (i.e. 1 msg transmitted), return #bytes
transmitted, else error code. */
return (ret == 1) ? count : ret;
}
在看下写函数,对应i2c core中的i2c_master_send:
int i2c_master_send(struct i2c_client *client,const char *buf ,int count)
{
int ret;
struct i2c_adapter *adap=client->adapter;//通过client访问adapter
struct i2c_msg msg;//这个就是i2c传输的单位
msg.addr = client->addr;
msg.flags = client->flags & I2C_M_TEN;//没有读标记就代表写操作
msg.len = count;//数据字节数
msg.buf = (char *)buf;//要写的buf
ret = i2c_transfer(adap, &msg, 1);//传输1个msg
/* If everything went ok (i.e. 1 msg transmitted), return #bytes
transmitted, else error code. */
return (ret == 1) ? count : ret;
}
我们发现无论读还是写函数最终都使用i2c_transfer()进行传输msg,下面具体分析一下i2c_transfer:
int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
{
unsigned long orig_jiffies;
int ret, try;
/* REVISIT the fault reporting model here is weak:
*
* - When we get an error after receiving N bytes from a slave,
* there is no way to repor