10#ifndef M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
11#define M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
26class AdapterI2C :
public Adapter {
45 inline uint8_t address()
const
49 inline virtual void setAddress(
const uint8_t addr)
54 inline uint32_t clock()
const
59 inline virtual void setClock(
const uint32_t clock)
65 virtual int16_t scl()
const
69 virtual int16_t sda()
const
83 virtual m5::hal::error::error_t wakeup()
85 return m5::hal::error::error_t::UNKNOWN_ERROR;
89 virtual I2CImpl* duplicate(
const uint8_t addr)
91 return new I2CImpl(addr, _clock);
104 virtual m5::hal::bus::Bus* getBus()
108 virtual m5::I2C_Class* getI2CClass()
115 uint32_t _clock{100 * 1000U};
120 class WireImpl :
public I2CImpl {
122 WireImpl(TwoWire& wire,
const uint8_t addr,
const uint32_t clock);
123 inline virtual ImplType implType()
const override
125 return ImplType::TwoWire;
127 inline virtual TwoWire* getWire()
override
131 inline virtual int16_t scl()
const override
135 inline virtual int16_t sda()
const override
139 virtual bool begin()
override;
140 virtual bool end()
override;
141 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
142 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
143 const uint32_t stop)
override;
144 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
145 const uint32_t stop)
override;
146 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
147 const uint32_t stop)
override;
148 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
149 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
150 virtual m5::hal::error::error_t wakeup()
override;
153 m5::hal::error::error_t write_with_transaction(
const uint8_t addr,
const uint8_t* data,
const size_t len,
154 const uint32_t stop);
158 int16_t _sda{}, _scl{};
164 BusImpl(m5::hal::bus::Bus* bus,
const uint8_t addr,
const uint32_t clock);
169 inline virtual m5::hal::bus::Bus* getBus()
override
173 inline virtual int16_t scl()
const override
177 inline virtual int16_t sda()
const override
182 inline virtual void setAddress(
const uint8_t addr)
override
184 I2CImpl::setAddress(addr);
185 _access_cfg.i2c_addr = addr;
187 inline virtual void setClock(
const uint32_t clock)
override
189 I2CImpl::setClock(clock);
190 _access_cfg.freq = clock;
192 virtual bool begin()
override
196 virtual bool end()
override
200 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
201 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
202 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
203 const uint32_t stop)
override;
205 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
206 const uint32_t stop)
override;
207 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
208 const uint32_t stop)
override;
209 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
210 virtual m5::hal::error::error_t wakeup()
override;
213 m5::hal::error::error_t write_with_transaction(
const m5::hal::bus::I2CMasterAccessConfig& cfg,
214 const uint8_t* data,
const size_t len,
const uint32_t stop);
217 m5::hal::bus::Bus* _bus{};
218 m5::hal::bus::I2CMasterAccessConfig _access_cfg{};
219 int16_t _sda{-1}, _scl{-1};
224 I2CClassImpl(m5::I2C_Class& i2c,
const uint8_t addr,
const uint32_t clock);
229 inline virtual m5::I2C_Class* getI2CClass()
override
233 inline virtual int16_t scl()
const override
237 inline virtual int16_t sda()
const override
241 virtual bool begin()
override;
242 virtual bool end()
override;
243 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
244 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
245 const uint32_t stop)
override;
246 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
247 const uint32_t stop)
override;
248 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
249 const uint32_t stop)
override;
250 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
251 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
252 virtual m5::hal::error::error_t wakeup()
override;
255 m5::I2C_Class* _i2c{};
256 int16_t _sda{-1}, _scl{-1};
257 bool _in_transaction{
false};
261 AdapterI2C(
TwoWire& wire, uint8_t addr,
const uint32_t clock);
263 AdapterI2C(m5::hal::bus::Bus* bus,
const uint8_t addr,
const uint32_t clock);
264 AdapterI2C(m5::I2C_Class& i2c,
const uint8_t addr,
const uint32_t clock);
265 AdapterI2C(m5::hal::bus::Bus& bus,
const uint8_t addr,
const uint32_t clock) : AdapterI2C(&bus, addr, clock)
269 inline I2CImpl* impl()
271 return static_cast<I2CImpl*
>(_impl.get());
273 inline const I2CImpl* impl()
const
275 return static_cast<I2CImpl*
>(_impl.get());
278 inline uint8_t address()
const
280 return impl()->address();
282 inline void setAddress(
const uint8_t addr)
284 impl()->setAddress(addr);
287 inline uint32_t clock()
const
289 return impl()->clock();
292 inline void setClock(
const uint32_t clock)
294 impl()->setClock(clock);
303 inline int16_t scl()
const
305 return impl()->scl();
307 inline int16_t sda()
const
309 return impl()->sda();
312 virtual Adapter* duplicate(
const uint8_t addr)
override;
320 return impl()->begin();
324 return impl()->end();
331 AdapterI2C() : Adapter(Adapter::Type::I2C, new I2CImpl())
336 gpio::pin_backup_t _backupSCL{-1}, _backupSDA{-1};
Definition adapter_base.hpp:35
Definition adapter_i2c.hpp:162
virtual ImplType implType() const override
Gets the implementation type.
Definition adapter_i2c.hpp:165
Definition adapter_i2c.hpp:222
virtual ImplType implType() const override
Gets the implementation type.
Definition adapter_i2c.hpp:225
Definition adapter_i2c.hpp:36
virtual ImplType implType() const
Gets the implementation type.
Definition adapter_i2c.hpp:95
ImplType
I2C implementation type.
Definition adapter_i2c.hpp:29
@ I2CClass
m5::I2C_Class (m5gfx::i2c)
@ TwoWire
Arduino TwoWire.
@ Bus
M5HAL Bus (including SoftwareI2C)
ImplType implType() const
Gets the I2C implementation type.
Definition adapter_i2c.hpp:298
Top level namespace of M5stack.
Definition test_helper.hpp:20
PIN settings save/restore.