50 lines
997 B
C++
50 lines
997 B
C++
|
|
#ifndef __I2C_DRIVER_H__
|
||
|
|
#define __I2C_DRIVER_H__
|
||
|
|
|
||
|
|
#include <cstdint>
|
||
|
|
#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;
|
||
|
|
};
|
||
|
|
|
||
|
|
#endif
|