M5UnitUnified 0.6.4 git rev:53b220c
Loading...
Searching...
No Matches
adapter_gpio.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
11#ifndef M5_UNIT_COMPONENT_ADAPTER_GPIO_HPP
12#define M5_UNIT_COMPONENT_ADAPTER_GPIO_HPP
13
15#include "types.hpp"
16#include "adapter_base.hpp"
17
18// GPIO / RMT are ESP platform features
19#if defined(ESP_PLATFORM)
20namespace m5 {
21namespace unit {
22namespace gpio {
23
30uint8_t calculate_rmt_clk_div(const uint32_t apb_freq_hz, const uint32_t tick_ns);
31
38uint32_t calculate_rmt_resolution_hz(const uint32_t src_freq_hz, const uint32_t tick_ns);
39
46bool rmt_resolution_matches(const uint32_t resolution_hz, const uint32_t tick_ns);
47
53int8_t gpio_to_adc_channel(const int8_t pin);
54
61bool apply_rx_pull(const gpio_num_t pin, const RxPull pull);
62
63} // namespace gpio
64
65// Base class for AdapterGPIO
66class AdapterGPIOBase : public Adapter {
67public:
68 class GPIOImpl : public Adapter::Impl {
69 public:
70 GPIOImpl() = default;
71 GPIOImpl(const int8_t rx_pin, const int8_t tx_pin) : _rx_pin{(gpio_num_t)rx_pin}, _tx_pin{(gpio_num_t)tx_pin}
72 {
73 }
74 virtual ~GPIOImpl() override;
75
76 inline gpio_num_t rx_pin() const
77 {
78 return _rx_pin;
79 }
80 inline gpio_num_t tx_pin() const
81 {
82 return _tx_pin;
83 }
84 inline gpio::adapter_config_t adapter_config() const
85 {
86 return _adapter_cfg;
87 }
88
89 inline virtual bool begin(const gpio::adapter_config_t& cfg)
90 {
91 return false;
92 }
93
95 virtual int rmtTxChannel() const
96 {
97 return -1;
98 }
100 virtual int rmtRxChannel() const
101 {
102 return -1;
103 }
105 virtual void* rmtTxHandle() const
106 {
107 return nullptr;
108 }
110 virtual void* rmtRxHandle() const
111 {
112 return nullptr;
113 }
115 virtual uint32_t rmtTxResolutionHz() const
116 {
117 return 0;
118 }
120 virtual uint32_t rmtRxResolutionHz() const
121 {
122 return 0;
123 }
124
125 //
126 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
127 {
128 return pin_mode(rx_pin(), m);
129 }
130 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
131 {
132 return write_digital(rx_pin(), high);
133 }
134 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
135 {
136 return read_digital(rx_pin(), high);
137 }
138 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
139 {
140 return write_analog(rx_pin(), v);
141 }
142 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v) override
143 {
144 return read_analog(v, rx_pin());
145 }
146 inline virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv) override
147 {
148 return read_analog_millivolts(mv, rx_pin());
149 }
150
151 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
152 const uint32_t timeout_us = 30000) override
153 {
154 return pulse_in(duration, rx_pin(), state, timeout_us);
155 }
156
157 //
158 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
159 {
160 return pin_mode(tx_pin(), m);
161 }
162 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
163 {
164 return write_digital(tx_pin(), high);
165 }
166 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
167 {
168 return read_digital(tx_pin(), high);
169 }
170 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
171 {
172 return write_analog(tx_pin(), v);
173 }
174 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v) override
175 {
176 return read_analog(v, tx_pin());
177 }
178 inline virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv) override
179 {
180 return read_analog_millivolts(mv, tx_pin());
181 }
182 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
183 const uint32_t timeout_us = 30000) override
184 {
185 return pulse_in(duration, tx_pin(), state, timeout_us);
186 }
187
188 protected:
189 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
190 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
191 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
192 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
193 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
194 m5::hal::error::error_t read_analog_millivolts(uint32_t& millivolts, const gpio_num_t pin);
195 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
196 const uint32_t timeout_us);
197
198 protected:
199 m5::hal::error::error_t ensure_adc_handle(const gpio_num_t pin);
200 void release_adc_resources();
201
202 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
203 gpio::adapter_config_t _adapter_cfg{};
204
205#if defined(M5_UNIT_UNIFIED_USING_ADC_ONESHOT)
206 void* _adc_handle{}; // adc_oneshot_unit_handle_t
207 void* _cali_handle{}; // adc_cali_handle_t
208 int8_t _cached_adc_unit{-1}; // 0=ADC1, 1=ADC2, -1=uninitialized
209 int8_t _cached_cali_channel{-1}; // cached calibration channel, -1=uninitialized
210#endif
211 };
212 //
213 explicit AdapterGPIOBase(GPIOImpl* impl);
214
215 inline GPIOImpl* impl()
216 {
217 return static_cast<GPIOImpl*>(_impl.get());
218 }
219 inline const GPIOImpl* impl() const
220 {
221 return static_cast<GPIOImpl*>(_impl.get());
222 }
223 inline gpio_num_t rx_pin() const
224 {
225 return impl()->rx_pin();
226 }
227 inline gpio_num_t tx_pin() const
228 {
229 return impl()->tx_pin();
230 }
231 inline bool begin(const gpio::adapter_config_t& cfg)
232 {
233 return impl()->begin(cfg);
234 }
242 inline uint32_t tx_resolution_hz() const
243 {
244 return impl()->rmtTxResolutionHz();
245 }
252 inline uint32_t rx_resolution_hz() const
253 {
254 return impl()->rmtRxResolutionHz();
255 }
256};
257
258} // namespace unit
259} // namespace m5
260#endif // ESP_PLATFORM
261
262#endif
Adapter base.
Identification of functions to be used.
Top level namespace of M5Stack.
Definition test_helper.hpp:20
Unit-related namespace.
Type and enumerator definitions.