i2c 驱动编程接口 i2c_master_send 和 i2c_master_recv i2c_transfer
来源:互联网 发布:腾讯微信数据报告2017 编辑:程序博客网 时间:2024/06/07 17:59
1、通信接口
i2c发送或者接收一次数据都以数据包 struct i2c_msg 封装
[cpp]
struct i2c_msg {
__u16addr; // 从机地址
__u16flags; //标志
#define I2C_M_TEN 0x0010 // 十位地址标志
#defineI2C_M_RD 0x0001 // 接收数据标志
__u16len; // 数据长度
__u8*buf; // 数据指针
};
其中addr为从机地址;flags则是这次通信的标志,发送数据为0,接收数据则为I2C_M_RD;len为此次通信的数据字节数;buf 为发送或接收数据的指针。在设备驱动中我们通常调用 i2c-core 定义的接口i2c_master_send 和 i2c_master_recv 来发送或接收一次数据。
[cpp]
int i2c_master_send(struct i2c_client *client,const char *buf ,intcount)
{
intret;
structi2c_adapter *adap=client->adapter; //获取adapter信息
structi2c_msgmsg; // 定义一个临时的数据包
msg.addr =client->addr; // 将从机地址写入数据包
msg.flags =client->flags &I2C_M_TEN; // 将从机标志并入数据包
msg.len =count; // 将此次发送的数据字节数写入数据包
msg.buf =(char*)buf; // 将发送数据指针写入数据包
ret =i2c_transfer(adap, &msg,1); // 调用平台接口发送数据
return (ret== 1) ? count :ret; // 如果发送成功就返回字节数
}
EXPORT_SYMBOL(i2c_master_send);
i2c_master_send 接口的三个参数:client 为此次与主机通信的从机,buf 为发送的数据指针,count为发送数据的字节数。
[cpp]
int i2c_master_recv(struct i2c_client *client, char *buf ,intcount)
{
structi2c_adapter *adap=client->adapter; //获取adapter信息
structi2c_msgmsg; // 定义一个临时的数据包
intret;
msg.addr =client->addr;
i2c发送或者接收一次数据都以数据包 struct i2c_msg 封装
[cpp]
struct i2c_msg {
#define I2C_M_TEN
#defineI2C_M_RD
};
其中addr为从机地址;flags则是这次通信的标志,发送数据为0,接收数据则为I2C_M_RD;len为此次通信的数据字节数;buf 为发送或接收数据的指针。在设备驱动中我们通常调用 i2c-core 定义的接口i2c_master_send 和 i2c_master_recv 来发送或接收一次数据。
[cpp]
int i2c_master_send(struct i2c_client *client,const char *buf ,intcount)
{
}
EXPORT_SYMBOL(i2c_master_send);
i2c_master_send 接口的三个参数:client 为此次与主机通信的从机,buf 为发送的数据指针,count为发送数据的字节数。
[cpp]
int i2c_master_recv(struct i2c_client *client, char *buf ,intcount)
{