grblHAL core  20250806
ioports.c File Reference
#include <math.h>
#include "hal.h"
#include "settings.h"

Data Structures

struct  io_ports_private_t
 
struct  ll_io_port_t
 
struct  io_ports_list_t
 
struct  ff_data
 

Macros

#define MAX_PORTS   (Output_AuxMax - Output_Aux0 + 1)
 

Typedefs

typedef struct io_ports_list_t io_ports_list_t
 

Enumerations

enum  ioport_type_xxx_t { Port_AnalogIn = 0 , Port_AnalogOut , Port_DigitalIn , Port_DigitalOut }
 

Functions

__STATIC_FORCEINLINE io_ports_private_tget_port_data (io_port_type_t type, io_port_direction_t dir)
 
__STATIC_FORCEINLINE uint8_t is_aux (io_ports_private_t *p_data, pin_function_t function)
 
__STATIC_FORCEINLINE uint8_t resolve_portnum (io_ports_private_t *p_data, xbar_t *port)
 
uint8_t ioports_available (io_port_type_t type, io_port_direction_t dir)
 Get number of digital or analog ports available. More...
 
uint8_t ioports_unclaimed (io_port_type_t type, io_port_direction_t dir)
 Get number of unclaimed digital or analog ports available. More...
 
uint8_t ioport_find_free (io_port_type_t type, io_port_direction_t dir, pin_cap_t filter, const char *description)
 find claimable or claimed analog or digital port. Search starts from the last port number. More...
 
xbar_tioport_get_info (io_port_type_t type, io_port_direction_t dir, uint8_t port)
 Return information about a digital or analog port. More...
 
xbar_tioport_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. More...
 
bool ioport_claimable (io_port_type_t type, io_port_direction_t dir, uint8_t port)
 Check if a analog or digital port is available for exclusive use. More...
 
void ioport_assign_function (aux_ctrl_t *aux_ctrl, pin_function_t *function)
 Deprecated - use ioport_set_function() instead. More...
 
void ioport_assign_out_function (aux_ctrl_out_t *aux_ctrl, pin_function_t *function)
 Deprecated - use ioport_set_function() instead. More...
 
bool ioport_set_function (xbar_t *pin, pin_function_t function, driver_caps_t caps)
 Set pin function. More...
 
io_port_cando_t ioports_can_do (void)
 Get basic ioports capabilities. More...
 
bool ioport_can_claim_explicit (void)
 Deprecated - use ioports_can_do() instead. More...
 
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. More...
 
bool ioport_set_description (io_port_type_t type, io_port_direction_t dir, uint8_t port, const char *description)
 Set pin description. More...
 
bool ioport_analog_out (uint8_t port, float value)
 
bool ioport_digital_out (uint8_t port, uint32_t value)
 
int32_t ioport_wait_on_input (io_port_type_t type, uint8_t port, wait_mode_t wait_mode, float timeout)
 
bool ioport_analog_out_config (uint8_t port, pwm_config_t *config)
 
bool ioport_digital_in_config (uint8_t port, gpio_in_config_t *config)
 
bool ioport_enable_irq (uint8_t port, pin_irq_mode_t irq_mode, ioport_interrupt_callback_ptr handler)
 
bool ioport_digital_out_config (uint8_t port, gpio_out_config_t *config)
 
bool ioport_digital_pwm_config (uint8_t port, pwm_config_t *config)
 
__STATIC_FORCEINLINE bool is_match (io_ports_list_t *io_port, io_port_type_t type, io_port_direction_t dir, uint8_t port)
 
__STATIC_FORCEINLINE const char * pnum_to_string (uint8_t port, const char *pnum)
 
bool ioport_remap (io_port_type_t type, io_port_direction_t dir, uint8_t port_from, uint8_t port_to)
 Remap (virtual) port. More...
 
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. More...
 
bool ioports_add_analog (io_analog_t *analog)
 
bool ioports_add_digital (io_digital_t *digital)
 
__STATIC_FORCEINLINE uint_fast16_t invert_pwm (ioports_pwm_t *pwm_data, uint_fast16_t pwm_value)
 calculate inverted pwm value if configured More...
 
bool ioports_precompute_pwm_values (pwm_config_t *config, ioports_pwm_t *pwm_data, uint32_t clock_hz)
 Precompute PWM values for faster conversion. More...
 
uint_fast16_t ioports_compute_pwm_value (ioports_pwm_t *pwm_data, float value)
 Analog value to PWM conversion. More...
 
void ioport_save_input_settings (xbar_t *xbar, gpio_in_config_t *config)
 
void ioport_save_output_settings (xbar_t *xbar, gpio_out_config_t *config)
 
void ioport_setting_changed (setting_id_t id)
 
void ioports_add_settings (driver_settings_load_ptr settings_loaded, setting_changed_ptr setting_changed)
 

Detailed Description

Some wrapper functions for the io_port_t API. They perform the necessary checks for both availability of ports and advanced functionality simplifying plugin code that uses them.

Macro Definition Documentation

◆ MAX_PORTS

#define MAX_PORTS   (Output_AuxMax - Output_Aux0 + 1)

Typedef Documentation

◆ io_ports_list_t

Enumeration Type Documentation

◆ ioport_type_xxx_t

Enumerator
Port_AnalogIn 
Port_AnalogOut 
Port_DigitalIn 
Port_DigitalOut 

Function Documentation

◆ get_port_data()

__STATIC_FORCEINLINE io_ports_private_t* get_port_data ( io_port_type_t  type,
io_port_direction_t  dir 
)

◆ invert_pwm()

__STATIC_FORCEINLINE uint_fast16_t invert_pwm ( ioports_pwm_t pwm_data,
uint_fast16_t  pwm_value 
)

calculate inverted pwm value if configured

Parameters
pwm_datapointer t a spindle_pwm_t structure.
pwm_valuenon inverted PWM value.
Returns
the inverted PWM value to use.

◆ ioport_analog_out()

bool ioport_analog_out ( uint8_t  port,
float  value 
)

◆ ioport_analog_out_config()

bool ioport_analog_out_config ( uint8_t  port,
pwm_config_t config 
)

◆ ioport_assign_function()

void ioport_assign_function ( aux_ctrl_t aux_ctrl,
pin_function_t function 
)

Deprecated - use ioport_set_function() instead.

◆ ioport_assign_out_function()

void ioport_assign_out_function ( aux_ctrl_out_t aux_ctrl,
pin_function_t function 
)

Deprecated - use ioport_set_function() instead.

◆ ioport_can_claim_explicit()

bool ioport_can_claim_explicit ( void  )

Deprecated - use ioports_can_do() instead.

◆ ioport_claim()

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.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
portpointer to a uint8_t holding the ports aux number, returns the actual port number to use if successful.
descriptionpointer to a char constant for the pin description.
Returns
pointer to a xbar_t structure with details about the claimed port if successful, NULL if not.

◆ ioport_claimable()

bool ioport_claimable ( io_port_type_t  type,
io_port_direction_t  dir,
uint8_t  port 
)

Check if a analog or digital port is available for exclusive use.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
porta uint8_t holding the ports aux number.
Returns
TRUE if available, FALSE if not.

◆ ioport_digital_in_config()

bool ioport_digital_in_config ( uint8_t  port,
gpio_in_config_t config 
)

◆ ioport_digital_out()

bool ioport_digital_out ( uint8_t  port,
uint32_t  value 
)

◆ ioport_digital_out_config()

bool ioport_digital_out_config ( uint8_t  port,
gpio_out_config_t config 
)

◆ ioport_digital_pwm_config()

bool ioport_digital_pwm_config ( uint8_t  port,
pwm_config_t config 
)

◆ ioport_enable_irq()

bool ioport_enable_irq ( uint8_t  port,
pin_irq_mode_t  irq_mode,
ioport_interrupt_callback_ptr  handler 
)

◆ ioport_find_free()

uint8_t ioport_find_free ( io_port_type_t  type,
io_port_direction_t  dir,
pin_cap_t  filter,
const char *  description 
)

find claimable or claimed analog or digital port. Search starts from the last port number.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
descriptionpointer to a char constant for the pin description of a previousely claimed port or a port number to be used as the upper limit for the search, or NULL if searching for the first free port.
Returns
the port number if successful, 0xFF (255) if not.

◆ ioport_get_info()

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.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
portthe port aux number.
Returns
pointer to xbar_t struct if successful, NULL if not.

◆ ioport_remap()

bool ioport_remap ( io_port_type_t  type,
io_port_direction_t  dir,
uint8_t  port_from,
uint8_t  port_to 
)

Remap (virtual) port.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
port_fromthe assigned port number.
port_tothe remapped port number. The original port number will be swapped with port_from.
Returns
true if successful, false if original port is already claimed.

◆ ioport_save_input_settings()

void ioport_save_input_settings ( xbar_t xbar,
gpio_in_config_t config 
)

◆ ioport_save_output_settings()

void ioport_save_output_settings ( xbar_t xbar,
gpio_out_config_t config 
)

◆ ioport_set_description()

bool ioport_set_description ( io_port_type_t  type,
io_port_direction_t  dir,
uint8_t  port,
const char *  description 
)

Set pin description.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
portthe port aux number.
descriptionpointer to a char constant for the pin description.

◆ ioport_set_function()

bool ioport_set_function ( xbar_t pin,
pin_function_t  function,
driver_caps_t  caps 
)

Set pin function.

Parameters
portpointer to a xbar_t structure.
functiona pin_function_t enum value.
capspointer to driver_caps_t capability flags.

◆ ioport_setting_changed()

void ioport_setting_changed ( setting_id_t  id)

◆ ioport_wait_on_input()

int32_t ioport_wait_on_input ( io_port_type_t  type,
uint8_t  port,
wait_mode_t  wait_mode,
float  timeout 
)

◆ ioports_add()

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.

◆ ioports_add_analog()

bool ioports_add_analog ( io_analog_t analog)

◆ ioports_add_digital()

bool ioports_add_digital ( io_digital_t digital)

◆ ioports_add_settings()

void ioports_add_settings ( driver_settings_load_ptr  settings_loaded,
setting_changed_ptr  setting_changed 
)

◆ ioports_available()

uint8_t ioports_available ( io_port_type_t  type,
io_port_direction_t  dir 
)

Get number of digital or analog ports available.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
Returns
number of ports available excluding remapped ports but including claimed ports if the API implementation supports that.

◆ ioports_can_do()

io_port_cando_t ioports_can_do ( void  )

Get basic ioports capabilities.

Returns
a io_port_cando_t union.

◆ ioports_compute_pwm_value()

uint_fast16_t ioports_compute_pwm_value ( ioports_pwm_t pwm_data,
float  value 
)

Analog value to PWM conversion.

Parameters
pwm_datapointer to a ioports_pwm_t structure.
valueanalog value to be converted.
Returns
the PWM value to use.

NOTE: ioports_precompute_pwm_values() must be called to precompute values before this function is called. Typically this is done by the ioports initialization code.

◆ ioports_enumerate()

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.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
filtera pin_cap_t union with fields set that must match the port capabilities.
callbackpointer to a ioports_enumerate_callback_ptr function that will be called for each matching port. If the function returns true the enumeration will end.
dataa pointer to context data passed to the callback function.

◆ ioports_precompute_pwm_values()

bool ioports_precompute_pwm_values ( pwm_config_t config,
ioports_pwm_t pwm_data,
uint32_t  clock_hz 
)

Precompute PWM values for faster conversion.

Parameters
configpointer to a pwm_config_t structure.
pwm_datapointer to a ioports_pwm_t structure, to hold the precomputed values.
clock_hztimer clock frequency used for PWM generation.
Returns
true if successful, false if no PWM range possible - driver should then revert to simple on/off control.

◆ ioports_unclaimed()

uint8_t ioports_unclaimed ( io_port_type_t  type,
io_port_direction_t  dir 
)

Get number of unclaimed digital or analog ports available.

Parameters
typeas an io_port_type_t enum value.
diras an io_port_direction_t enum value.
Returns
number of ports available.

◆ is_aux()

__STATIC_FORCEINLINE uint8_t is_aux ( io_ports_private_t p_data,
pin_function_t  function 
)

◆ is_match()

__STATIC_FORCEINLINE bool is_match ( io_ports_list_t io_port,
io_port_type_t  type,
io_port_direction_t  dir,
uint8_t  port 
)

◆ pnum_to_string()

__STATIC_FORCEINLINE const char* pnum_to_string ( uint8_t  port,
const char *  pnum 
)

◆ resolve_portnum()

__STATIC_FORCEINLINE uint8_t resolve_portnum ( io_ports_private_t p_data,
xbar_t port 
)