Skip to content
Snippets Groups Projects
Select Git revision
  • a13422fe2b044b26b667f4e045ce8cfedd6ec647
  • master default protected
  • dither_on_off_disabled
  • yocto
  • pypcc2
  • pypcc3
  • 2020-12-07-the_only_working_copy
  • v2.1
  • v2.0
  • v1.0
  • v0.9
  • Working-RCU_ADC,ID
  • 2020-12-11-Holiday_Season_release
13 results

i2c.cpp

  • kruger's avatar
    Paulus Kruger authored
    a13422fe
    History
    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);
    }