Home | History | Annotate | Download | only in mraa
      1 /*
      2  * Author: Brendan Le Foll <brendan.le.foll (at) intel.com>
      3  * Copyright (c) 2014 Intel Corporation.
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining
      6  * a copy of this software and associated documentation files (the
      7  * "Software"), to deal in the Software without restriction, including
      8  * without limitation the rights to use, copy, modify, merge, publish,
      9  * distribute, sublicense, and/or sell copies of the Software, and to
     10  * permit persons to whom the Software is furnished to do so, subject to
     11  * the following conditions:
     12  *
     13  * The above copyright notice and this permission notice shall be
     14  * included in all copies or substantial portions of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     17  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     19  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
     20  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
     21  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
     22  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 #pragma once
     26 
     27 #include "i2c.h"
     28 #include "types.hpp"
     29 #include <stdexcept>
     30 
     31 namespace mraa
     32 {
     33 
     34 /**
     35  * @brief API to Inter-Integrated Circuit
     36  *
     37  * An I2c object represents an i2c master and can talk multiple i2c slaves by
     38  * selecting the correct address
     39  * @htmlinclude i2c.txt
     40  *
     41  * @snippet I2c-compass.cpp Interesting
     42  */
     43 class I2c
     44 {
     45   public:
     46     /**
     47      * Instantiates an i2c bus. Multiple instances of the same bus can
     48      * exist and the bus is not guarranteed to be on the correct address
     49      * before read/write.
     50      *
     51      * @param bus The i2c bus to use
     52      * @param raw Whether to disable pinmapper for your board
     53      */
     54     I2c(int bus, bool raw = false)
     55     {
     56         if (raw) {
     57             m_i2c = mraa_i2c_init_raw(bus);
     58         } else {
     59             m_i2c = mraa_i2c_init(bus);
     60         }
     61         if (m_i2c == NULL) {
     62             throw std::invalid_argument("Invalid i2c bus");
     63         }
     64     }
     65 
     66     /**
     67      * Closes the I2c Bus used. This does not guarrantee the bus will not
     68      * be usable by anyone else or communicates this disconnect to any
     69      * slaves.
     70      */
     71     ~I2c()
     72     {
     73         mraa_i2c_stop(m_i2c);
     74     }
     75 
     76     /**
     77      * Sets the i2c Frequency for communication. Your board may not support
     78      * the set frequency. Anyone can change this at any time and this will
     79      * affect every slave on the bus
     80      *
     81      * @param mode Frequency to set the bus to
     82      * @return Result of operation
     83      */
     84     Result
     85     frequency(I2cMode mode)
     86     {
     87         return (Result) mraa_i2c_frequency(m_i2c, (mraa_i2c_mode_t) mode);
     88     }
     89 
     90     /**
     91      * Set the slave to talk to, typically called before every read/write
     92      * operation
     93      *
     94      * @param address Communicate to the i2c slave on this address
     95      * @return Result of operation
     96      */
     97     Result
     98     address(uint8_t address)
     99     {
    100         return (Result) mraa_i2c_address(m_i2c, address);
    101     }
    102 
    103     /**
    104      * Read exactly one byte from the bus
    105      *
    106      * @return char read from the bus
    107      */
    108     uint8_t
    109     readByte()
    110     {
    111         return (uint8_t) mraa_i2c_read_byte(m_i2c);
    112     }
    113 
    114     /**
    115      * Read length bytes from the bus into *data pointer
    116      *
    117      * @param data Data to read into
    118      * @param length Size of read in bytes to make
    119      * @return length of read, should match length
    120      */
    121     int
    122     read(uint8_t* data, int length)
    123     {
    124         return mraa_i2c_read(m_i2c, data, length);
    125     }
    126 
    127     /**
    128      * Read byte from an i2c register
    129      *
    130      * @param reg Register to read from
    131      * @return char read from register
    132      */
    133     uint8_t
    134     readReg(uint8_t reg)
    135     {
    136         return mraa_i2c_read_byte_data(m_i2c, reg);
    137     }
    138 
    139     /**
    140      * Read word from an i2c register
    141      *
    142      * @param reg Register to read from
    143      * @return char read from register
    144      */
    145     uint16_t
    146     readWordReg(uint8_t reg)
    147     {
    148         return mraa_i2c_read_word_data(m_i2c, reg);
    149     }
    150 
    151     /**
    152      * Read length bytes from the bus into *data pointer starting from
    153      * an i2c register
    154      *
    155      * @param reg Register to read from
    156      * @param data pointer to the byte array to read data in to
    157      * @param length max number of bytes to read
    158      * @return length passed to the function or -1
    159      */
    160     int
    161     readBytesReg(uint8_t reg, uint8_t* data, int length)
    162     {
    163         return mraa_i2c_read_bytes_data(m_i2c, reg, data, length);
    164     }
    165 
    166     /**
    167      * Write a byte on the bus
    168      *
    169      * @param data The byte to send on the bus
    170      * @return Result of operation
    171      */
    172     Result
    173     writeByte(uint8_t data)
    174     {
    175         return (Result) mraa_i2c_write_byte(m_i2c, data);
    176     }
    177 
    178     /**
    179      * Write length bytes to the bus, the first byte in the array is the
    180      * command/register to write
    181      *
    182      * @param data Buffer to send on the bus, first byte is i2c command
    183      * @param length Size of buffer to send
    184      * @return Result of operation
    185      */
    186     Result
    187     write(const uint8_t* data, int length)
    188     {
    189         return (Result) mraa_i2c_write(m_i2c, data, length);
    190     }
    191 
    192     /**
    193      * Write a byte to an i2c register
    194      *
    195      * @param reg Register to write to
    196      * @param data Value to write to register
    197      * @return Result of operation
    198      */
    199     Result
    200     writeReg(uint8_t reg, uint8_t data)
    201     {
    202         return (Result) mraa_i2c_write_byte_data(m_i2c, data, reg);
    203     }
    204 
    205     /**
    206      * Write a word to an i2c register
    207      *
    208      * @param reg Register to write to
    209      * @param data Value to write to register
    210      * @return Result of operation
    211      */
    212     Result
    213     writeWordReg(uint8_t reg, uint16_t data)
    214     {
    215         return (Result) mraa_i2c_write_word_data(m_i2c, data, reg);
    216     }
    217 
    218   private:
    219     mraa_i2c_context m_i2c;
    220 };
    221 }
    222