Files
sunnypilot/selfdrive/common/i2c.cc
Dean Lee 7222d0f20d Cleanup selfdrive/ includes (#20822)
* cleanup include path

* continue

* format includes

* fix testraw.cc

* remove include path from SConstruct

* regroup

* rebase master

* almost done

* apply review

* rename FileReader.xx to filereader.xx

* rename Unlogger.x->unlogger.x

* rename FrameReader.xx -> framereader.xx

* apply reviews

* ui.h

* continue

* fix framebuffer.cc build error:mv util.h up

* full path to msm_media_info

* fix qcom2 camerad

Co-authored-by: Comma Device <device@comma.ai>
2021-05-08 22:15:17 -07:00

86 lines
1.7 KiB
C++

#include "selfdrive/common/i2c.h"
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <cassert>
#include <stdexcept>
#include "selfdrive/common/swaglog.h"
#define UNUSED(x) (void)(x)
#ifdef QCOM2
// TODO: decide if we want to isntall libi2c-dev everywhere
extern "C" {
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
}
I2CBus::I2CBus(uint8_t bus_id){
char bus_name[20];
snprintf(bus_name, 20, "/dev/i2c-%d", bus_id);
i2c_fd = open(bus_name, O_RDWR);
if(i2c_fd < 0){
throw std::runtime_error("Failed to open I2C bus");
}
}
I2CBus::~I2CBus(){
if(i2c_fd >= 0){ close(i2c_fd); }
}
int I2CBus::read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len){
int ret = 0;
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
if(ret < 0) { goto fail; }
ret = i2c_smbus_read_i2c_block_data(i2c_fd, register_address, len, buffer);
if((ret < 0) || (ret != len)) { goto fail; }
fail:
return ret;
}
int I2CBus::set_register(uint8_t device_address, uint register_address, uint8_t data){
int ret = 0;
ret = ioctl(i2c_fd, I2C_SLAVE, device_address);
if(ret < 0) { goto fail; }
ret = i2c_smbus_write_byte_data(i2c_fd, register_address, data);
if(ret < 0) { goto fail; }
fail:
return ret;
}
#else
I2CBus::I2CBus(uint8_t bus_id){
UNUSED(bus_id);
i2c_fd = -1;
}
I2CBus::~I2CBus(){}
int I2CBus::read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len){
UNUSED(device_address);
UNUSED(register_address);
UNUSED(buffer);
UNUSED(len);
return -1;
}
int I2CBus::set_register(uint8_t device_address, uint register_address, uint8_t data){
UNUSED(device_address);
UNUSED(register_address);
UNUSED(data);
return -1;
}
#endif