i2c 驱动编程接口 i2c_master_send 和 i2c_master_recv i2c_transfer
(2015-02-06 10:14:36)
标签:
股票 |
分类: linux内核 |
1、通信接口
i2c发送或者接收一次数据都以数据包 struct i2c_msg 封装
[cpp]
struct i2c_msg {
__u16
addr;
// 从机地址
__u16
flags; //
标志
#define I2C_M_TEN
0x0010 // 十位地址标志
#define I2C_M_RD
0x0001 // 接收数据标志
__u16
len;
// 数据长度
__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 ,int count)
{
int
ret;
struct
i2c_adapter *adap=client->adapter; //
获取adapter信息
struct
i2c_msg
msg;
// 定义一个临时的数据包
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 ,int count)
{
struct
i2c_adapter *adap=client->adapter; //
获取adapter信息
struct
i2c_msg
msg;
// 定义一个临时的数据包
int
ret;
msg.addr =
client->addr;
i2c发送或者接收一次数据都以数据包 struct i2c_msg 封装
[cpp]
struct i2c_msg {
#define I2C_M_TEN
#define I2C_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 ,int count)
{
}
EXPORT_SYMBOL(i2c_master_send);
i2c_master_send 接口的三个参数:client 为此次与主机通信的从机,buf 为发送的数据指针,count 为发送数据的字节数。
[cpp]
int i2c_master_recv(struct i2c_client *client, char *buf ,int count)
{