10#ifndef M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
11#define M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
15#if defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>)
16#include <driver/i2c_master.h>
17#elif defined(ESP_PLATFORM)
18#include <driver/i2c.h>
32class AdapterI2C :
public Adapter {
40#if defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>)
42#elif defined(ESP_PLATFORM)
56 inline uint8_t address()
const
60 inline virtual void setAddress(
const uint8_t addr)
65 inline uint32_t clock()
const
70 inline virtual void setClock(
const uint32_t clock)
76 virtual int16_t scl()
const
80 virtual int16_t sda()
const
94 virtual m5::hal::error::error_t wakeup()
96 return m5::hal::error::error_t::UNKNOWN_ERROR;
100 virtual I2CImpl* duplicate(
const uint8_t addr)
102 return new I2CImpl(addr, _clock);
115 virtual m5::hal::bus::Bus* getBus()
119 virtual m5::I2C_Class* getI2CClass()
126 uint32_t _clock{100 * 1000U};
129#if defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>)
130 class ESPIDFMasterBusImpl :
public I2CImpl {
132 ESPIDFMasterBusImpl(i2c_master_bus_handle_t bus,
const uint8_t addr,
const uint32_t clock);
133 inline virtual ImplType implType()
const override
135 return ImplType::ESPIDFMasterBus;
137 inline virtual void setAddress(
const uint8_t addr)
override
142 I2CImpl::setAddress(addr);
144 inline virtual void setClock(
const uint32_t clock)
override
146 if (_clock != clock) {
149 I2CImpl::setClock(clock);
151 virtual bool begin()
override;
152 virtual bool end()
override;
153 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
154 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
155 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
156 const uint32_t stop)
override;
157 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
158 const uint32_t stop)
override;
159 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
160 const uint32_t stop)
override;
161 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
162 virtual m5::hal::error::error_t wakeup()
override;
165 m5::hal::error::error_t ensure_device();
166 m5::hal::error::error_t transmit(
const uint8_t* data,
const size_t len);
167 void set_pending_write(
const uint8_t* data,
const size_t len);
170 i2c_master_bus_handle_t _bus{};
171 i2c_master_dev_handle_t _dev{};
172 std::vector<uint8_t> _pending_write{};
174#elif defined(ESP_PLATFORM)
175 class ESPIDFLegacyBusImpl :
public I2CImpl {
177 ESPIDFLegacyBusImpl(
const i2c_port_t port,
const gpio_num_t sda,
const gpio_num_t scl,
const uint8_t addr,
178 const uint32_t clock);
179 inline virtual ImplType implType()
const override
181 return ImplType::ESPIDFLegacyBus;
183 inline virtual int16_t scl()
const override
187 inline virtual int16_t sda()
const override
191 inline virtual void setClock(
const uint32_t clock)
override
193 if (_clock != clock) {
194 I2CImpl::setClock(clock);
198 virtual bool begin()
override;
199 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;
204 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
205 const uint32_t stop)
override;
206 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
207 const uint32_t stop)
override;
208 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
209 virtual m5::hal::error::error_t wakeup()
override;
213 m5::hal::error::error_t write_with_transaction(
const uint8_t addr,
const uint8_t* data,
const size_t len,
214 const uint32_t stop);
217 i2c_port_t _port{I2C_NUM_0};
218 int16_t _sda{-1}, _scl{-1};
219 int _high{0}, _low{0};
225 class WireImpl :
public I2CImpl {
227 WireImpl(TwoWire& wire,
const uint8_t addr,
const uint32_t clock);
228 inline virtual ImplType implType()
const override
230 return ImplType::TwoWire;
232 inline virtual TwoWire* getWire()
override
236 inline virtual int16_t scl()
const override
240 inline virtual int16_t sda()
const override
244 virtual bool begin()
override;
245 virtual bool end()
override;
246 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
247 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
248 const uint32_t stop)
override;
249 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
250 const uint32_t stop)
override;
251 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
252 const uint32_t stop)
override;
253 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
254 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
255 virtual m5::hal::error::error_t wakeup()
override;
258 m5::hal::error::error_t write_with_transaction(
const uint8_t addr,
const uint8_t* data,
const size_t len,
259 const uint32_t stop);
263 int16_t _sda{}, _scl{};
269 BusImpl(m5::hal::bus::Bus* bus,
const uint8_t addr,
const uint32_t clock);
274 inline virtual m5::hal::bus::Bus* getBus()
override
278 inline virtual int16_t scl()
const override
282 inline virtual int16_t sda()
const override
287 inline virtual void setAddress(
const uint8_t addr)
override
289 I2CImpl::setAddress(addr);
290 _access_cfg.i2c_addr = addr;
292 inline virtual void setClock(
const uint32_t clock)
override
294 I2CImpl::setClock(clock);
295 _access_cfg.freq = clock;
297 virtual bool begin()
override
301 virtual bool end()
override
305 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
306 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
307 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
308 const uint32_t stop)
override;
310 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
311 const uint32_t stop)
override;
312 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
313 const uint32_t stop)
override;
314 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
315 virtual m5::hal::error::error_t wakeup()
override;
318 m5::hal::error::error_t write_with_transaction(
const m5::hal::bus::I2CMasterAccessConfig& cfg,
319 const uint8_t* data,
const size_t len,
const uint32_t stop);
322 m5::hal::bus::Bus* _bus{};
323 m5::hal::bus::I2CMasterAccessConfig _access_cfg{};
324 int16_t _sda{-1}, _scl{-1};
329 I2CClassImpl(m5::I2C_Class& i2c,
const uint8_t addr,
const uint32_t clock);
334 inline virtual m5::I2C_Class* getI2CClass()
override
338 inline virtual int16_t scl()
const override
342 inline virtual int16_t sda()
const override
346 virtual bool begin()
override;
347 virtual bool end()
override;
348 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data,
const size_t len)
override;
349 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t* data,
const size_t len,
350 const uint32_t stop)
override;
351 virtual m5::hal::error::error_t writeWithTransaction(
const uint8_t reg,
const uint8_t* data,
const size_t len,
352 const uint32_t stop)
override;
353 virtual m5::hal::error::error_t writeWithTransaction(
const uint16_t reg,
const uint8_t* data,
const size_t len,
354 const uint32_t stop)
override;
355 virtual I2CImpl* duplicate(
const uint8_t addr)
override;
356 virtual m5::hal::error::error_t generalCall(
const uint8_t* data,
const size_t len)
override;
357 virtual m5::hal::error::error_t wakeup()
override;
360 m5::I2C_Class* _i2c{};
361 int16_t _sda{-1}, _scl{-1};
362 bool _in_transaction{
false};
366 AdapterI2C(
TwoWire& wire, uint8_t addr,
const uint32_t clock);
368 AdapterI2C(m5::hal::bus::Bus* bus,
const uint8_t addr,
const uint32_t clock);
369 AdapterI2C(m5::I2C_Class& i2c,
const uint8_t addr,
const uint32_t clock);
370#if defined(ESP_PLATFORM) && __has_include(<driver/i2c_master.h>)
371 AdapterI2C(i2c_master_bus_handle_t bus,
const uint8_t addr,
const uint32_t clock);
372#elif defined(ESP_PLATFORM)
373 AdapterI2C(
const i2c_port_t port,
const gpio_num_t sda,
const gpio_num_t scl,
const uint8_t addr,
374 const uint32_t clock);
376 AdapterI2C(m5::hal::bus::Bus& bus,
const uint8_t addr,
const uint32_t clock) : AdapterI2C(&bus, addr, clock)
380 inline I2CImpl* impl()
382 return static_cast<I2CImpl*
>(_impl.get());
384 inline const I2CImpl* impl()
const
386 return static_cast<I2CImpl*
>(_impl.get());
389 inline uint8_t address()
const
391 return impl()->address();
393 inline void setAddress(
const uint8_t addr)
395 impl()->setAddress(addr);
398 inline uint32_t clock()
const
400 return impl()->clock();
403 inline void setClock(
const uint32_t clock)
405 impl()->setClock(clock);
414 inline int16_t scl()
const
416 return impl()->scl();
418 inline int16_t sda()
const
420 return impl()->sda();
431 return impl()->begin();
435 return impl()->end();
447 gpio::pin_backup_t _backupSCL{-1}, _backupSDA{-1};
Implementation base class (Pimpl pattern)
Definition adapter_base.hpp:37
Adapter()
Default constructor (creates Unknown type adapter)
Definition adapter_base.hpp:133
Type
Adapter type.
Definition adapter_base.hpp:28
Definition adapter_i2c.hpp:267
virtual ImplType implType() const override
Gets the implementation type.
Definition adapter_i2c.hpp:270
Definition adapter_i2c.hpp:327
virtual ImplType implType() const override
Gets the implementation type.
Definition adapter_i2c.hpp:330
Definition adapter_i2c.hpp:47
virtual ImplType implType() const
Gets the implementation type.
Definition adapter_i2c.hpp:106
virtual Adapter * duplicate(const uint8_t addr) override
Create a duplicate adapter with a different address.
Definition adapter_i2c.cpp:925
ImplType
I2C implementation type.
Definition adapter_i2c.hpp:35
@ 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:409
Top level namespace of M5Stack.
Definition test_helper.hpp:20
PIN settings save/restore.