M5UnitUnified 0.1.2 git rev:98f967c
Loading...
Searching...
No Matches
adapter_i2c.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
11#define M5_UNIT_COMPONENT_ADAPTER_I2C_HPP
12
13#include "adapter_base.hpp"
14#include "pin.hpp"
15
16class TwoWire;
17
18namespace m5 {
19namespace unit {
20
25class AdapterI2C : public Adapter {
26public:
27 class I2CImpl : public Adapter::Impl {
28 public:
29 I2CImpl() = default;
30 I2CImpl(const uint8_t addr, const uint32_t clock) : Adapter::Impl(), _addr(addr), _clock(clock)
31 {
32 }
33
34 virtual ~I2CImpl() = default;
35
36 inline uint8_t address() const
37 {
38 return _addr;
39 }
40 inline void setAddress(const uint8_t addr)
41 {
42 _addr = addr;
43 }
44
45 inline uint32_t clock() const
46 {
47 return _clock;
48 }
49
50 inline virtual void setClock(const uint32_t clock)
51 {
52 _clock = clock;
53 }
54
55 //
56 virtual int16_t scl() const
57 {
58 return -1;
59 }
60 virtual int16_t sda() const
61 {
62 return -1;
63 }
64
65 //
66 virtual bool begin()
67 {
68 return false;
69 }
70 virtual bool end()
71 {
72 return false;
73 }
74 virtual m5::hal::error::error_t wakeup()
75 {
76 return m5::hal::error::error_t::UNKNOWN_ERROR;
77 }
78
79 //
80 virtual I2CImpl* duplicate(const uint8_t addr)
81 {
82 return new I2CImpl(addr, _clock);
83 }
84
85 virtual TwoWire* getWire()
86 {
87 return nullptr;
88 }
89 virtual m5::hal::bus::Bus* getBus()
90 {
91 return nullptr;
92 }
93
94 protected:
95 uint8_t _addr{};
96 uint32_t _clock{100 * 1000U};
97 };
98
99 //
100#if defined(ARDUINO)
101 class WireImpl : public I2CImpl {
102 public:
103 WireImpl(TwoWire& wire, const uint8_t addr, const uint32_t clock);
104 inline virtual TwoWire* getWire() override
105 {
106 return _wire;
107 }
108 inline virtual int16_t scl() const override
109 {
110 return _scl;
111 }
112 inline virtual int16_t sda() const override
113 {
114 return _sda;
115 }
116 virtual bool begin() override;
117 virtual bool end() override;
118 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len) override;
119 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
120 const uint32_t stop) override;
121 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
122 const uint32_t stop) override;
123 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
124 const uint32_t stop) override;
125 virtual I2CImpl* duplicate(const uint8_t addr) override;
126 virtual m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len) override;
127 virtual m5::hal::error::error_t wakeup() override;
128
129 protected:
130 m5::hal::error::error_t write_with_transaction(const uint8_t addr, const uint8_t* data, const size_t len,
131 const uint32_t stop);
132
133 private:
134 TwoWire* _wire{};
135 int16_t _sda{}, _scl{};
136 };
137#endif
138
139 class BusImpl : public I2CImpl {
140 public:
141 BusImpl(m5::hal::bus::Bus* bus, const uint8_t addr, const uint32_t clock);
142 inline virtual m5::hal::bus::Bus* getBus() override
143 {
144 return _bus;
145 }
146
147 inline virtual void setClock(const uint32_t clock) override
148 {
149 I2CImpl::setClock(clock);
150 _access_cfg.freq = clock;
151 }
152 virtual I2CImpl* duplicate(const uint8_t addr) override;
153 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len) override;
154 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
155 const uint32_t stop) override;
156
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;
163
164 protected:
165 m5::hal::error::error_t write_with_transaction(const m5::hal::bus::I2CMasterAccessConfig& cfg,
166 const uint8_t* data, const size_t len, const uint32_t stop);
167
168 private:
169 m5::hal::bus::Bus* _bus{};
170 m5::hal::bus::I2CMasterAccessConfig _access_cfg{};
171 };
172
173#if defined(ARDUINO)
174 AdapterI2C(TwoWire& wire, uint8_t addr, const uint32_t clock);
175#endif
176 AdapterI2C(m5::hal::bus::Bus* bus, const uint8_t addr, const uint32_t clock);
177 AdapterI2C(m5::hal::bus::Bus& bus, const uint8_t addr, const uint32_t clock) : AdapterI2C(&bus, addr, clock)
178 {
179 }
180
181 inline I2CImpl* impl()
182 {
183 return static_cast<I2CImpl*>(_impl.get());
184 }
185 inline const I2CImpl* impl() const
186 {
187 return static_cast<I2CImpl*>(_impl.get());
188 }
189
190 inline uint8_t address() const
191 {
192 return impl()->address();
193 }
194 inline void setAddress(const uint8_t addr)
195 {
196 impl()->setAddress(addr);
197 }
198
199 inline uint32_t clock() const
200 {
201 return impl()->clock();
202 }
203
204 inline void setClock(const uint32_t clock)
205 {
206 impl()->setClock(clock);
207 }
208
209 inline int16_t scl() const
210 {
211 return impl()->scl();
212 }
213 inline int16_t sda() const
214 {
215 return impl()->sda();
216 }
217
218 virtual Adapter* duplicate(const uint8_t addr) override;
219
224 inline bool begin()
225 {
226 return impl()->begin();
227 }
228 inline bool end()
229 {
230 return impl()->end();
231 }
232 bool pushPin();
233 bool popPin();
235
236protected:
237 AdapterI2C() : Adapter(Adapter::Type::I2C, new I2CImpl())
238 {
239 }
240
241protected:
242 gpio::pin_backup_t _backupSCL{-1}, _backupSDA{-1};
243};
244
245} // namespace unit
246} // namespace m5
247#endif
Adapter base.
Definition adapter_base.hpp:35
Definition adapter_i2c.hpp:139
Definition adapter_i2c.hpp:27
I2C access adapter.
Top level namespace of M5stack.
Definition test_helper.hpp:18
Unit-related namespace.
PIN settings save/restore.