Android 应用程序直接调用I2C控制器实现的设备驱动实例测试
一、涉及到以下的函数和结构体。
1 打开要调用的控制器设备文件
int fd = open("/dev/i2c-0", O_RDWR);
2 设置超时和传输失败时的重试次数(非必须作)
ioctl(fd, I2C_TIMEOUT, 10);
ioctl(fd, I2C_RETRIES, 2);
3 准备好需要传输的数据.
struct i2c_msg {
__u16 addr; /* slave address */
__u16 flags; //写为0, 读为I2C_M_RD
__u16 len; /* msg length */
__u8 *buf; /* pointer to msg data */
};
struct i2c_rdwr_ioctl_data {
struct i2c_msg *msgs; /* ptr to array of simple messages */
int nmsgs; /* number of messages to exchange */
};
ioctl(file, I2C_RDWR, struct i2c_rdwr_ioctl_data *msgset);
//调用此ioctl函数类似设备驱动里调用i2c_transfer函数。调用一次,只会在完成时发出一个停止信号,不管发出了多少个i2c_msg。 而且每一个i2c_msg都会有一个开始信号.
二、测试实例代码,读写RTC 的时间。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#define HYM8563_ADDR 0x51
int main(void)
{
int fd, i;
char addr = 0, data[0X0F];
fd = open("/dev/i2c-0", O_RDWR);
if (fd < 0)
return 1;
ioctl(fd, I2C_TIMEOUT, 10);
ioctl(fd, I2C_RETRIES, 10);
struct i2c_msg msgs[2] = {
{HYM8563_ADDR, 0, 1, &addr},
{HYM8563_ADDR, I2C_M_RD, 0X0F, data},
};
struct i2c_rdwr_ioctl_data idata = {
.msgs = msgs,
.nmsgs = 2,
};
if (ioctl(fd, I2C_RDWR, &idata) < 0)
{
perror("ioctl");
return 2;
}
for (i = 0; i < 0X0F; i++)
printf("0x%02x ", data[i]);
printf("\r\n");
close(fd);
return 0;
}
三、测试结果。