M5UnitUnified 0.4.4 git rev:306ddd5
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
18namespace m5 {
19namespace unit {
20namespace gpio {
21
28uint8_t calculate_rmt_clk_div(const uint32_t apb_freq_hz, const uint32_t tick_ns);
29
36uint32_t calculate_rmt_resolution_hz(const uint32_t apb_freq_hz, const uint32_t tick_ns);
37
38} // namespace gpio
39
40// Base class for AdapterGPIO
41class AdapterGPIOBase : public Adapter {
42public:
43 class GPIOImpl : public Adapter::Impl {
44 public:
45 GPIOImpl() = default;
46 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}
47 {
48 }
49 virtual ~GPIOImpl() override;
50
51 inline gpio_num_t rx_pin() const
52 {
53 return _rx_pin;
54 }
55 inline gpio_num_t tx_pin() const
56 {
57 return _tx_pin;
58 }
59 inline gpio::adapter_config_t adapter_config() const
60 {
61 return _adapter_cfg;
62 }
63
64 inline virtual bool begin(const gpio::adapter_config_t& cfg)
65 {
66 return false;
67 }
68
69 //
70 inline virtual m5::hal::error::error_t pinModeRX(const gpio::Mode m) override
71 {
72 return pin_mode(rx_pin(), m);
73 }
74 inline virtual m5::hal::error::error_t writeDigitalRX(const bool high) override
75 {
76 return write_digital(rx_pin(), high);
77 }
78 inline virtual m5::hal::error::error_t readDigitalRX(bool& high) override
79 {
80 return read_digital(rx_pin(), high);
81 }
82 inline virtual m5::hal::error::error_t writeAnalogRX(const uint16_t v) override
83 {
84 return write_analog(rx_pin(), v);
85 }
86 inline virtual m5::hal::error::error_t readAnalogRX(uint16_t& v)
87 {
88 return read_analog(v, rx_pin());
89 }
90 inline virtual m5::hal::error::error_t readAnalogMilliVoltsRX(uint32_t& mv) override
91 {
92 return read_analog_millivolts(mv, rx_pin());
93 }
94
95 inline virtual m5::hal::error::error_t pulseInRX(uint32_t& duration, const int state,
96 const uint32_t timeout_us = 30000) override
97 {
98 return pulse_in(duration, rx_pin(), state, timeout_us);
99 }
100
101 //
102 inline virtual m5::hal::error::error_t pinModeTX(const gpio::Mode m) override
103 {
104 return pin_mode(tx_pin(), m);
105 }
106 inline virtual m5::hal::error::error_t writeDigitalTX(const bool high) override
107 {
108 return write_digital(tx_pin(), high);
109 }
110 inline virtual m5::hal::error::error_t readDigitalTX(bool& high) override
111 {
112 return read_digital(tx_pin(), high);
113 }
114 inline virtual m5::hal::error::error_t writeAnalogTX(const uint16_t v) override
115 {
116 return write_analog(tx_pin(), v);
117 }
118 inline virtual m5::hal::error::error_t readAnalogTX(uint16_t& v)
119 {
120 return read_analog(v, tx_pin());
121 }
122 inline virtual m5::hal::error::error_t readAnalogMilliVoltsTX(uint32_t& mv) override
123 {
124 return read_analog_millivolts(mv, tx_pin());
125 }
126 inline virtual m5::hal::error::error_t pulseInTX(uint32_t& duration, const int state,
127 const uint32_t timeout_us = 30000) override
128 {
129 return pulse_in(duration, tx_pin(), state, timeout_us);
130 }
131
132 protected:
133 m5::hal::error::error_t pin_mode(const gpio_num_t pin, const gpio::Mode m);
134 m5::hal::error::error_t write_digital(const gpio_num_t pin, const bool high);
135 m5::hal::error::error_t read_digital(const gpio_num_t pin, bool& high);
136 m5::hal::error::error_t write_analog(const gpio_num_t pin, const uint16_t value);
137 m5::hal::error::error_t read_analog(uint16_t& value, const gpio_num_t pin);
138 m5::hal::error::error_t read_analog_millivolts(uint32_t& millivolts, const gpio_num_t pin);
139 m5::hal::error::error_t pulse_in(uint32_t& duration, const gpio_num_t pin, const int state,
140 const uint32_t timeout_us);
141
142 protected:
143 m5::hal::error::error_t ensure_adc_handle(const gpio_num_t pin);
144 void release_adc_resources();
145
146 gpio_num_t _rx_pin{(gpio_num_t)-1}, _tx_pin{(gpio_num_t)-1};
147 gpio::adapter_config_t _adapter_cfg{};
148
149#if defined(M5_UNIT_UNIFIED_USING_ADC_ONESHOT)
150 void* _adc_handle{}; // adc_oneshot_unit_handle_t
151 void* _cali_handle{}; // adc_cali_handle_t
152 int8_t _cached_adc_unit{-1}; // 0=ADC1, 1=ADC2, -1=uninitialized
153 int8_t _cached_cali_channel{-1}; // cached calibration channel, -1=uninitialized
154#endif
155 };
156 //
157 explicit AdapterGPIOBase(GPIOImpl* impl);
158
159 inline GPIOImpl* impl()
160 {
161 return static_cast<GPIOImpl*>(_impl.get());
162 }
163 inline const GPIOImpl* impl() const
164 {
165 return static_cast<GPIOImpl*>(_impl.get());
166 }
167 inline gpio_num_t rx_pin() const
168 {
169 return impl()->rx_pin();
170 }
171 inline gpio_num_t tx_pin() const
172 {
173 return impl()->tx_pin();
174 }
175 inline bool begin(const gpio::adapter_config_t& cfg)
176 {
177 return impl()->begin(cfg);
178 }
179};
180
181} // namespace unit
182} // namespace m5
183
184#endif
Adapter base.
uint32_t calculate_rmt_resolution_hz(uint32_t apb_freq_hz, uint32_t tick_ns)
Calculate resolution from desired tick time.
Definition adapter_gpio.cpp:417
uint8_t calculate_rmt_clk_div(uint32_t apb_freq_hz, uint32_t tick_ns)
Calculate clk_div from desired tick time (nanoseconds)
Definition adapter_gpio.cpp:406
Definition adapter_base.hpp:35
Definition adapter_gpio.hpp:43
Definition adapter_gpio.hpp:41
Adapter base class to treat M5HAL and TwoWire,GPIO,Serial,SPI... in the same way.
Identification of functions to be used.
Top level namespace of M5stack.
Definition test_helper.hpp:20
Unit-related namespace.
Unified configuration for RMT v1/v2.
Type and enumerator definitions.
Mode
Pin mode.
Definition types.hpp:61