mraa_result_t mraa_i2c_frequency(mraa_i2c_context dev, int hz);
/**
- * Read from an i2c context
+ * Simple bulk read from an i2c context, this will always begin with the i2c
+ * offset 0x0
*
* @param dev The i2c context
* @param data pointer to the byte array to read data in to
int mraa_i2c_read(mraa_i2c_context dev, uint8_t *data, int length);
/**
- * Read a single byte from the i2c context
+ * Simple read for a single byte from the i2c context, this will always begin
+ * with the i2c offset 0x0
*
* @param dev The i2c context
* @return The result of the read or -1 if failed
* @param command The register
* @return The result of the read or -1 if failed
*/
-uint8_t mraa_i2c_read_byte_data(mraa_i2c_context dev, uint8_t command);
+uint8_t mraa_i2c_read_byte_data(mraa_i2c_context dev, const uint8_t command);
/**
- * Write to an i2c context
+ * Read a single word from i2c context, from designated register
+ *
+ * @param dev The i2c context
+ * @param command The register
+ * @return The result of the read or -1 if failed
+ */
+uint16_t mraa_i2c_read_word_data(mraa_i2c_context dev, const uint8_t command);
+
+/**
+ * Perform a simple write to an i2c context, always at offset 0x0
*
* @param dev The i2c context
* @param data pointer to the byte array to be written
mraa_result_t mraa_i2c_write(mraa_i2c_context dev, const uint8_t *data, int length);
/**
- * Write a single byte to an i2c context
+ * Write a single byte to an i2c context, always at offset 0x0
*
* @param dev The i2c context
* @param data The byte to write
mraa_result_t mraa_i2c_write_byte(mraa_i2c_context dev, const uint8_t data);
/**
+ * Write a single byte to an i2c context
+ *
+ * @param dev The i2c context
+ * @param data The byte to write
+ * @param command The register
+ * @return Result of operation
+ */
+mraa_result_t mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data, const uint8_t command);
+
+/**
+ * Write a single word to an i2c context
+ *
+ * @param dev The i2c context
+ * @param data The word to write
+ * @param command The register
+ * @return Result of operation
+ */
+mraa_result_t mraa_i2c_write_word_data(mraa_i2c_context dev, const uint16_t data, const uint8_t command);
+
+/**
* Sets the i2c context address.
*
* @param dev The i2c context
}
/**
- * Write one byte to the bus
+ * Read byte from an i2c register
*
- * @param data Buffer to send on the bus
- * @param length Size of buffer to send
- * @return Result of operation
+ * @param reg Register to read from
+ * @return char read from register
*/
- mraa_result_t write(char* data, size_t length) {
- return mraa_i2c_write(m_i2c, (const unsigned char *)data, (int) length);
+ uint8_t readReg(uint8_t reg) {
+ return mraa_i2c_read_byte_data(m_i2c, reg);
}
/**
- * Read an i2c register
+ * Read word from an i2c register
*
* @param reg Register to read from
* @return char read from register
*/
- uint8_t readReg(uint8_t reg) {
+ uint16_t readWordReg(uint8_t reg) {
return mraa_i2c_read_byte_data(m_i2c, reg);
}
}
/**
- * Write to an i2c register
+ * Write length bytes to the bus
+ *
+ * @param data Buffer to send on the bus
+ * @param length Size of buffer to send
+ * @return Result of operation
+ */
+ mraa_result_t write(char* data, size_t length) {
+ return mraa_i2c_write(m_i2c, (const unsigned char *)data, (int) length);
+ }
+
+ /**
+ * Write a byte to an i2c register
*
* @param reg Register to write to
* @param data Value to write to register
* @return Result of operation
*/
mraa_result_t writeReg(uint8_t reg, uint8_t data) {
- const uint8_t buf[2] = {reg, data};
- return mraa_i2c_write(m_i2c, buf, 2);
+ return mraa_i2c_write_byte_data(m_i2c, data, reg);
+ }
+
+ /**
+ * Write a word to an i2c register
+ *
+ * @param reg Register to write to
+ * @param data Value to write to register
+ * @return Result of operation
+ */
+ mraa_result_t writeWordReg(uint8_t reg, uint16_t data) {
+ return mraa_i2c_write_word_data(m_i2c, data, reg);
}
private:
mraa_i2c_context m_i2c;
uint8_t
mraa_i2c_read_byte_data(mraa_i2c_context dev, uint8_t command)
{
- uint8_t byte = i2c_smbus_read_byte_data(dev->fh, command);
- return byte;
+ return (uint8_t) i2c_smbus_read_byte_data(dev->fh, command);
+}
+
+uint16_t
+mraa_i2c_read_word_data(mraa_i2c_context dev, uint8_t command)
+{
+ return (uint16_t) i2c_smbus_read_word_data(dev->fh, command);
}
mraa_result_t
{
if (i2c_smbus_write_i2c_block_data(dev->fh, data[0], length-1, (uint8_t*) data+1) < 0) {
syslog(LOG_ERR, "i2c: Failed to write");
- return MRAA_ERROR_INVALID_HANDLE;
+ return MRAA_ERROR_INVALID_HANDLE;
}
return MRAA_SUCCESS;
}
{
if (i2c_smbus_write_byte(dev->fh, data) < 0) {
syslog(LOG_ERR, "i2c: Failed to write");
- return MRAA_ERROR_INVALID_HANDLE;
+ return MRAA_ERROR_INVALID_HANDLE;
+ }
+ return MRAA_SUCCESS;
+}
+
+mraa_result_t
+mraa_i2c_write_byte_data(mraa_i2c_context dev, const uint8_t data, const uint8_t command)
+{
+ if (i2c_smbus_write_byte_data(dev->fh, command, data) < 0) {
+ syslog(LOG_ERR, "i2c: Failed to write");
+ return MRAA_ERROR_INVALID_HANDLE;
+ }
+ return MRAA_SUCCESS;
+}
+
+mraa_result_t
+mraa_i2c_write_word_data(mraa_i2c_context dev, const uint16_t data, const uint8_t command)
+{
+ if (i2c_smbus_write_word_data(dev->fh, command, data) < 0) {
+ syslog(LOG_ERR, "i2c: Failed to write");
+ return MRAA_ERROR_INVALID_HANDLE;
}
return MRAA_SUCCESS;
}
dev->addr = (int) addr;
if (ioctl(dev->fh, I2C_SLAVE_FORCE, addr) < 0) {
syslog(LOG_ERR, "i2c: Failed to set slave address %d", addr);
- return MRAA_ERROR_INVALID_HANDLE;
+ return MRAA_ERROR_INVALID_HANDLE;
}
return MRAA_SUCCESS;
}