Select Git revision
i2c.cpp
Paulus Kruger authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
i2c.cpp 2.02 KiB
#include "i2c.h"
#include <iostream>
//#include <cstdio>
//#include <cstdlib>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include "smbus.h"
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <unistd.h>
//#include <sys/stat.h>
using namespace std;
c_i2c::c_i2c(const t_driver config1) : drvbase (config1){
std::cout << config.name <<": i2c server, connecting to device " << config.parameters[0] << "\n";
char filename[20];
snprintf(filename, 19, "/dev/i2c-%d", config.parameters[0]);
file = open(filename, O_RDWR);
if (file < 0) {
std::cout << config.name <<": Error connecting!\n";
exit(1);
}
};
bool c_i2c::I2Csend(int addr,int reg,int len,t_buffer* data,int direction){
if (direction==0) { //send
if (reg>=0) I2Csend_reg(addr,reg,len,data);
else I2Csend_noreg(addr,len,data);
} else {
I2Cget_reg(addr,reg,len,data);
}
}
bool c_i2c::I2Csend_reg(int addr,int reg,int len,t_buffer* data){
// std::cout << config.name <<": i2c send to addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<"\n";
if (ioctl(file, I2C_SLAVE, addr)<0) return false;
// return true;
// return (i2c_smbus_write_block_data(file,reg,len,data)>=0);
return (i2c_smbus_write_i2c_block_data(file,reg,len,data)>=0);
}
bool c_i2c::I2Cget_reg(int addr,int reg,int len,t_buffer* data){
if (ioctl(file, I2C_SLAVE, addr)<0) return false;
// return true;
int result=i2c_smbus_read_i2c_block_data(file,reg,len,data);
// std::cout << config.name <<": i2c get from addr="<<addr<<" reg="<<reg<<" len="<<len<<" value="<<int(data[0]) <<" result" << result<<"\n";
return (result==len);
}
bool c_i2c::I2Csend_noreg(int addr,int len,t_buffer* data){
// std::cout << config.name <<": i2c send to addr="<<addr<<" len="<<len<<" value="<<int(data[0])<<"\n";
if (ioctl(file, I2C_SLAVE, addr)<0) return false;
int result=write(file,data,len);
// std::cout << config.name <<": i2c send to addr="<<addr<<" len="<<len<<" value="<<int(data[0])<<" result" << result<<"\n";
return (result>=0);
}