#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "i2c-dev.h"
#include <fcntl.h>
static int open_i2c_dev(int i2cbus)
{
int file;
char filename[20];
size_t size = sizeof(filename);
memset(filename, 0, size);
snprintf(filename, size, "/dev/i2c-%d", i2cbus);
filename[size - 1] = '\0';
file = open(filename, O_RDWR);
if (file < 0 ) {
printf("ahd:open %s fail \n", filename);
return -1;
}
return file;
}
static int i2c_write(int file, int i2cAddr, char *buff, int numBytes)
{
struct i2c_rdwr_ioctl_data ioctlArg;
struct i2c_msg i2cMessages[1];
int errCode;
//read msg
i2cMessages[0].addr = i2cAddr;
i2cMessages[0].flags = 0;//it's write
i2cMessages[0].len = numBytes;//don't read more bytes than requested from the slave chip
i2cMessages[0].buf = buff;
ioctlArg.msgs = &i2cMessages[0];
ioctlArg.nmsgs = 1;
errCode = 0;
errCode = ioctl(file, I2C_RDWR, &ioctlArg);
if (errCode < 0)
fprintf(stderr, "error [%d] writing to i2cAddr 0x%x\n", errCode, i2cAddr);
return errCode;
}
static int i2c_read(int file, int i2cAddr, char *rbuff, int rnumBytes)
{
struct i2c_rdwr_ioctl_data ioctlArg;
struct i2c_msg i2cMessages[2];
int errCode;
char tbuff[]={0x10,0x00};
i2cMessages[0].addr = i2cAddr;
i2cMessages[0].flags = 0;//it's a write
i2cMessages[0].len = sizeof(tbuff);
i2cMessages[0].buf = tbuff;
//read msg
i2cMessages[1].addr = i2cAddr;
i2cMessages[1].flags = I2C_M_RD;//it's a read
i2cMessages[1].len = rnumBytes;//don't read more bytes than requested from the slave chip
i2cMessages[1].buf = rbuff;
ioctlArg.msgs = &i2cMessages[0];
ioctlArg.nmsgs = 2;
errCode = 0;
errCode = ioctl(file, I2C_RDWR, &ioctlArg);
if (errCode < 0)
fprintf(stderr, "error [%d] reading from i2cAddr 0x%x\n", errCode, i2cAddr);
return errCode;
}
static int get_ahd_version()
{
int ret = 0;
int file = open_i2c_dev(1);
int i;
if(file<0){
printf("ahd:open i2c fail\n");
return 0;
}
char sbuff[]={0x10,0x00,0x06,0x01,0x04,0x80,0x06,0x00};
for(i=2;i<7;i++){
sbuff[7] += sbuff[i];
}
printf("send \n");
for(i=0;i<sizeof(sbuff);i++){
printf("%x ", sbuff[i]);
}
printf("\n");
ret = i2c_write(file, 0x32, sbuff, sizeof(sbuff));
if(ret<0){
printf("ahd:i2c_write sbuff fail\n");
close(file);
return 0;
}
usleep(20000);
char ibuff[]={0x10,0x80,0xff};
ret = i2c_write(file, 0x32, ibuff, sizeof(ibuff));
if(ret<0){
printf("ahd:i2c_write ibuff fail\n");
close(file);
return 0;
}
usleep(20000);
char rbuff[7];
memset(rbuff, 0, sizeof(rbuff));
ret = i2c_read(file, 0x32, rbuff, sizeof(rbuff));
if(ret<0){
printf("ahd:i2c_read rbuff fail\n");
close(file);
return 0;
}
printf("recv \n");
for(i=0;i<sizeof(rbuff);i++){
printf("%x ", rbuff[i]);
}
printf("\n");
close(file);
if(rbuff[1] != 0xf1){
printf("rbuff[1] is not f1\n");
return 0;
}
return rbuff[2]|(rbuff[3]<<8)|(rbuff[4]<<16);
}
int main(int argc, char *argv[])
{
int version;
version = get_ahd_version();
if(0==version){
version = get_ahd_version();
}
printf("version:0x%x\n", version);
}