summaryrefslogtreecommitdiffstats
path: root/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c')
-rw-r--r--bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c200
1 files changed, 200 insertions, 0 deletions
diff --git a/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c b/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c
new file mode 100644
index 0000000000..1381faa047
--- /dev/null
+++ b/bsps/arm/imxrt/mcux-sdk/drivers/dac12/fsl_dac12.c
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 2016, Freescale Semiconductor, Inc.
+ * Copyright 2016-2020 NXP
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "fsl_dac12.h"
+
+/* Component ID definition, used by tools. */
+#ifndef FSL_COMPONENT_ID
+#define FSL_COMPONENT_ID "platform.drivers.dac12"
+#endif
+
+/*******************************************************************************
+ * Prototypes
+ ******************************************************************************/
+
+/*!
+ * @brief Get instance number for DAC12 module.
+ *
+ * @param base DAC12 peripheral base address
+ */
+static uint32_t DAC12_GetInstance(DAC_Type *base);
+
+/*******************************************************************************
+ * Variables
+ ******************************************************************************/
+/*! @brief Pointers to DAC bases for each instance. */
+static DAC_Type *const s_dac12Bases[] = DAC_BASE_PTRS;
+#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
+/*! @brief Pointers to DAC clocks for each instance. */
+static const clock_ip_name_t s_dac12Clocks[] = DAC_CLOCKS;
+#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
+
+/*******************************************************************************
+ * Codes
+ ******************************************************************************/
+static uint32_t DAC12_GetInstance(DAC_Type *base)
+{
+ uint32_t instance;
+
+ /* Find the instance index from base address mappings. */
+ for (instance = 0; instance < ARRAY_SIZE(s_dac12Bases); instance++)
+ {
+ if (s_dac12Bases[instance] == base)
+ {
+ break;
+ }
+ }
+
+ assert(instance < ARRAY_SIZE(s_dac12Bases));
+
+ return instance;
+}
+
+/*!
+ * 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)
+{
+ assert(NULL != info);
+
+ info->fifoSizeInfo =
+ (dac12_fifo_size_info_t)(uint32_t)((DAC_PARAM_FIFOSZ_MASK & base->PARAM) >> DAC_PARAM_FIFOSZ_SHIFT);
+}
+
+/*!
+ * 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)
+{
+ assert(NULL != config);
+
+ uint32_t tmp32;
+
+#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
+ /* Enable the clock. */
+ CLOCK_EnableClock(s_dac12Clocks[DAC12_GetInstance(base)]);
+#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
+
+ tmp32 = DAC_CR_WML(config->fifoWatermarkLevel); /* FIFO watermark level. */
+ switch (config->fifoWorkMode) /* FIFO work mode. */
+ {
+ case kDAC12_FIFOWorkAsNormalMode:
+ tmp32 |= DAC_CR_FIFOEN_MASK;
+ break;
+ case kDAC12_FIFOWorkAsSwingMode:
+ tmp32 |= DAC_CR_FIFOEN_MASK | DAC_CR_SWMD_MASK;
+ break;
+ default: /* kDAC12_FIFODisabled. */
+ break;
+ }
+
+ tmp32 |= DAC_CR_DACRFS(config->referenceVoltageSource) /* Reference voltage source. */
+ | DAC_CR_TRGSEL(config->fifoTriggerMode); /* Trigger mode. */
+
+ base->CR = tmp32;
+
+ /* DACx_CR2. */
+ tmp32 = 0U;
+ /* Reference voltage current. */
+ switch (config->referenceCurrentSource)
+ {
+ case kDAC12_ReferenceCurrentSourceAlt0:
+ tmp32 |= DAC_CR2_IREF_MASK;
+ break;
+ case kDAC12_ReferenceCurrentSourceAlt1:
+ tmp32 |= DAC_CR2_IREF1_MASK;
+ break;
+ case kDAC12_ReferenceCurrentSourceAlt2:
+ tmp32 |= DAC_CR2_IREF2_MASK;
+ break;
+ default: /* kDAC12_ReferenceCurrentSourceDisabled */
+ break;
+ }
+
+ /* Speed mode. */
+ switch (config->speedMode)
+ {
+ case kDAC12_SpeedMiddleMode:
+ tmp32 |= DAC_CR2_BFMS_MASK;
+ break;
+ case kDAC12_SpeedHighMode:
+ tmp32 |= DAC_CR2_BFHS_MASK;
+ break;
+ default: /* kDAC12_SpeedLowMode */
+ break;
+ }
+
+ /* DAC buffered mode needs OPAMP enabled. DAC unbuffered mode needs OPAMP disabled. */
+ if (config->enableAnalogBuffer)
+ {
+ tmp32 |= DAC_CR2_BFEN_MASK; /* OPAMP is used as buffer. */
+ }
+ else
+ {
+ tmp32 |= DAC_CR2_OEN_MASK; /* Output buffer is bypassed. */
+ }
+ base->CR2 = tmp32;
+
+#if !(defined(FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER) && FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER)
+ base->ITRM = DAC_ITRM_TRIM(config->currentReferenceInternalTrimValue);
+#endif /* FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER */
+}
+
+/*!
+ * brief De-initialize the DAC12 module.
+ *
+ * param base DAC12 peripheral base address.
+ */
+void DAC12_Deinit(DAC_Type *base)
+{
+ DAC12_Enable(base, false);
+#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
+ CLOCK_DisableClock(s_dac12Clocks[DAC12_GetInstance(base)]);
+#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
+}
+
+/*!
+ * 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)
+{
+ assert(NULL != config);
+
+ /* Initializes the configure structure to zero. */
+ (void)memset(config, 0, sizeof(*config));
+
+ config->fifoWatermarkLevel = 0U;
+ config->fifoWorkMode = kDAC12_FIFODisabled;
+ config->referenceVoltageSource = kDAC12_ReferenceVoltageSourceAlt1;
+ config->fifoTriggerMode = kDAC12_FIFOTriggerByHardwareMode;
+ config->referenceCurrentSource = kDAC12_ReferenceCurrentSourceAlt0;
+ config->speedMode = kDAC12_SpeedLowMode;
+ config->enableAnalogBuffer = false;
+#if !(defined(FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER) && FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER)
+ config->currentReferenceInternalTrimValue = 0x4;
+#endif /* FSL_FEATURE_DAC12_HAS_NO_ITRM_REGISTER */
+}