blob: 611a15e60cebc223e6d84a8248ada08387a6585d [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_LIB_DIF_DIF_GPIO_H_
#define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_GPIO_H_
/**
* @file
* @brief <a href="/hw/ip/gpio/doc/">GPIO</a> Device Interface Functions
*/
#include <stddef.h>
#include <stdint.h>
#include "sw/device/lib/base/macros.h"
#include "sw/device/lib/base/mmio.h"
#include "sw/device/lib/dif/dif_base.h"
#include "sw/device/lib/dif/autogen/dif_gpio_autogen.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
enum {
/**
* Number of pins.
*
* This constant is used to check that arguments of type `dif_gpio_pin_t` are
* within bounds.
*/
kDifGpioNumPins = 32,
};
/**
* A GPIO interrupt request trigger.
*
* Each GPIO pin has an associated interrupt that can be independently
* configured to be edge and/or level sensitive. This enum defines supported
* configurations for these interrupts.
*/
typedef enum dif_gpio_irq_trigger {
/**
* Trigger on rising edge.
*/
kDifGpioIrqTriggerEdgeRising,
/**
* Trigger on falling edge.
*/
kDifGpioIrqTriggerEdgeFalling,
/**
* Trigger when input is low.
*/
kDifGpioIrqTriggerLevelLow,
/**
* Trigger when input is high.
*/
kDifGpioIrqTriggerLevelHigh,
/**
* Trigger on rising and falling edges.
*/
kDifGpioIrqTriggerEdgeRisingFalling,
/**
* Trigger on rising edge or when the input is low.
*/
kDifGpioIrqTriggerEdgeRisingLevelLow,
/**
* Trigger on falling edge or when the input is high.
*/
kDifGpioIrqTriggerEdgeFallingLevelHigh,
} dif_gpio_irq_trigger_t;
/**
* A GPIO pin index, ranging from 0 to `kDifGpioNumPins - 1`.
*/
typedef uint32_t dif_gpio_pin_t;
/**
* State for all 32 GPIO pins, given as bit fields.
*
* The Nth bit represents the state of the Nth pin.
*
* This type is also used as a vector of `dif_toggle_t`s, to indicate
* toggle state across all 32 pins. A set bit corresponds to
* `kDifGpioToggleEnabled`.
*/
typedef uint32_t dif_gpio_state_t;
/**
* A mask for selecting GPIO pins.
*
* If the Nth bit is enabled, then the Nth pin is selected by the mask.
*/
typedef uint32_t dif_gpio_mask_t;
/**
* Resets a GPIO device.
*
* Resets the given GPIO device by setting its configuration registers to
* reset values. Disables interrupts, output, and input filter.
*
* @param gpio A GPIO handle.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_reset(const dif_gpio_t *gpio);
/**
* Configures interrupt triggers for a set of pins.
*
* This function configures interrupt triggers, i.e. rising-edge, falling-edge,
* level-high, and level-low, for the pins given by the mask. Note that
* interrupt of the pin must also be enabled to generate interrupts.
*
* @param gpio A GPIO handle.
* @param mask Mask that identifies the pins whose interrupt triggers will be
* configured.
* @param trigger New configuration of interrupt triggers.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_irq_set_trigger(const dif_gpio_t *gpio,
dif_gpio_mask_t mask,
dif_gpio_irq_trigger_t trigger);
/**
* Reads from a pin.
*
* The value returned by this function is independent of the output enable
* setting and includes the effects of the input noise filter and the load on
* the pin.
*
* @param gpio A GPIO handle.
* @param pin A GPIO pin.
* @param[out] state Pin value.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_read(const dif_gpio_t *gpio, dif_gpio_pin_t pin,
bool *state);
/**
* Reads from all pins.
*
* The value returned by this function is independent of the output enable
* setting and includes the effects of the input noise filter and the load on
* the pins.
*
* @param gpio A GPIO handle.
* @param[out] state Pin values.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_read_all(const dif_gpio_t *gpio, dif_gpio_state_t *state);
/**
* Writes to a pin.
*
* The actual value on the pin depends on the output enable setting.
*
* @param gpio A GPIO handle.
* @param pin A GPIO pin.
* @param state Value to write.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_write(const dif_gpio_t *gpio, dif_gpio_pin_t pin,
bool state);
/**
* Writes to all pins.
*
* The actual values on the pins depend on the output enable setting.
*
* @param gpio A GPIO handle.
* @param state Value to write.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_write_all(const dif_gpio_t *gpio, dif_gpio_state_t state);
/**
* Writes to the pins identified by a mask.
*
* The actual values on the pins depend on the output enable setting.
*
* @param gpio A GPIO handle.
* @param mask Mask that identifies the pins to write to.
* @param state Value to write.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_write_masked(const dif_gpio_t *gpio, dif_gpio_mask_t mask,
dif_gpio_state_t state);
/**
* Sets output enable mode of a pin.
*
* @param gpio A GPIO handle.
* @param pin A GPIO pin.
* @param state Output mode of the pin.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_output_set_enabled(const dif_gpio_t *gpio,
dif_gpio_pin_t pin,
dif_toggle_t state);
/**
* Sets output modes of all pins.
*
* @param gpio A GPIO handle.
* @param state Output modes of the pins.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_output_set_enabled_all(const dif_gpio_t *gpio,
dif_gpio_state_t state);
/**
* Sets the output modes of the pins identified by a mask.
*
* @param gpio A GPIO handle.
* @param mask Mask that identifies the pins whose output modes will be set.
* @param state Output modes of the pins.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_output_set_enabled_masked(const dif_gpio_t *gpio,
dif_gpio_mask_t mask,
dif_gpio_state_t state);
/**
* Enable noise filter for GPIO inputs.
*
* When enabled, changes in the pin value will be ignored unless stable
* for 16 cycles.
*
* @param gpio A GPIO handle.
* @param mask Mask that identifies pins to set the filter state of.
* @param state The new toggle state for the filter.
* @return The result of the operation.
*/
OT_WARN_UNUSED_RESULT
dif_result_t dif_gpio_input_noise_filter_set_enabled(const dif_gpio_t *gpio,
dif_gpio_mask_t mask,
dif_toggle_t state);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_GPIO_H_