M5UnitUnified 0.3.2 git rev:5172084
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 inline virtual int16_t scl() const override
147 {
148 return _scl;
149 }
150 inline virtual int16_t sda() const override
151 {
152 return _sda;
153 }
154
155 inline virtual void setClock(const uint32_t clock) override
156 {
157 I2CImpl::setClock(clock);
158 _access_cfg.freq = clock;
159 }
160 virtual bool begin() override
161 {
162 return true;
163 }
164 virtual bool end() override
165 {
166 return true;
167 }
168 virtual I2CImpl* duplicate(const uint8_t addr) override;
169 virtual m5::hal::error::error_t readWithTransaction(uint8_t* data, const size_t len) override;
170 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t* data, const size_t len,
171 const uint32_t stop) override;
172
173 virtual m5::hal::error::error_t writeWithTransaction(const uint8_t reg, const uint8_t* data, const size_t len,
174 const uint32_t stop) override;
175 virtual m5::hal::error::error_t writeWithTransaction(const uint16_t reg, const uint8_t* data, const size_t len,
176 const uint32_t stop) override;
177 virtual m5::hal::error::error_t generalCall(const uint8_t* data, const size_t len) override;
178 virtual m5::hal::error::error_t wakeup() override;
179
180 protected:
181 m5::hal::error::error_t write_with_transaction(const m5::hal::bus::I2CMasterAccessConfig& cfg,
182 const uint8_t* data, const size_t len, const uint32_t stop);
183
184 private:
185 m5::hal::bus::Bus* _bus{};
186 m5::hal::bus::I2CMasterAccessConfig _access_cfg{};
187 int16_t _sda{-1}, _scl{-1};
188 };
189
190#if defined(ARDUINO)
191 AdapterI2C(TwoWire& wire, uint8_t addr, const uint32_t clock);
192#endif
193 AdapterI2C(m5::hal::bus::Bus* bus, const uint8_t addr, const uint32_t clock);
194 AdapterI2C(m5::hal::bus::Bus& bus, const uint8_t addr, const uint32_t clock) : AdapterI2C(&bus, addr, clock)
195 {
196 }
197
198 inline I2CImpl* impl()
199 {
200 return static_cast<I2CImpl*>(_impl.get());
201 }
202 inline const I2CImpl* impl() const
203 {
204 return static_cast<I2CImpl*>(_impl.get());
205 }
206
207 inline uint8_t address() const
208 {
209 return impl()->address();
210 }
211 inline void setAddress(const uint8_t addr)
212 {
213 impl()->setAddress(addr);
214 }
215
216 inline uint32_t clock() const
217 {
218 return impl()->clock();
219 }
220
221 inline void setClock(const uint32_t clock)
222 {
223 impl()->setClock(clock);
224 }
225
226 inline int16_t scl() const
227 {
228 return impl()->scl();
229 }
230 inline int16_t sda() const
231 {
232 return impl()->sda();
233 }
234
235 virtual Adapter* duplicate(const uint8_t addr) override;
236
241 inline bool begin()
242 {
243 return impl()->begin();
244 }
245 inline bool end()
246 {
247 return impl()->end();
248 }
249 bool pushPin();
250 bool popPin();
252
253protected:
254 AdapterI2C() : Adapter(Adapter::Type::I2C, new I2CImpl())
255 {
256 }
257
258protected:
259 gpio::pin_backup_t _backupSCL{-1}, _backupSDA{-1};
260};
261
262} // namespace unit
263} // namespace m5
264#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.