summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.h418
1 files changed, 418 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.h b/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.h
new file mode 100644
index 0000000000..f467ec038c
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.h
@@ -0,0 +1,418 @@
+/*
+ * Copyright (c) 2016, Freescale Semiconductor, Inc.
+ * Copyright 2016-2021 NXP
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef _FSL_DAC12_H_
+#define _FSL_DAC12_H_
+
+#include "fsl_common.h"
+
+/*!
+ * @addtogroup dac12
+ * @{
+ */
+
+/*! @file */
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+
+/*! @name Driver version */
+/*@{*/
+/*! @brief DAC12 driver version 2.1.0. */
+#define FSL_DAC12_DRIVER_VERSION (MAKE_VERSION(2, 1, 0))
+/*@}*/
+
+/*! @brief Define "write 1 to clear" flags. */
+#define DAC12_CR_W1C_FLAGS_MASK (DAC_CR_OVFF_MASK | DAC_CR_UDFF_MASK)
+/*! @brief Define all the flag bits in DACx_CR register. */
+#define DAC12_CR_ALL_FLAGS_MASK (DAC12_CR_W1C_FLAGS_MASK | DAC_CR_WMF_MASK | DAC_CR_NEMPTF_MASK | DAC_CR_FULLF_MASK)
+
+/*!
+ * @brief DAC12 flags.
+ */
+enum _dac12_status_flags
+{
+ kDAC12_OverflowFlag = DAC_CR_OVFF_MASK, /*!< FIFO overflow status flag, which indicates that more data has been
+ written into FIFO than it can hold. */
+ kDAC12_UnderflowFlag = DAC_CR_UDFF_MASK, /*!< FIFO underflow status flag, which means that there is a new trigger
+ after the FIFO is nearly empty. */
+ kDAC12_WatermarkFlag = DAC_CR_WMF_MASK, /*!< FIFO wartermark status flag, which indicates the remaining FIFO data is
+ less than the watermark setting. */
+ kDAC12_NearlyEmptyFlag = DAC_CR_NEMPTF_MASK, /*!< FIFO nearly empty flag, which means there is only one data
+ remaining in FIFO. */
+ kDAC12_FullFlag = DAC_CR_FULLF_MASK /*!< FIFO full status flag, which means that the FIFO read pointer equals the
+ write pointer, as the write pointer increase. */
+};
+
+/*!
+ * @brief DAC12 interrupts.
+ */
+enum _dac12_interrupt_enable
+{
+ kDAC12_UnderOrOverflowInterruptEnable = DAC_CR_UVIE_MASK, /*!< Underflow and overflow interrupt enable. */
+ kDAC12_WatermarkInterruptEnable = DAC_CR_WTMIE_MASK, /*!< Watermark interrupt enable. */
+ kDAC12_NearlyEmptyInterruptEnable = DAC_CR_EMPTIE_MASK, /*!< Nearly empty interrupt enable. */
+ kDAC12_FullInterruptEnable = DAC_CR_FULLIE_MASK /*!< Full interrupt enable. */
+};
+
+/*!
+ * @brief DAC12 FIFO size information provided by hardware.
+ */
+typedef enum _dac12_fifo_size_info
+{
+ kDAC12_FIFOSize2 = 0U, /*!< FIFO depth is 2. */
+ kDAC12_FIFOSize4 = 1U, /*!< FIFO depth is 4. */
+ kDAC12_FIFOSize8 = 2U, /*!< FIFO depth is 8. */
+ kDAC12_FIFOSize16 = 3U, /*!< FIFO depth is 16. */
+ kDAC12_FIFOSize32 = 4U, /*!< FIFO depth is 32. */
+ kDAC12_FIFOSize64 = 5U, /*!< FIFO depth is 64. */
+ kDAC12_FIFOSize128 = 6U, /*!< FIFO depth is 128. */
+ kDAC12_FIFOSize256 = 7U, /*!< FIFO depth is 256. */
+} dac12_fifo_size_info_t;
+
+/*!
+ * @brief DAC12 FIFO work mode.
+ */
+typedef enum _dac12_fifo_work_mode
+{
+ kDAC12_FIFODisabled = 0U, /*!< FIFO disabled and only one level buffer is enabled. Any data written from this buffer
+ goes to conversion. */
+ kDAC12_FIFOWorkAsNormalMode = 1U, /*!< Data will first read from FIFO to buffer then go to conversion. */
+ kDAC12_FIFOWorkAsSwingMode = 2U /*!< In Swing mode, the FIFO must be set up to be full. In Swing back mode, a
+ trigger changes the read pointer to make it swing between the FIFO Full and
+ Nearly Empty state. That is, the trigger increases the read pointer till FIFO
+ is nearly empty and decreases the read pointer till the FIFO is full. */
+} dac12_fifo_work_mode_t;
+
+/*!
+ * @brief DAC12 reference voltage source.
+ */
+typedef enum _dac12_reference_voltage_source
+{
+ kDAC12_ReferenceVoltageSourceAlt1 = 0U, /*!< The DAC selects DACREF_1 as the reference voltage. */
+ kDAC12_ReferenceVoltageSourceAlt2 = 1U, /*!< The DAC selects DACREF_2 as the reference voltage. */
+} dac12_reference_voltage_source_t;
+
+/*!
+ * @brief DAC12 FIFO trigger mode.
+ */
+typedef enum _dac12_fifo_trigger_mode
+{
+ kDAC12_FIFOTriggerByHardwareMode = 0U, /*!< Buffer would be triggered by hardware. */
+ kDAC12_FIFOTriggerBySoftwareMode = 1U, /*!< Buffer would be triggered by software. */
+} dac12_fifo_trigger_mode_t;
+
+/*!
+ * @brief DAC internal reference current source.
+ *
+ * Analog module needs reference current to keep working . Such reference current can generated by IP itself, or by
+ * on-chip PMC's "reference part". If no current reference be selected, analog module can’t working normally ,even when
+ * other register can still be assigned, DAC would waste current but no function.
+ * To make the DAC work, either kDAC12_ReferenceCurrentSourceAltx should be selected.
+ */
+typedef enum _dac12_reference_current_source
+{
+ kDAC12_ReferenceCurrentSourceDisabled = 0U, /*!< None of reference current source is enabled. */
+ kDAC12_ReferenceCurrentSourceAlt0 = 1U, /*!< Use the internal reference current generated by the module itself. */
+ kDAC12_ReferenceCurrentSourceAlt1 = 2U, /*!< Use the ZTC(Zero Temperature Coefficient) reference current generated
+ by on-chip power management module. */
+ kDAC12_ReferenceCurrentSourceAlt2 = 3U, /*!< Use the PTAT(Proportional To Absolution Temperature) reference current
+ generated by power management module. */
+} dac12_reference_current_source_t;
+
+/*!
+ * @brief DAC analog buffer speed mode for conversion.
+ */
+typedef enum _dac12_speed_mode
+{
+ kDAC12_SpeedLowMode = 0U, /*!< Low speed mode. */
+ kDAC12_SpeedMiddleMode = 1U, /*!< Middle speed mode. */
+ kDAC12_SpeedHighMode = 2U, /*!< High speed mode. */
+} dac12_speed_mode_t;
+
+/*!
+ * @brief DAC12 hardware information.
+ */
+typedef struct _dac12_hardware_info
+{
+ dac12_fifo_size_info_t fifoSizeInfo; /*!< The number of words in this device's DAC buffer. */
+} dac12_hardware_info_t;
+
+/*!
+ * @brief DAC12 module configuration.
+ *
+ * Actually, the most fields are for FIFO buffer.
+ */
+typedef struct
+{
+ uint32_t fifoWatermarkLevel; /*!< FIFO's watermark, the max value can be the hardware FIFO size. */
+ dac12_fifo_work_mode_t fifoWorkMode; /*!< FIFI's work mode about pointers. */
+ dac12_reference_voltage_source_t referenceVoltageSource; /*!< Select the reference voltage source. */
+ dac12_fifo_trigger_mode_t fifoTriggerMode; /*! Select the trigger mode for FIFO. */
+
+ /* Analog part configuration. */
+ dac12_reference_current_source_t referenceCurrentSource; /*!< Select the reference current source. */
+ dac12_speed_mode_t speedMode; /*!< Select the speed mode for conversion. */
+ bool enableAnalogBuffer; /*!< Enable analog buffer for high drive. */
+#if !(defined(FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER) && FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER)
+ uint32_t currentReferenceInternalTrimValue; /*!< Internal reference current trim value. 3-bit value is available.*/
+#endif /* FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER */
+} dac12_config_t;
+
+/*******************************************************************************
+ * API
+ ******************************************************************************/
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*!
+ * @name Initialization and de-initialization
+ * @{
+ */
+
+/*!
+ * @brief Get hardware information about this module.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param info Pointer to info structure, see to #dac12_hardware_info_t.
+ */
+void DAC12_GetHardwareInfo(DAC_Type *base, dac12_hardware_info_t *info);
+
+/*!
+ * @brief Initialize the DAC12 module.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param config Pointer to configuration structure, see to #dac12_config_t.
+ */
+void DAC12_Init(DAC_Type *base, const dac12_config_t *config);
+
+/*!
+ * @brief Initializes the DAC12 user configuration structure.
+ *
+ * This function initializes the user configuration structure to a default value. The default values are:
+ * @code
+ * config->fifoWatermarkLevel = 0U;
+ * config->fifoWorkMode = kDAC12_FIFODisabled;
+ * config->referenceVoltageSource = kDAC12_ReferenceVoltageSourceAlt1;
+ * config->fifoTriggerMode = kDAC12_FIFOTriggerByHardwareMode;
+ * config->referenceCurrentSource = kDAC12_ReferenceCurrentSourceAlt0;
+ * config->speedMode = kDAC12_SpeedLowMode;
+ * config->speedMode = false;
+ * config->currentReferenceInternalTrimValue = 0x4;
+ * @endcode
+ * @param config Pointer to the configuration structure. See "dac12_config_t".
+ */
+void DAC12_GetDefaultConfig(dac12_config_t *config);
+
+/*!
+ * @brief De-initialize the DAC12 module.
+ *
+ * @param base DAC12 peripheral base address.
+ */
+void DAC12_Deinit(DAC_Type *base);
+
+/*!
+ * @brief Enable the DAC12's converter or not.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param enable Enable the DAC12's converter or not.
+ */
+static inline void DAC12_Enable(DAC_Type *base, bool enable)
+{
+ if (enable)
+ {
+ base->CR = (base->CR & ~DAC12_CR_W1C_FLAGS_MASK) | DAC_CR_DACEN_MASK;
+ }
+ else
+ {
+ base->CR &= ~DAC_CR_DACEN_MASK;
+ }
+}
+
+/*!
+ * @brief Reset all internal logic and registers.
+ *
+ * @param base DAC12 peripheral base address.
+ */
+static inline void DAC12_ResetConfig(DAC_Type *base)
+{
+ base->CR = DAC_CR_SWRST_MASK;
+}
+
+/*!
+ * @brief Reset the FIFO pointers.
+ *
+ * FIFO pointers should only be reset when the DAC12 is disabled. This function can be used to configure both pointers
+ * to the same address to reset the FIFO as empty.
+ *
+ * @param base DAC12 peripheral base address.
+ */
+static inline void DAC12_ResetFIFO(DAC_Type *base)
+{
+ /* FIFO pointers should only be reset when the module is disabled. */
+ base->CR = (base->CR & ~DAC12_CR_W1C_FLAGS_MASK) | DAC_CR_FIFORST_MASK;
+}
+
+/* @} */
+
+/*!
+ * @name Status
+ * @{
+ */
+
+/*!
+ * @brief Get status flags.
+ *
+ * @param base DAC12 peripheral base address.
+ * @return Mask of current status flags. See to #_dac12_status_flags.
+ */
+static inline uint32_t DAC12_GetStatusFlags(DAC_Type *base)
+{
+ return (DAC12_CR_ALL_FLAGS_MASK & base->CR);
+}
+
+/*!
+ * @brief Clear status flags.
+ *
+ * Note: Not all the flags can be cleared by this API. Several flags need special condition to clear them according to
+ * target chip's reference manual document.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param flags Mask of status flags to be cleared. See to #_dac12_status_flags.
+ */
+static inline void DAC12_ClearStatusFlags(DAC_Type *base, uint32_t flags)
+{
+ base->CR |= (flags & DAC12_CR_W1C_FLAGS_MASK);
+}
+
+/* @} */
+
+/*!
+ * @name Interrupts
+ * @{
+ */
+
+/*!
+ * @brief Enable interrupts.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param mask Mask value of interrupts to be enabled. See to #_dac12_interrupt_enable.
+ */
+static inline void DAC12_EnableInterrupts(DAC_Type *base, uint32_t mask)
+{
+ base->CR = (base->CR & ~DAC12_CR_W1C_FLAGS_MASK) | mask;
+}
+
+/*!
+ * @brief Disable interrupts.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param mask Mask value of interrupts to be disabled. See to #_dac12_interrupt_enable.
+ */
+static inline void DAC12_DisableInterrupts(DAC_Type *base, uint32_t mask)
+{
+ base->CR &= ~mask;
+}
+
+/* @} */
+
+/*!
+ * @name DMA control
+ * @{
+ */
+
+/*!
+ * @brief Enable DMA or not.
+ *
+ * When DMA is enabled, the DMA request will be generated by original interrupts. The interrupts will not be presented
+ * on this module at the same time.
+ */
+static inline void DAC12_EnableDMA(DAC_Type *base, bool enable)
+{
+ if (enable)
+ {
+ base->CR = (base->CR & ~DAC12_CR_W1C_FLAGS_MASK) | DAC_CR_DMAEN_MASK;
+ }
+ else
+ {
+ base->CR &= ~DAC_CR_DMAEN_MASK;
+ }
+}
+
+/* @} */
+
+/*!
+ * @name Functional feature
+ * @{
+ */
+
+/*!
+ * @brief Set data into the entry of FIFO buffer.
+ *
+ * When the DAC FIFO is disabled, and the one entry buffer is enabled, the DAC converts the data in the buffer to analog
+ * output voltage. Any write to the DATA register will replace the data in the buffer and push data to analog conversion
+ * without trigger support.
+ * When the DAC FIFO is enabled. Writing data would increase the write pointer of FIFO. Also, the data would be restored
+ * into the FIFO buffer.
+ *
+ * @param base DAC12 peripheral base address.
+ * @param value Setting value into FIFO buffer.
+ */
+static inline void DAC12_SetData(DAC_Type *base, uint32_t value)
+{
+ /* The module is connected internally to a 32-bit interface.
+ * For the 8-bit or 16-bit, the write might be ignored. */
+ base->DATA = DAC_DATA_DATA0(value);
+}
+
+/*!
+ * @brief Do trigger the FIFO by software.
+ *
+ * When the DAC FIFO is enabled, and software trigger is used. Doing trigger would increase the read pointer, and the
+ * data in the entry pointed by read pointer would be converted as new output.
+ *
+ * @param base DAC12 peripheral base address.
+ */
+static inline void DAC12_DoSoftwareTrigger(DAC_Type *base)
+{
+ base->CR = (base->CR & ~DAC12_CR_W1C_FLAGS_MASK) | DAC_CR_SWTRG_MASK;
+}
+
+/*!
+ * @brief Get the current read pointer of FIFO.
+ *
+ * @param base DAC12 peripheral base address.
+ * @return Read pointer index of FIFO buffer.
+ */
+static inline uint32_t DAC12_GetFIFOReadPointer(DAC_Type *base)
+{
+ return (DAC_PTR_DACRFP_MASK & base->PTR) >> DAC_PTR_DACRFP_SHIFT;
+}
+
+/*!
+ * @brief Get the current write pointer of FIFO.
+ *
+ * @param base DAC12 peripheral base address.
+ * @return Write pointer index of FIFO buffer
+ */
+static inline uint32_t DAC12_GetFIFOWritePointer(DAC_Type *base)
+{
+ return (DAC_PTR_DACWFP_MASK & base->PTR) >> DAC_PTR_DACWFP_SHIFT;
+}
+
+/* @} */
+
+#if defined(__cplusplus)
+}
+#endif
+/*!
+ * @}
+ */
+#endif /* _FSL_DAC12_H_ */