#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <errno.h>
int main(int argc,char *argv[])
{
int i2c_fd,rw,dev_addr;
unsigned char value;
unsigned char reg;
struct i2c_rdwr_ioctl_data i2c_data;
struct i2c_msg i2c_msg[2];
if((argc <5 )||(argc>6)){
printf("parameter must 4(R) or 5(W)!\n");
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
//arg[2]:r/w flag
rw = atoi(argv[3]);
switch(rw){
case 0: //read
if(argc != 5){
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
break;
case 1: //write
if(argc != 6) {
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
break;
defalut:
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
break;
}
//arg[1], open device
i2c_fd = open(argv[1],O_RDWR,644);
if(i2c_fd < 0){
printf("open %s error!\n",argv[1]);
return -1;
}
//arg[2]:device addr
dev_addr = atoi(argv[2]);
if(dev_addr > 127){
printf("addr must low 127!\n");
goto out;
}
//arg[4]:reg value
reg = atoi(argv[4]);
//arg[5]: value
if(rw == 1)
value = atoi(argv[5]);
if(rw == 0){//read
i2c_msg[0].buf =(unsigned char*)malloc(1);
i2c_msg[0].addr = dev_addr;
i2c_msg[0].flags = 0;
i2c_msg[0].len = 1;
i2c_msg[0].buf[0] = reg;
i2c_msg[1].buf =(unsigned char*)malloc(1);
i2c_msg[1].addr = dev_addr;
i2c_msg[1].flags = I2C_M_RD;
i2c_msg[1].len = 1;
i2c_msg[1].buf[0] = 0;
printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);
printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);
printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);
printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);
printf("i2c_msg[1].addr:%d\n",i2c_msg[1].addr);
printf("i2c_msg[1].flag:%d\n",i2c_msg[1].flags);
printf("i2c_msg[1].len:%d\n",i2c_msg[1].len);
printf("i2c_msg[1].buf[0]:%d\n",i2c_msg[1].buf[0]);
i2c_data.msgs = &i2c_msg[0];
i2c_data.nmsgs = 2;
}else{//write
i2c_msg[0].buf =(unsigned char*)malloc(2);
i2c_msg[0].addr = dev_addr;
i2c_msg[0].flags = 0;
i2c_msg[0].len = 2;
i2c_msg[0].buf[0] = reg;
i2c_msg[0].buf[1] = value;
printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);
printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);
printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);
printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);
printf("i2c_msg[0].buf[1]:%d\n",i2c_msg[0].buf[1]);
i2c_data.msgs = &i2c_msg[0];
i2c_data.nmsgs = 1;
}
ioctl(i2c_fd,I2C_TIMEOUT, 1); /* 设置超时 */
ioctl(i2c_fd,I2C_RETRIES, 2); /* 设置重试次数 */
if((ioctl(i2c_fd,I2C_RDWR,(unsigned long*)&i2c_data)) < 0 )
{
printf("read or wirte i2c error!\n");
goto out;
}
if(rw == 0){
printf("read data is:0x%x\n",i2c_msg[1].buf[0]);
free(i2c_msg[1].buf);
}
free(i2c_msg[0].buf);
close(i2c_fd);
return 0;
out:
close(i2c_fd);
return -1;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <errno.h>
int main(int argc,char *argv[])
{
int i2c_fd,rw,dev_addr;
unsigned char value;
unsigned char reg;
struct i2c_rdwr_ioctl_data i2c_data;
struct i2c_msg i2c_msg[2];
if((argc <5 )||(argc>6)){
printf("parameter must 4(R) or 5(W)!\n");
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
//arg[2]:r/w flag
rw = atoi(argv[3]);
switch(rw){
case 0: //read
if(argc != 5){
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
break;
case 1: //write
if(argc != 6) {
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
}
break;
defalut:
printf("cmd [path] [device addr] [R/W:0/1] [reg] <value>\n");
return -1;
break;
}
//arg[1], open device
i2c_fd = open(argv[1],O_RDWR,644);
if(i2c_fd < 0){
printf("open %s error!\n",argv[1]);
return -1;
}
//arg[2]:device addr
dev_addr = atoi(argv[2]);
if(dev_addr > 127){
printf("addr must low 127!\n");
goto out;
}
//arg[4]:reg value
reg = atoi(argv[4]);
//arg[5]: value
if(rw == 1)
value = atoi(argv[5]);
if(rw == 0){//read
i2c_msg[0].buf =(unsigned char*)malloc(1);
i2c_msg[0].addr = dev_addr;
i2c_msg[0].flags = 0;
i2c_msg[0].len = 1;
i2c_msg[0].buf[0] = reg;
i2c_msg[1].buf =(unsigned char*)malloc(1);
i2c_msg[1].addr = dev_addr;
i2c_msg[1].flags = I2C_M_RD;
i2c_msg[1].len = 1;
i2c_msg[1].buf[0] = 0;
printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);
printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);
printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);
printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);
printf("i2c_msg[1].addr:%d\n",i2c_msg[1].addr);
printf("i2c_msg[1].flag:%d\n",i2c_msg[1].flags);
printf("i2c_msg[1].len:%d\n",i2c_msg[1].len);
printf("i2c_msg[1].buf[0]:%d\n",i2c_msg[1].buf[0]);
i2c_data.msgs = &i2c_msg[0];
i2c_data.nmsgs = 2;
}else{//write
i2c_msg[0].buf =(unsigned char*)malloc(2);
i2c_msg[0].addr = dev_addr;
i2c_msg[0].flags = 0;
i2c_msg[0].len = 2;
i2c_msg[0].buf[0] = reg;
i2c_msg[0].buf[1] = value;
printf("i2c_msg[0].addr:%d\n",i2c_msg[0].addr);
printf("i2c_msg[0].flag:%d\n",i2c_msg[0].flags);
printf("i2c_msg[0].len:%d\n",i2c_msg[0].len);
printf("i2c_msg[0].buf[0]:%d\n",i2c_msg[0].buf[0]);
printf("i2c_msg[0].buf[1]:%d\n",i2c_msg[0].buf[1]);
i2c_data.msgs = &i2c_msg[0];
i2c_data.nmsgs = 1;
}
ioctl(i2c_fd,I2C_TIMEOUT, 1); /* 设置超时 */
ioctl(i2c_fd,I2C_RETRIES, 2); /* 设置重试次数 */
if((ioctl(i2c_fd,I2C_RDWR,(unsigned long*)&i2c_data)) < 0 )
{
printf("read or wirte i2c error!\n");
goto out;
}
if(rw == 0){
printf("read data is:0x%x\n",i2c_msg[1].buf[0]);
free(i2c_msg[1].buf);
}
free(i2c_msg[0].buf);
close(i2c_fd);
return 0;
out:
close(i2c_fd);
return -1;
}