| // 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_ |