/* * 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 */ }