grblHAL core  20250514
ioports.h
Go to the documentation of this file.
1 /*
2  ioports.h - typedefs, API structure and functions for auxiliary I/O
3 
4  Part of grblHAL
5 
6  Copyright (c) 2021-2025 Terje Io
7 
8  grblHAL is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  grblHAL is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with grblHAL. If not, see <http://www.gnu.org/licenses/>.
20 */
21 
22 #pragma once
23 
24 //#define IOPORTS_KEEP_DEPRECATED
25 
26 #define IOPORT_UNASSIGNED 255
27 
28 typedef enum {
30  Port_Digital = 1
32 
33 typedef enum {
34  Port_Input = 0,
35  Port_Output = 1
37 
42 typedef void (*digital_out_ptr)(uint8_t port, bool on);
43 
49 typedef bool (*analog_out_ptr)(uint8_t port, float value);
50 
61 typedef int32_t (*wait_on_input_ptr)(io_port_type_t type, uint8_t port, wait_mode_t wait_mode, float timeout);
62 
73 typedef int32_t (*ll_wait_on_input_ptr)(uint8_t port, wait_mode_t wait_mode, float timeout);
74 
75 
82 typedef void (*set_pin_description_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port, const char *s);
83 
90 typedef void (*ll_set_pin_description_ptr)(io_port_direction_t dir, uint8_t port, const char *s);
91 
99 typedef xbar_t *(*get_pin_info_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port);
100 
108 typedef xbar_t *(*ll_get_pin_info_ptr)(io_port_direction_t dir, uint8_t port);
109 
117 typedef bool (*claim_port_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t *port, const char *description);
118 
126 typedef bool (*ll_claim_port_ptr)(io_port_direction_t dir, uint8_t port, uint8_t user_port, const char *description);
127 
128 
136 typedef bool (*swap_pins_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port_from, uint8_t port_to);
137 
142 typedef void (*ioport_interrupt_callback_ptr)(uint8_t port, bool state);
143 
150 typedef bool (*ioport_register_interrupt_handler_ptr)(uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr interrupt_callback);
151 
159 typedef bool (*ll_ioport_register_interrupt_handler_ptr)(uint8_t port, uint8_t user_port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr interrupt_callback);
160 
161 typedef bool (*ioports_enumerate_callback_ptr)(xbar_t *properties, uint8_t port, void *data);
162 
164 typedef struct {
165  uint8_t num_digital_in;
166  uint8_t num_digital_out;
167  uint8_t num_analog_in;
168  uint8_t num_analog_out;
177 } io_port_t;
178 
179 typedef union {
183 } driver_caps_t __attribute__ ((__transparent_union__));
184 
185 typedef union {
186  uint8_t io;
187  struct {
188  uint8_t claim_explicit :1,
193  };
195 
198 xbar_t *ioport_get_info (io_port_type_t type, io_port_direction_t dir, uint8_t port);
199 xbar_t *ioport_claim (io_port_type_t type, io_port_direction_t dir, uint8_t *port, const char *description);
201 uint8_t ioport_find_free (io_port_type_t type, io_port_direction_t dir, pin_cap_t filter, const char *description);
203 bool ioport_set_description (io_port_type_t type, io_port_direction_t dir, uint8_t port, const char *description);
204 bool ioport_set_function (xbar_t *pin, pin_function_t function, driver_caps_t caps);
205 bool ioport_analog_out (uint8_t port, float value);
206 bool ioport_digital_out (uint8_t port, uint32_t value);
207 int32_t ioport_wait_on_input (io_port_type_t type, uint8_t port, wait_mode_t wait_mode, float timeout);
208 bool ioport_analog_out_config (uint8_t port, pwm_config_t *config);
209 bool ioport_digital_pwm_config (uint8_t port, pwm_config_t *config);
210 bool ioport_digital_in_config (uint8_t port, gpio_in_config_t *config);
211 bool ioport_enable_irq (uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr handler);
212 bool ioport_digital_out_config (uint8_t port, gpio_out_config_t *config);
213 
214 struct io_ports_data;
215 
216 typedef struct {
217  uint8_t n_ports;
218  uint8_t n_start;
219  uint8_t idx_last;
220 #ifdef IOPORTS_KEEP_DEPRECATED
221  uint8_t *map;
222 #endif
224 
225 typedef struct io_ports_data {
226  union {
228  struct {
231  };
232  };
233 #ifdef IOPORTS_KEEP_DEPRECATED
234  const char *pnum;
235  const char *(*get_pnum)(struct io_ports_data *data, uint8_t port);
236 #endif
238 
239 typedef struct {
245 } io_analog_t;
246 
247 typedef struct {
254 } io_digital_t;
255 
257 typedef struct {
258  uint32_t f_clock;
259  uint_fast16_t period;
260  uint_fast16_t off_value;
261  uint_fast16_t min_value;
262  uint_fast16_t max_value;
263  float min;
265  bool invert_pwm;
266  bool always_on;
267 } ioports_pwm_t;
268 
269 bool ioports_add_analog (io_analog_t *ports);
270 bool ioports_add_digital (io_digital_t *ports);
271 void ioports_add_settings (driver_settings_load_ptr settings_loaded, setting_changed_ptr setting_changed);
275 uint8_t ioports_map_reverse (io_ports_detail_t *type, uint8_t port);
276 bool ioports_precompute_pwm_values (pwm_config_t *config, ioports_pwm_t *pwm_data, uint32_t clock_hz);
277 uint_fast16_t ioports_compute_pwm_value (ioports_pwm_t *pwm_data, float value);
278 #ifdef IOPORTS_KEEP_DEPRECATED
279 #define iports_get_pnum(type, port) type.get_pnum(&type, port)
280 #define ioports_map(type, port) ( type.map ? type.map[port] : port )
281 #endif
282 
283 //
284 bool ioports_add (io_ports_data_t *ports, io_port_type_t type, uint8_t n_in, uint8_t n_out);
285 bool ioport_can_claim_explicit (void);
286 void ioport_assign_function (aux_ctrl_t *aux_ctrl, pin_function_t *function);
287 void ioport_assign_out_function (aux_ctrl_out_t *aux_ctrl, pin_function_t *function);
288 //
289 
290 /*EOF*/
pin_function_t
Definition: crossbar.h:27
pin_irq_mode_t
Pin interrupt modes, may be or'ed when reporting pin capability.
Definition: crossbar.h:560
wait_mode_t
M66 Allowed L-parameter values.
Definition: gcode.h:287
bool(* analog_out_ptr)(uint8_t port, float value)
Pointer to function for setting an analog output.
Definition: ioports.h:49
bool ioport_set_description(io_port_type_t type, io_port_direction_t dir, uint8_t port, const char *description)
Set pin description.
Definition: ioports.c:466
void(* ll_set_pin_description_ptr)(io_port_direction_t dir, uint8_t port, const char *s)
Pointer to function for setting pin description for a digital or analog port.
Definition: ioports.h:90
uint8_t ioports_available(io_port_type_t type, io_port_direction_t dir)
Get number of digital or analog ports available.
Definition: ioports.c:157
bool ioport_digital_out(uint8_t port, uint32_t value)
Definition: ioports.c:479
bool ioports_add(io_ports_data_t *ports, io_port_type_t type, uint8_t n_in, uint8_t n_out)
Deprecated - use ioports_add_analog() or ioports_add_digital() instead.
Definition: ioports.c:852
void ioports_add_settings(driver_settings_load_ptr settings_loaded, setting_changed_ptr setting_changed)
Definition: ioports.c:1409
bool ioports_add_analog(io_analog_t *ports)
Definition: ioports.c:864
io_port_direction_t
Definition: ioports.h:33
@ Port_Input
0
Definition: ioports.h:34
@ Port_Output
1
Definition: ioports.h:35
bool(* swap_pins_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port_from, uint8_t port_to)
Pointer to function for swapping two digital or analog ports.
Definition: ioports.h:136
uint8_t ioport_find_free(io_port_type_t type, io_port_direction_t dir, pin_cap_t filter, const char *description)
find first free or claimed digital or analog port.
Definition: ioports.c:213
bool(* ioports_enumerate_callback_ptr)(xbar_t *properties, uint8_t port, void *data)
Definition: ioports.h:161
bool ioport_digital_in_config(uint8_t port, gpio_in_config_t *config)
Definition: ioports.c:500
int32_t(* ll_wait_on_input_ptr)(uint8_t port, wait_mode_t wait_mode, float timeout)
Pointer to function for reading a digital or analog input.
Definition: ioports.h:73
bool(* ll_ioport_register_interrupt_handler_ptr)(uint8_t port, uint8_t user_port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr interrupt_callback)
Pointer to function for registering or deregistering an interrupt handler for a digital input port.
Definition: ioports.h:159
io_port_type_t
Definition: ioports.h:28
@ Port_Analog
0
Definition: ioports.h:29
@ Port_Digital
1
Definition: ioports.h:30
void ioport_assign_out_function(aux_ctrl_out_t *aux_ctrl, pin_function_t *function)
Deprecated - use ioport_set_function() instead.
Definition: ioports.c:333
bool ioport_analog_out_config(uint8_t port, pwm_config_t *config)
Definition: ioports.c:492
void ioport_assign_function(aux_ctrl_t *aux_ctrl, pin_function_t *function)
Deprecated - use ioport_set_function() instead.
Definition: ioports.c:316
void ioport_save_output_settings(xbar_t *xbar, gpio_out_config_t *config)
Definition: ioports.c:1033
xbar_t * ioport_claim(io_port_type_t type, io_port_direction_t dir, uint8_t *port, const char *description)
Claim a digital or analog port for exclusive use.
Definition: ioports.c:289
uint8_t ioports_unclaimed(io_port_type_t type, io_port_direction_t dir)
Get number of unclaimed digital or analog ports available.
Definition: ioports.c:172
bool ioport_digital_out_config(uint8_t port, gpio_out_config_t *config)
Definition: ioports.c:513
uint_fast16_t ioports_compute_pwm_value(ioports_pwm_t *pwm_data, float value)
Analog value to PWM conversion.
Definition: ioports.c:971
xbar_t *(* get_pin_info_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port)
Pointer to function for getting information about a digital or analog port. NOTE: The port informati...
Definition: ioports.h:99
void ioport_setting_changed(setting_id_t id)
Definition: ioports.c:1258
xbar_t *(* ll_get_pin_info_ptr)(io_port_direction_t dir, uint8_t port)
Pointer to function for getting information about a digital or analog port. NOTE: The port informati...
Definition: ioports.h:108
uint8_t ioports_map_reverse(io_ports_detail_t *type, uint8_t port)
int32_t ioport_wait_on_input(io_port_type_t type, uint8_t port, wait_mode_t wait_mode, float timeout)
Definition: ioports.c:487
bool ioports_add_digital(io_digital_t *ports)
Definition: ioports.c:893
bool(* ioport_register_interrupt_handler_ptr)(uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr interrupt_callback)
Pointer to function for registering or deregistering an interrupt handler for a digital input port.
Definition: ioports.h:150
bool(* ll_claim_port_ptr)(io_port_direction_t dir, uint8_t port, uint8_t user_port, const char *description)
Pointer to function for claiming a digital or analog port for exclusive use.
Definition: ioports.h:126
struct io_ports_data io_ports_data_t
bool ioport_can_claim_explicit(void)
Deprecated - use ioports_can_do() instead.
Definition: ioports.c:415
io_port_cando_t ioports_can_do(void)
Get basic ioports capabilities.
Definition: ioports.c:400
bool ioport_enable_irq(uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr handler)
Definition: ioports.c:508
int32_t(* wait_on_input_ptr)(io_port_type_t type, uint8_t port, wait_mode_t wait_mode, float timeout)
Pointer to function for reading a digital or analog input.
Definition: ioports.h:61
bool ioport_set_function(xbar_t *pin, pin_function_t function, driver_caps_t caps)
Set pin function.
Definition: ioports.c:352
void(* ioport_interrupt_callback_ptr)(uint8_t port, bool state)
Pointer to callback function for input port interrupt events.
Definition: ioports.h:142
bool ioports_precompute_pwm_values(pwm_config_t *config, ioports_pwm_t *pwm_data, uint32_t clock_hz)
Precompute PWM values for faster conversion.
Definition: ioports.c:942
bool(* claim_port_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t *port, const char *description)
Pointer to function for claiming a digital or analog port for exclusive use.
Definition: ioports.h:117
void(* set_pin_description_ptr)(io_port_type_t type, io_port_direction_t dir, uint8_t port, const char *s)
Pointer to function for setting pin description for a digital or analog port.
Definition: ioports.h:82
bool ioport_analog_out(uint8_t port, float value)
Definition: ioports.c:474
bool ioports_enumerate(io_port_type_t type, io_port_direction_t dir, pin_cap_t filter, ioports_enumerate_callback_ptr callback, void *data)
Enumerate ports.
Definition: ioports.c:428
xbar_t * ioport_get_info(io_port_type_t type, io_port_direction_t dir, uint8_t port)
Return information about a digital or analog port.
Definition: ioports.c:253
void ioport_save_input_settings(xbar_t *xbar, gpio_in_config_t *config)
Definition: ioports.c:991
bool ioport_digital_pwm_config(uint8_t port, pwm_config_t *config)
Definition: ioports.c:521
void(* digital_out_ptr)(uint8_t port, bool on)
Pointer to function for setting a digital output.
Definition: ioports.h:42
void(* setting_changed_ptr)(setting_id_t id)
Definition: settings.h:1056
setting_id_t
Definition: settings.h:46
void(* driver_settings_load_ptr)(void)
Definition: settings.h:1064
Definition: crossbar.h:737
Definition: crossbar.h:727
/a cfg_data argument to /a xbar_config_ptr for gpio input pins
Definition: crossbar.h:687
/a cfg_data argument to /a xbar_config_ptr for gpio output pins
Definition: crossbar.h:694
Definition: ioports.h:239
io_ports_data_t * ports
Definition: ioports.h:240
ll_wait_on_input_ptr wait_on_input
Handler for reading a digital or analog input.
Definition: ioports.h:242
ll_set_pin_description_ptr set_pin_description
Handler for setting a description of an auxiliary pin.
Definition: ioports.h:243
ll_get_pin_info_ptr get_pin_info
Handler for getting information about an auxiliary pin.
Definition: ioports.h:244
analog_out_ptr analog_out
Handler for setting an analog output.
Definition: ioports.h:241
Definition: ioports.h:247
io_ports_data_t * ports
Definition: ioports.h:248
ll_wait_on_input_ptr wait_on_input
Handler for reading a digital or analog input.
Definition: ioports.h:251
ll_set_pin_description_ptr set_pin_description
Handler for setting a description of an auxiliary pin.
Definition: ioports.h:252
ll_get_pin_info_ptr get_pin_info
Handler for getting information about an auxiliary pin.
Definition: ioports.h:253
digital_out_ptr digital_out
Handler for setting a digital output.
Definition: ioports.h:249
ll_ioport_register_interrupt_handler_ptr register_interrupt_handler
Definition: ioports.h:250
Properties and handlers for auxiliary digital and analog I/O.
Definition: ioports.h:164
claim_port_ptr claim
Optional handler for claiming an auxiliary pin for exclusive use.
Definition: ioports.h:174
wait_on_input_ptr wait_on_input
Optional handler for reading a digital or analog input.
Definition: ioports.h:171
uint8_t num_digital_in
Deprecated, use ioports_unclaimed() to get count.
Definition: ioports.h:165
swap_pins_ptr swap_pins
Optional handler for swapping pins.
Definition: ioports.h:175
uint8_t num_analog_out
Deprecated, use ioports_unclaimed() to get count.
Definition: ioports.h:168
set_pin_description_ptr set_pin_description
Optional handler for setting a description of an auxiliary pin.
Definition: ioports.h:172
analog_out_ptr analog_out
Optional handler for setting an analog output.
Definition: ioports.h:170
uint8_t num_digital_out
Deprecated, use ioports_unclaimed() to get count.
Definition: ioports.h:166
digital_out_ptr digital_out
Optional handler for setting a digital output.
Definition: ioports.h:169
ioport_register_interrupt_handler_ptr register_interrupt_handler
Definition: ioports.h:176
uint8_t num_analog_in
Deprecated, use ioports_unclaimed() to get count.
Definition: ioports.h:167
get_pin_info_ptr get_pin_info
Optional handler for getting information about an auxiliary pin.
Definition: ioports.h:173
Definition: ioports.h:225
io_ports_detail_t cfg[2]
Definition: ioports.h:227
io_ports_detail_t out
Definition: ioports.h:230
io_ports_detail_t in
Definition: ioports.h:229
Definition: ioports.h:216
uint8_t n_start
Definition: ioports.h:218
uint8_t n_ports
Definition: ioports.h:217
uint8_t idx_last
Definition: ioports.h:219
Precalculated values that may be set/used by HAL driver to speed up analog input to PWM conversions....
Definition: ioports.h:257
uint_fast16_t period
Definition: ioports.h:259
uint_fast16_t off_value
NOTE: this value holds the inverted version if software PWM inversion is enabled by the driver.
Definition: ioports.h:260
uint32_t f_clock
Definition: ioports.h:258
bool invert_pwm
NOTE: set (by driver) when inversion is done in code.
Definition: ioports.h:265
uint_fast16_t min_value
Definition: ioports.h:261
float min
Minimum analog input value.
Definition: ioports.h:263
bool always_on
Definition: ioports.h:266
uint_fast16_t max_value
Definition: ioports.h:262
float pwm_gradient
Definition: ioports.h:264
/a cfg_data argument to /a xbar_config_ptr for PWM pins
Definition: crossbar.h:701
Definition: crossbar.h:745
Definition: system.h:162
Definition: coolant_control.h:27
Definition: ioports.h:179
control_signals_t * control
Definition: ioports.h:180
limit_signals_t * limits
Definition: ioports.h:182
coolant_state_t * coolant
Definition: ioports.h:181
Definition: ioports.h:185
uint8_t io
Definition: ioports.h:186
uint8_t digital_out
Definition: ioports.h:189
uint8_t claim_explicit
Definition: ioports.h:188
uint8_t analog_out
Definition: ioports.h:190
uint8_t wait_on_input
Definition: ioports.h:191
uint8_t configure
Definition: ioports.h:192
Limit switches struct, consists of four packed axes_signals_t structs in 32 bits.
Definition: nuts_bolts.h:176
Definition: crossbar.h:618