|
/*参数1: 读写。参数2:SLAVE地址.参数3以后为buf中偏移*/
int main(int argc,char **argv)
{
unsigned char a[128] = {0};
struct i2c_rdwr_ioctl_data i2c_data;
i2c_data.nmsgs = 0;
i2c_data.msgs = (struct i2c_msg __user *)a;
i2c_data.msgs->buf = NULL;
int ret = -1;
int n = 0;
fd = open("/dev/i2c-0",O_RDONLY );
if(fd < 0)
{
perror("/dev/i2c-0");
return -1;
}
printf("line = %d\n",__LINE__);
/*i2c-dev.c中ioctl读命令字*/
if(0 == strncmp(argv[1],"iocread"))
{
unsigned char bbbb[16];
int wrlen = 1;
i2c_data.msgs->addr = atoi(argv[2]);
i2c_data.msgs->len = wrlen;
i2c_data.msgs->flags = 0;
i2c_data.nmsgs = 1;
i2c_data.msgs->buf = bbbb;
printf("line = %d\n",__LINE__);
i2c_data.msgs->buf[0] = atoi(argv[3]);
printf("read addr = 0x%x, offset = 0x%x\n",i2c_data.msgs->addr, i2c_data.msgs->buf[0]);
ret = ioctl(fd,I2C_RDWR,&i2c_data);
if(ret < 0)
{
printf("ioctl fail\n");
}
wrlen = atoi(argv[4]);
printf("wrlen = 0x%x\n",wrlen);
i2c_data.msgs->addr = atoi(argv[2]);
i2c_data.msgs->len = wrlen;
i2c_data.msgs->flags = 1;
i2c_data.nmsgs = 1;
i2c_data.msgs->buf = (unsigned char*)malloc(wrlen);
if(NULL == i2c_data.msgs->buf)
{
printf("malloc buf fail\n");
return -1;
}
memset(i2c_data.msgs->buf,0,wrlen);
printf("read addr = 0x%x\n",i2c_data.msgs->addr);
ret = ioctl(fd,I2C_RDWR,&i2c_data);
if(ret < 0)
{
printf("ioctl fail\n");
return -1;
}
int i = 0;
for(i = 0; i < i2c_data.msgs->len; i++)
{
printf("buf[%d] = 0x%x\n",i,i2c_data.msgs->buf[i]);
}
free(i2c_data.msgs->buf);
}
else if(0 == strncmp(argv[1],"iocwrite"))//i2c-dev.c中ioctl写命令字
{
/*设置超时时间和重试次数*/
ioctl(fd,I2C_TIMEOUT,50);//timeout 500ms
ioctl(fd,I2C_RETRIES,2);
/*填写msgs结构体*/
int wrlen = 2;
char aaaa[32] = {0};
i2c_data.msgs->addr = atoi(argv[2]);
i2c_data.msgs->len = wrlen;
i2c_data.msgs->flags = 0;
i2c_data.nmsgs = 1;
i2c_data.msgs->buf = aaaa;
i2c_data.msgs->buf[0] = atoi(argv[3]);//片内偏移地址
i2c_data.msgs->buf[1] = atoi(argv[4]);//要写入的值
printf("atoi(argv[4]) = 0x%x,i2c_data.msgs->len = 0x%x\n",atoi(argv[4]),i2c_data.msgs->len);
printf("write addr = 0x%x, offset = 0x%x, val = 0x%x\n",i2c_data.msgs->addr, i2c_data.msgs->buf[0], i2c_data.msgs->buf[1]);
ret = ioctl(fd,I2C_RDWR,&i2c_data);
if(ret < 0)
{
printf("ioctl fail\n");
}
}
else if(0 == strncmp(argv[1],"write"))
{
unsigned char cccc[32] = {0};
cccc[0] = atoi(argv[2]);
cccc[1] = atoi(argv[3]);
cccc[2] = atoi(argv[4]);
write(fd,cccc,3);
}
else
{
printf("i2c_test op addr offset val/len\n");
}
close(fd);
return 0;
}
|
|