#include "standard_i2c.h"
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
//#include "bc_define.h"
#define I2C_SLAVE 0x0703
#define I2C_SMBUS 0x0720
#define I2C_TENBIT 0x0704
#define I2C_SMBUS_BYTE_DATA 2
#define I2C_SMBUS_READ 1
#define I2C_SMBUS_WRITE 0
#define I2C_SMBUS_BLOCK_DATA 5
#define I2C_SMBUS_I2C_BLOCK_DATA 8
#define I2C_SLAVE_FORCE 0x0706
#define I2C_SMBUS_BLOCK_MAX 32
union i2c_smbus_data {
unsigned char byte;
unsigned short word;
unsigned char block[I2C_SMBUS_BLOCK_MAX + 2];
};
struct i2c_smbus_ioctl_data {
char read_write;
unsigned char command;
int size;
union i2c_smbus_data *data;
};
int Standard_i2c_open(int index)
{
char dev_name[32];
sprintf(dev_name, "/dev/i2c-%d", index);
return open(dev_name, O_RDWR);
}
int standard_i2c_read(int bus_index, unsigned char device_addr/*8bits*/, unsigned char register_addr, unsigned char *pBuffer, int byte_number)
{
struct i2c_smbus_ioctl_data ioctl_data;
union i2c_smbus_data smbus_data;
int ret_val = -1;
int i2c_dev_fd = -1;
int index = 0;
/**/
if(byte_number >= I2C_SMBUS_BLOCK_MAX)
{
printf("standard_i2c_read Invalid parameter(%d >= %d)\n", byte_number, I2C_SMBUS_BLOCK_MAX);
return -1;
}
/**/
i2c_dev_fd = Standard_i2c_open(index);
if(i2c_dev_fd < 0)
{
printf("standard_i2c_read Standard_i2c_open Failed\n");
goto _OVER_;
}
/*set address*/
ioctl(i2c_dev_fd, I2C_TENBIT, 0);
if(ioctl(i2c_dev_fd, I2C_SLAVE_FORCE, (device_addr >> 1) & 0x7f) < 0)
{
perror("i2c ioctl:");
printf("standard_i2c_read ioctl(I2C_SLAVE) Failed\n");
goto _OVER_;
}
/**/
smbus_data.block[0] = byte_number;
ioctl_data.read_write = I2C_SMBUS_READ;
ioctl_data.command = register_addr;
ioctl_data.size = I2C_SMBUS_I2C_BLOCK_DATA;
ioctl_data.data = &smbus_data;
if(ioctl(i2c_dev_fd, I2C_SMBUS, &ioctl_data) != 0)
{
printf("standard_i2c_read ioctl(I2C_SMBUS) Failed(%d)\n", index);
goto _OVER_;
}
if(smbus_data.block[0] != byte_number)
{
printf("standard_i2c_read ioctl read Failed(%d)(%d)\n", smbus_data.block[0], byte_number);
goto _OVER_;
}
for(index = 0; index < byte_number; index ++)
{
pBuffer[index] = smbus_data.block[index + 1];
}
ret_val = 0;
_OVER_:
if(i2c_dev_fd >= 0)
{
close(i2c_dev_fd);
}
return ret_val;
}
int standard_i2c_write(int bus_index, unsigned char device_addr/*8bits*/, unsigned char register_addr, unsigned char *pBuffer, int byte_number)
{
struct i2c_smbus_ioctl_data ioctl_data;
union i2c_smbus_data smbus_data;
int ret_val = -1;
int i2c_dev_fd = -1;
int index = 0;
/**/
if(byte_number >= I2C_SMBUS_BLOCK_MAX)
{
printf("standard_i2c_write ioctl Invalid parameter(%d)\n", byte_number);
return -1;
}
i2c_dev_fd = Standard_i2c_open(bus_index);
if(i2c_dev_fd < 0)
{
printf("standard_i2c_write Standard_i2c_open Failed\n");
goto _OVER_;
}
/*set address*/
ioctl(i2c_dev_fd, I2C_TENBIT, 0);
if(ioctl(i2c_dev_fd, I2C_SLAVE_FORCE, (device_addr >> 1) & 0x7f) < 0)
{
perror("i2c ioctl:");
printf("standard_i2c_write ioctl(I2C_SLAVE) Failed\n");
goto _OVER_;
}
/**/
smbus_data.block[0] = byte_number;
for(index = 0; index < byte_number; index ++)
{
smbus_data.block[index + 1] = pBuffer[index];
}
/**/
ioctl_data.read_write = I2C_SMBUS_WRITE;
ioctl_data.command = register_addr;
ioctl_data.size = I2C_SMBUS_I2C_BLOCK_DATA;
ioctl_data.data = &smbus_data;
/**/
if(ioctl(i2c_dev_fd, I2C_SMBUS, &ioctl_data) != 0)
{
printf("standard_i2c_write ioctl(I2C_SMBUS) Failed(%d)\n", index);
goto _OVER_;
}
ret_val = 0;
_OVER_:
if(i2c_dev_fd >= 0)
{
close(i2c_dev_fd);
}
return ret_val;
}
int usage(char *pname)
{
printf("%s <dev> <reg> [value]\n", pname);
return 0;
}
int main(int argc, char *argv[])
{
unsigned char i2c_dev;
unsigned char i2c_reg;
unsigned char value[4];
int i;
if(argc < 3)
{
usage(argv[0]);
exit(1);
}
i2c_dev=strtoll(argv[1], NULL, 0);
i2c_reg=strtoll(argv[2], NULL, 0);
if(argc == 3)
{
standard_i2c_read(0, i2c_dev,i2c_reg, &value[0], 1);
}
else if(argc == 4)
{
value[0]=strtoll(argv[3], NULL, 0);
standard_i2c_write(0, i2c_dev,i2c_reg, &value[0], 1);
}
}
评论0