#ifndef __I2C_DRIVER_H__ #define __I2C_DRIVER_H__ #include #include "bus_core.h" enum class I2cPort : uint8_t { _0 = 0, _1, _2, MAX }; struct I2cConfig { uint32_t speed_hz = 100000; }; class I2cDevice { public: explicit I2cDevice(uint16_t dev_addr); RetCode init(); uint16_t addr() const { return dev_addr_; } private: friend class I2cBus; uint16_t dev_addr_; }; class I2cBus { public: explicit I2cBus(I2cPort port); ~I2cBus(); I2cBus(const I2cBus &) = delete; I2cBus &operator=(const I2cBus &) = delete; RetCode init(const I2cConfig &config); RetCode deinit(); RetCode master_write(I2cDevice &dev, const uint8_t *data, uint32_t len); RetCode master_read(I2cDevice &dev, uint8_t *data, uint32_t len); RetCode master_write_read(I2cDevice &dev, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen); private: I2cPort port_; I2cConfig config_; bool initialized_ = false; }; #ifdef __cplusplus extern "C" { #endif int i2c_init(uint8_t port, uint32_t speed_hz); int i2c_master_write(uint8_t port, uint16_t dev_addr, const uint8_t *data, uint32_t len); int i2c_master_read(uint8_t port, uint16_t dev_addr, uint8_t *data, uint32_t len); int i2c_master_write_read(uint8_t port, uint16_t dev_addr, const uint8_t *wdata, uint32_t wlen, uint8_t *rdata, uint32_t rlen); #ifdef __cplusplus } #endif #endif