| // 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_PATTGEN_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_DIF_DIF_PATTGEN_H_ |
| |
| /** |
| * @file |
| * @brief <a href="/hw/ip/pattgen/doc/">Pattern Generator</a> Device Interface |
| * Functions |
| */ |
| |
| #include <stdint.h> |
| |
| #include "sw/device/lib/dif/dif_base.h" |
| |
| #include "sw/device/lib/dif/autogen/dif_pattgen_autogen.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| /** |
| * Helper X macro for defining enums and case statements related to Pattern |
| * Generator channels. If an additional channel is ever added to the hardware, |
| * this list can be updated. |
| */ |
| #define DIF_PATTGEN_CHANNEL_LIST(X) \ |
| X(0) \ |
| X(1) |
| |
| /** |
| * Helper macro for defining a `dif_pattgen_channel_t` enumeration constant. |
| * @channel_ Pattern Generator channel of the enumeration constant. |
| */ |
| #define PATTGEN_CHANNEL_ENUM_INIT_(channel_) \ |
| kDifPattgenChannel##channel_ = channel_, |
| |
| /** |
| * A Pattern Generator channel. |
| */ |
| typedef enum dif_pattgen_channel { |
| DIF_PATTGEN_CHANNEL_LIST(PATTGEN_CHANNEL_ENUM_INIT_) |
| } dif_pattgen_channel_t; |
| |
| #undef PATTGEN_CHANNEL_ENUM_INIT_ |
| |
| /** |
| * The polarity of a Pattern Generator channel. |
| */ |
| typedef enum dif_pattgen_polarity { |
| /** |
| * Low polarity indicates the output data signal (PDA) changes on a falling |
| * output clock (PCL) edge. |
| */ |
| kDifPattgenPolarityLow = 0, |
| /** |
| * High polarity indicates the output data signal (PDA) changes on a rising |
| * output clock (PCL) edge. |
| */ |
| kDifPattgenPolarityHigh = 1, |
| /** |
| * Number of polarity values, used for argument validation. |
| */ |
| kDifPattgenPolarityCount = 2, |
| } dif_pattgen_polarity_t; |
| |
| /** |
| * Runtime configuration for a Pattern Generator channel. |
| */ |
| typedef struct dif_pattgen_channel_config { |
| /** |
| * The polarity of the channel. |
| */ |
| dif_pattgen_polarity_t polarity; |
| /** |
| * The I/O clock divisor that determines the frequency of channel's clock. |
| * |
| * Specifically, the output clock frequency (f_pcl) is computed from the I/O |
| * clock frequency (f_io_clk): |
| * |
| * f_pcl = f_io_clk / (2 * (clock_divisor + 1)) |
| */ |
| uint32_t clock_divisor; |
| /** |
| * The lower 32-bits of the seed pattern. |
| * |
| * Some bits may go unused depending on the value of `seed_pattern_length`. |
| */ |
| uint32_t seed_pattern_lower_word; |
| /** |
| * The upper 32-bits of the seed pattern. |
| * |
| * Some, or all, bits may go unused depending on the value of |
| * `seed_pattern_length`. |
| */ |
| uint32_t seed_pattern_upper_word; |
| /** |
| * The length of the seed pattern. |
| * |
| * Units: bits |
| * Valid range: [1, 64] |
| */ |
| uint8_t seed_pattern_length; |
| /** |
| * The number of times to repeat the pattern. |
| * |
| * Valid range: [1, 1024] |
| */ |
| uint16_t num_pattern_repetitions; |
| } dif_pattgen_channel_config_t; |
| |
| /** |
| * Configures a Pattern Generator channel. |
| * |
| * This should be called once for each channel to be configured. |
| * |
| * Since writes to channel configuration registers have no effect when the |
| * channel is enabled, this function will return `kDifError` if the channel is |
| * enabled. |
| * |
| * @param pattgen A Pattern Generator handle. |
| * @param channel The channel to configure. |
| * @param config Runtime configuration parameters. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_pattgen_configure_channel(const dif_pattgen_t *pattgen, |
| dif_pattgen_channel_t channel, |
| dif_pattgen_channel_config_t config); |
| |
| /** |
| * Sets the enablement state of a Pattern Generator channel. |
| * |
| * @param pattgen A Pattern Generator handle. |
| * @param channel The channel to set the enablement state of. |
| * @param enabled The enablement state to configure the channel in. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_pattgen_channel_set_enabled(const dif_pattgen_t *pattgen, |
| dif_pattgen_channel_t channel, |
| dif_toggle_t enabled); |
| |
| /** |
| * Gets the enablement state of a Pattern Generator channel. |
| * |
| * @param pattgen A Pattern Generator handle. |
| * @param channel The channel to get the enablement state of. |
| * @param[out] is_enabled The enablement state of the channel. |
| * @return The result of the operation. |
| */ |
| OT_WARN_UNUSED_RESULT |
| dif_result_t dif_pattgen_channel_get_enabled(const dif_pattgen_t *pattgen, |
| dif_pattgen_channel_t channel, |
| dif_toggle_t *is_enabled); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // OPENTITAN_SW_DEVICE_LIB_DIF_DIF_PATTGEN_H_ |