size_t i2c::command(uint8_t slaveaddr, uint8_t cmd, const uint8_t* data_addr, size_t data_size) { reset_txfer_done(); set_slave_address(slaveaddr); set_data_len(1 + data_size); initiate_write(); write_byte(cmd); size_t bytes_sent=1; while (data_size>0) { if (write_byte(*data_addr)) { data_addr++; data_size--; bytes_sent++; } // TODO check for error conditions } wait_for_done(); clear_fifo(); return bytes_sent; }
bool I2C::write_word(uint8_t register_address, uint16_t value) { set_slave_address(); i2c_smbus_data data; data.word = value; return use_smbus_IOCTL(true, register_address, I2C_SMBUS_WORD_DATA, data); }
bool I2C::write_byte(uint8_t register_address, uint8_t value) { set_slave_address(); i2c_smbus_data data; data.byte = value; return use_smbus_IOCTL(true, register_address, I2C_SMBUS_BYTE_DATA, data); }
bool I2C::read_byte(uint8_t register_address, uint8_t& value) { set_slave_address(); i2c_smbus_data data; if( use_smbus_IOCTL(false, register_address, I2C_SMBUS_BYTE_DATA, data) != 0) { value = data.byte; return true; } else { return false; } }
uint8_t I2C::read_block(uint8_t register_address, uint8_t* value, size_t length) { set_slave_address(); if( length > I2C_SMBUS_BLOCK_MAX ) { length = I2C_SMBUS_BLOCK_MAX; } i2c_smbus_data data; data.block[0] = length; if( use_smbus_IOCTL(false, register_address, I2C_SMBUS_I2C_BLOCK_DATA, data) ) { memcpy(value, &(data.block[1]), length); return data.block[0]; } else { return 0; } }
uint8_t I2C::write_block(uint8_t register_address, uint8_t* value, size_t length) { set_slave_address(); if( length > I2C_SMBUS_BLOCK_MAX ) { length = I2C_SMBUS_BLOCK_MAX; } i2c_smbus_data data; memset(data.block, 0, length+1); memcpy( &(data.block[1]), value, length); data.block[0] = length; if (use_smbus_IOCTL(true, register_address, I2C_SMBUS_I2C_BLOCK_DATA, data)) { return length; } else { return 0; } }