/* * I2C.cpp * * Created on: 2014/05/29 * Author: sunaga */ #include #include #include #include #include #include #include #include #include "I2C.h" CI2C::CI2C(char* devName) { m_bEnable = false; m_nFd = open (devName, O_RDWR); if(m_nFd < 0) { return; } m_bEnable = true; } CI2C::~CI2C() { if(m_nFd >= 0) { close(m_nFd); } } int CI2C::SetSmbus (char rw, int command, int size, union i2c_smbus_data *data) { struct i2c_smbus_ioctl_data args ; args.read_write = rw ; args.command = command ; args.size = size ; args.data = data ; return ioctl(m_nFd, I2C_SMBUS, &args) ; } i2cVal CI2C::Get8bits(int devAddr, int index) { i2cVal val; if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { printf("Get8bits err\n"); val.enable = false; val.val = -1; return val; } union i2c_smbus_data data; if (SetSmbus (I2C_SMBUS_READ, index, I2C_SMBUS_BYTE_DATA, &data) < 0) { printf("SetSmbus err\n"); val.enable = false; val.val = -1; return val; } val.enable = true; val.val = data.byte & 0xFF ; return val; } i2cVal CI2C::Get16bits(int devAddr, int index) { i2cVal val; if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { val.enable = false; val.val = -1; return val; } union i2c_smbus_data data; if (SetSmbus (I2C_SMBUS_READ, index, I2C_SMBUS_WORD_DATA, &data)) { val.enable = false; val.val = -1; return val; } val.enable = true; val.val = data.word & 0xFFFF; return val; } int CI2C::Set8bits(int devAddr, int index, int value) { if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { return -1; } union i2c_smbus_data data ; data.byte = value ; int a = SetSmbus (I2C_SMBUS_WRITE, index, I2C_SMBUS_BYTE_DATA, &data) ; return a; } int CI2C::Set16bits(int devAddr, int index, int value) { if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { return -1; } union i2c_smbus_data data ; data.word = value ; return SetSmbus (I2C_SMBUS_WRITE, index, I2C_SMBUS_WORD_DATA, &data) ; } int CI2C::SetBaudrate(int freq) { int fd; //unbind fd = open("/sys/bus/platform/drivers/bcm2708_i2c/unbind", O_WRONLY); if(fd < 0) { return -1; } char* devName = "bcm2708_i2c.0";//??? write(fd, devName, sizeof(devName) + 1); close(fd); //set baudrate fd = open("/sys/module/i2c_bcm2708/parameters/baudrate", O_WRONLY); if(fd < 0) { return -2; } char buf[32]; sprintf(buf,"%d", freq); write(fd, buf, strlen(buf) + 1); close(fd); //bind fd = open("/sys/bus/platform/drivers/bcm2708_i2c/bind", O_WRONLY); if(fd < 0) { return -3; } write(fd, devName, strlen(devName) + 1); close(fd); return 0; } int CI2C::GetBaudrate() { int fd; //set baudrate fd = open("/sys/module/i2c_bcm2708/parameters/baudrate", O_RDWR); if(fd < 0) { return -2; } char buf[32]; read(fd, buf, 32); close(fd); int br; if(sscanf(buf, "%d", &br) == EOF) { return -1; } return br; } int CI2C::wakeUp(int devAddr, int cnt) { int ret; if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { return -1; } while(cnt > 0) { ret = write( m_nFd, NULL, 0); if ( ret >= 0) { break; } usleep(3000); cnt--; } if(cnt == 0) { printf("address=%d can't wake up!\n", devAddr); return -1; } return 0; } int CI2C::Write(int devAddr, char* pData, int size) { int ret; if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { return -1; } ret = write( m_nFd, pData, size); if ( ret < 0 ) { return -1; } return 0; } int CI2C::Read(int devAddr, char* pData, int size) { int ret; if(ioctl (m_nFd, I2C_SLAVE, devAddr) < 0) { return -1; } ret = read( m_nFd, pData, size); if ( ret < 0 ) { return -1; } return 0; }