tools: Initially add i2c tool and mock

The power-utils will invoke i2c get/set commands to the i2c device for
PSU code update.
Create a separated i2c tool because it is logically standalone and could
be shared for other utils.
Also add an I2CInterface and its mock to make it easier to test when
developing i2c related operations.

Signed-off-by: Lei YU <mine260309@gmail.com>
Change-Id: If5383547e6d84c0a79610e2d2d6f2fa8ee9dc061
diff --git a/tools/i2c/i2c.hpp b/tools/i2c/i2c.hpp
new file mode 100644
index 0000000..f9cc09e
--- /dev/null
+++ b/tools/i2c/i2c.hpp
@@ -0,0 +1,57 @@
+#pragma once
+
+#include "i2c_interface.hpp"
+
+namespace i2c
+{
+
+class I2CDevice : public I2CInterface
+{
+  private:
+    I2CDevice() = delete;
+
+    explicit I2CDevice(uint8_t busId, uint8_t devAddr)
+    {
+        // TODO
+        (void)busId;
+        (void)devAddr;
+    }
+
+  public:
+    virtual ~I2CDevice() = default;
+
+    /** @copydoc I2CInterface::read(uint8_t&) */
+    void read(uint8_t& data) override;
+
+    /** @copydoc I2CInterface::read(uint8_t,uint8_t&) */
+    void read(uint8_t addr, uint8_t& data) override;
+
+    /** @copydoc I2CInterface::read(uint8_t,uint16_t&) */
+    void read(uint8_t addr, uint16_t& data) override;
+
+    /** @copydoc I2CInterface::read(uint8_t,uint8_t&,uint8_t*) */
+    void read(uint8_t addr, uint8_t& size, uint8_t* data) override;
+
+    /** @copydoc I2CInterface::write(uint8_t) */
+    void write(uint8_t data) override;
+
+    /** @copydoc I2CInterface::write(uint8_t,uint8_t) */
+    void write(uint8_t addr, uint8_t data) override;
+
+    /** @copydoc I2CInterface::write(uint8_t,uint16_t) */
+    void write(uint8_t addr, uint16_t data) override;
+
+    /** @copydoc I2CInterface::write(uint8_t,uint8_t,const uint8_t*) */
+    void write(uint8_t addr, uint8_t size, const uint8_t* data) override;
+
+    /** @brief Create an I2CInterface instance
+     *
+     * @param[in] busId - The i2c bus ID
+     * @param[in] devAddr - The device address of the i2c
+     *
+     * @return The unique_ptr holding the I2CInterface
+     */
+    static std::unique_ptr<I2CInterface> create(uint8_t busId, uint8_t devAddr);
+};
+
+} // namespace i2c