rt-thread-official/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_dac12.c

201 lines
6.4 KiB
C

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