meh

Fork of mbed by mbed official

Revision:
82:6473597d706e
Child:
90:cb3d968589d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TARGET_K64F/TARGET_Freescale/TARGET_KPSDK_MCUS/TARGET_KPSDK_CODE/hal/adc/fsl_adc_hal.h	Mon Apr 07 18:28:36 2014 +0100
@@ -0,0 +1,857 @@
+/*
+ * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * o Redistributions of source code must retain the above copyright notice, this list
+ *   of conditions and the following disclaimer.
+ *
+ * o Redistributions in binary form must reproduce the above copyright notice, this
+ *   list of conditions and the following disclaimer in the documentation and/or
+ *   other materials provided with the distribution.
+ *
+ * o Neither the name of Freescale Semiconductor, Inc. nor the names of its
+ *   contributors may be used to endorse or promote products derived from this
+ *   software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __FSL_ADC_HAL_H__
+#define __FSL_ADC_HAL_H__
+
+#include <assert.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include "fsl_adc_features.h"
+#include "fsl_device_registers.h"
+
+/*!
+ * @addtogroup adc_hal
+ * @{
+ */
+
+/*! @file*/
+
+/*******************************************************************************
+ * Definitions
+ ******************************************************************************/
+
+/*! @brief Defines the selection of the clock source that ADC module uses.*/
+typedef enum _adc_clock_source_mode
+{
+    kAdcClockSourceBusClk        = 0U,  /*!< Use bus clock.*/
+    kAdcClockSourceBusClk2       = 1U,  /*!< Use bus clock / 2.*/
+    kAdcClockSourceAlternate     = 2U,  /*!< Use the optional external clock.*/
+    kAdcClockSourceAsynchrounous = 3U,  /*!< Use ADC's internal asynchronous clock. */
+} adc_clock_source_mode_t;
+
+/*! @brief Defines the selection of the clock divider.*/
+typedef enum _adc_clock_divider_mode
+{
+    kAdcClockDivider1 = 0U,   /*!< Divide 1.*/
+    kAdcClockDivider2 = 1U,   /*!< Divide 2.*/
+    kAdcClockDivider4 = 2U,   /*!< Divide 4.*/
+    kAdcClockDivider8 = 3U,   /*!< Divide 8.*/
+} adc_clock_divider_mode_t;
+
+/*! @brief Defines the selection of the voltage source that ADC module uses.*/
+typedef enum _adc_reference_voltage_mode
+{
+    kAdcVoltageVref = 0U,   /*!< Use V_REFH & V_REFL as ref source pin.*/
+    kAdcVoltageValt = 1U,   /*!< Use V_ALTH & V_REFL as ref source pin.*/
+} adc_reference_voltage_mode_t;
+
+/*! @brief Defines the selection of the long sample extra cycle configuration.*/
+typedef enum _adc_long_sample_mode
+{
+    kAdcLongSampleExtra20 = 0U,  /*!< Extra 20 cycles, total 24 cycles, default.*/
+    kAdcLongSampleExtra12 = 1U,  /*!< Extra 12 cycles.*/
+    kAdcLongSampleExtra6  = 2U,  /*!< Extra  6 cycles.*/
+    kAdcLongSampleExtra2  = 3U,  /*!< Extra  2 cycles.*/
+} adc_long_sample_mode_t;
+
+/*! @brief Defines the selection of the sample resolution.*/
+typedef enum _adc_resolution_mode
+{
+    kAdcSingleDiff8or9   = 0U, /*!<  8-bits in single-end or  9-bits in differential.*/
+    kAdcSingleDiff12or13 = 1U, /*!< 12-bits in single-end or 13-bits in differential.*/
+    kAdcSingleDiff10or11 = 2U, /*!< 10-bits in single-end or 11-bits in differential.*/
+    kAdcSingleDiff16     = 3U, /*!< 16-bits both in single-end and differential.*/
+} adc_resolution_mode_t;
+
+/*! @brief Defines the selection of the A/B group mux.*/
+typedef enum _adc_group_mux_mode
+{
+    kAdcChannelMuxA = 0U, /*!< Mux A group is active.*/
+    kAdcChannelMuxB = 1U, /*!< Mux B group is active.*/
+} adc_group_mux_mode_t;
+
+/*! @brief Defines the selection of the time in a hard average mode.*/
+typedef enum _adc_hw_average_mode
+{
+    kAdcHwAverageCount4  = 0U, /*!<  Average the result after accumulating  4 conversion.*/
+    kAdcHwAverageCount8  = 1U, /*!<  Average the result after accumulating  8 conversion.*/
+    kAdcHwAverageCount16 = 2U, /*!<  Average the result after accumulating 16 conversion.*/
+    kAdcHwAverageCount32 = 3U, /*!<  Average the result after accumulating 32 conversion.*/
+} adc_hw_average_mode_t;
+
+/*! @brief Defines the selection of the channel inside the ADC module.*/
+typedef enum _adc_channel_mode
+{
+    kAdcChannel0  = 0U,    /*!< ADC channel 0.*/
+    kAdcChannell  = 1U,    /*!< ADC channel 1.*/
+    kAdcChannel2  = 2U,    /*!< ADC channel 2.*/
+    kAdcChannel3  = 3U,    /*!< ADC channel 3.*/
+    kAdcChannel4  = 4U,    /*!< ADC channel 4.*/
+    kAdcChannel5  = 5U,    /*!< ADC channel 5.*/
+    kAdcChannel6  = 6U,    /*!< ADC channel 6.*/
+    kAdcChannel7  = 7U,    /*!< ADC channel 7.*/
+    kAdcChannel8  = 8U,    /*!< ADC channel 8.*/
+    kAdcChannel9  = 9U,    /*!< ADC channel 9.*/
+    kAdcChannel10 = 10U,   /*!< ADC channel 10.*/
+    kAdcChannel11 = 11U,   /*!< ADC channel 11.*/
+    kAdcChannel12 = 12U,   /*!< ADC channel 12.*/
+    kAdcChannel13 = 13U,   /*!< ADC channel 13.*/
+    kAdcChannel14 = 14U,   /*!< ADC channel 14.*/
+    kAdcChannel15 = 15U,   /*!< ADC channel 15.*/
+    kAdcChannel16 = 16U,   /*!< ADC channel 16.*/
+    kAdcChannel17 = 17U,   /*!< ADC channel 17.*/
+    kAdcChannel18 = 18U,   /*!< ADC channel 18.*/
+    kAdcChannel19 = 19U,   /*!< ADC channel 19.*/
+    kAdcChannel20 = 20U,   /*!< ADC channel 20.*/
+    kAdcChannel21 = 21U,   /*!< ADC channel 21.*/
+    kAdcChannel22 = 22U,   /*!< ADC channel 22.*/
+    kAdcChannel23 = 23U,   /*!< ADC channel 23.*/
+    kAdcChannelTemperature          = 26U,  /*!< Internal temperature sensor.*/
+    kAdcChannelBandgap              = 27U,  /*!< Internal band gap.*/
+    kAdcChannelReferenceVoltageHigh = 29U,  /*!< Internal ref voltage High.*/
+    kAdcChannelReferenceVoltageLow  = 30U,  /*!< Internal ref voltage L.*/
+    kAdcChannelDisable              = 31U   /*!< Disable the sample process.*/
+} adc_channel_mode_t;
+
+/*! @brief Defines the status returned from the ADC API.*/
+typedef enum _adc_status
+{
+    kStatus_ADC_Success = 0U,
+    kStatus_ADC_InvalidArgument = 1U,/*!< Parameter is not available for the current configuration.*/
+    kStatus_ADC_Failed = 2U /*!< Function operation failed. */
+} adc_status_t;
+
+#if FSL_FEATURE_ADC_HAS_PGA
+/*! @brief Defines the selection of the Programmable Gain Amplifier mode.*/
+typedef enum _adc_pga_mode
+{
+    kAdcPga1  = 0U, /*!< Gain is 1*/
+    kAdcPga2  = 1U, /*!< Gain is 2*/
+    kAdcPga4  = 2U, /*!< Gain is 4*/
+    kAdcPga8  = 3U, /*!< Gain is 8*/
+    kAdcPga16 = 4U, /*!< Gain is 16*/
+    kAdcPga32 = 5U, /*!< Gain is 32*/
+    kAdcPga64 = 6U  /*!< Gain is 64*/
+} adc_pga_mode_t;
+#endif /* FSL_FEATURE_ADC_HAS_PGA */
+
+/*******************************************************************************
+ * API
+ ******************************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*!
+ * @brief Starts the calibration process.
+ *
+ * This function clears the calibration flag bit and sets the enable bit 
+ * to start the calibration.
+ *
+ * @param instance ADC instance ID.
+ */
+adc_status_t adc_hal_start_calibration(uint32_t instance);
+
+/*!
+ * @brief Ends the calibration process.
+ *
+ * This function clears the calibration enable bit to end the calibration.
+ *
+ * @param instance ADC instance ID.
+ */
+static inline void adc_hal_end_calibration(uint32_t instance)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC3_CAL(instance, 0U);
+}
+
+/*!
+ * @brief Gets and calculates the plus-side calibration parameter.
+ * 
+ * This function  gets the CLP0 - CLP4 and CLPS, accumulates them, and 
+ * returns the value that can be set to the PG directly. 
+ *
+ * @param instance ADC instance ID.
+ * @return the value that can be set to PG directly.
+ */
+uint32_t adc_hal_get_calibration_PG(uint32_t instance);
+
+/*!
+ * @brief Sets the plus-side calibration parameter to the ADC instance.
+ * 
+ * This function sets the PG register directly.
+ *
+ * @param instance ADC instance ID.
+ * @param val the value that can be set to PG directly.
+ */
+static inline void adc_hal_set_calibration_PG(uint32_t instance, uint32_t val)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    HW_ADC_PG_WR(instance, val); 
+}
+
+/*!
+ * @brief Gets and calculates the minus-side calibration parameter.
+ * 
+ * This function gets the CLM0 - CLM4 and CLMS, accumulates them, and 
+ * returns the value that can be set to the MG directly. 
+ *
+ * @param instance ADC instance ID.
+ * @return the value that can be set to MG directly.
+ */
+uint32_t adc_hal_get_calibration_MG(uint32_t instance);
+
+/*!
+ * @brief Sets the minus-side calibration parameter to the ADC instance.
+ * 
+ * This function sets the MG register directly.
+ *
+ * @param instance ADC instance ID.
+ * @param val the value that can be set to MG directly.
+ */
+static inline void adc_hal_set_calibration_MG(uint32_t instance, uint32_t val)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    HW_ADC_MG_WR(instance, val);
+}
+
+/*!
+ * @brief Gets the offset value after the auto-calibration.
+ *
+ * If the user wants to adjust the offset value according to the application, 
+ * the origin offset value will be a reference. 
+ *
+ * @param instance ADC instance ID.
+ * @return The offset value created by auto-calibration.
+ */
+static inline uint32_t adc_hal_get_calibration_offset(uint32_t instance)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    return BR_ADC_OFS_OFS(instance);
+}
+
+/*!
+ * @brief Sets the offset value for manual calibration.
+ * 
+ * This function is to set the user selected or calibration generated offset
+ * error correction value. The value set here is subtracted from the conversion
+ * and the result is transferred into the result registers (Rn). If the result
+ * is above the maximum or below the minimum result value, it is forced to the
+ * appropriate limit for the current mode of operation.
+ *
+ * @param instance ADC instance ID.
+ * @param value The manual offset value.
+ */
+static inline void adc_hal_set_calibration_offset(uint32_t instance, 
+        uint32_t value)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_OFS_OFS(instance, value);
+}
+
+/*!
+ * @brief Sets the selection of the clock source.
+ *
+ * The selection of ADC clock source can see to the type definition of 
+ * adc_clock_source_mode_t. 
+ * This function selects the input clock source to generate the internal 
+ * clock, ADCK. Note that when the ADACK clock source is selected, it does not
+ * have to be activated prior to the start of the conversion. When it is
+ * selected and it is not activated prior to start a conversion , the
+ * asynchronous clock will be activated at the start of a conversion and shuts
+ * off when conversions are terminated. In this case, there is an associated
+ * clock startup delay each time the clock source is re-activated.
+ *
+ * @param instance ADC instance ID.
+ * @param mode The indicated clock source mode.
+ */
+static inline void adc_hal_set_clock_source_mode(uint32_t instance, 
+        adc_clock_source_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG1_ADICLK(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Switches the asynchronous clock on/off.
+ *
+ * When enables the ADC's asynchronous clock source and the clock source output 
+ * regardless of the conversion and input clock select status of the ADC. Based 
+ * on MCU configuration, the asynchronous clock may be used by other modules. 
+ * Setting this mode allows the clock to be used even while the ADC is idle or 
+ * operating from a different clock source. Also, latency of initiating a single
+ * or first-continuous conversion with the asynchronous clock selected is
+ * reduced since the ADACK clock is already operational.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_asynchronous_clock(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG2_ADACKEN(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Sets the selection of the clock divider.
+ *
+ * The selection of ADC's clock divider can see to the type definition of the
+ * adc_clock_divider_mode_t.
+ * This function selects the divide ratio used by the ADC to generate the 
+ * internal clock ADCK.
+ *
+ * @param instance ADC instance ID.
+ * @param mode The selection of the divider.
+ */
+static inline void adc_hal_set_clock_divider_mode(uint32_t instance, 
+        adc_clock_divider_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG1_ADIV(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Sets the selection of the reference voltage source.
+ *
+ * The selection of ADC's reference voltage can see to the type definition of 
+ * adc_reference_voltage_mode_t.
+ * This function  selects the voltage reference source used for conversions.
+ * 
+ * @param instance ADC instance ID.
+ * @param mode The selection of the reference voltage source.
+ */
+static inline void adc_hal_set_reference_voltage_mode(uint32_t instance, 
+        adc_reference_voltage_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_REFSEL(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Switches the high speed mode on/off .
+ *
+ * This function configures the ADC for  high speed operations. The 
+ * conversion sequence is altered (2 ADCK cycles added to the conversion time) 
+ * to allow higher speed conversion clocks.
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_high_speed(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG2_ADHSC(instance, (isEnabled ? 1U : 0U)); 
+}
+
+/*!
+ * @brief Switch the long sample mode on/off.
+ *
+ * This function selects between the different sample times based on the 
+ * conversion mode selected. It adjusts the sample period to allow 
+ * higher impedance inputs to be accurately sampled or to maximize conversion
+ * speed for lower impedance inputs. Longer sample times can also be used to 
+ * lower overall power consumption if the continuous conversions are enabled and the
+ * high conversion rates are not required. In fact this will be able to charge
+ * the SAR in a timely manner way without affecting the SAR configuration.
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_long_sample(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG1_ADLSMP(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Sets the selection of the long sample mode.
+ *
+ * The selection of ADC long sample mode can see to the type definition of the
+ * adc_long_sample_mode_t.
+ * This function selects the long sample mode that indicating the different
+ * count of extra ADCK cycles are needed.
+ * 
+ * @param instance ADC instance ID.
+ * @param mode The selection of long sample mode.
+ */
+static inline void adc_hal_set_long_sample_mode(uint32_t instance, 
+        adc_long_sample_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG2_ADLSTS(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Switches  the low power mode on/off.
+ *
+ * This function controls the power configuration of the successive approximation
+ * converter. This optimizes power consumption when higher sample rates are not 
+ * required.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_low_power(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG1_ADLPC(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Sets the selection of the resolution mode.
+ *
+ * The selection of ADC resolution mode can see to the type definition of the
+ * adc_resolution_mode_t.
+ * This function selects the ADC resolution mode. Note that the 
+ * differential conversion is different to single-end conversion.
+ * 
+ * @param instance ADC instance ID.
+ * @param mode The selection of resolution mode.
+ */
+static inline void adc_hal_set_resolution_mode(uint32_t instance, 
+        adc_resolution_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CFG1_MODE(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Switches the continuous conversion mode on/off.
+ *
+ * This function configures the continuous conversions or sets of conversions if 
+ * the hardware average function is enabled after initiating a conversion.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_continuous_conversion(uint32_t instance,
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC3_ADCO(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches the hardware trigger mode on/off .
+ *
+ * This function selects the type of trigger used for initiating a conversion. 
+ * Two types of triggers can be selected: software trigger and hardware trigger. 
+ * When software trigger is selected, a conversion is initiated following a 
+ * write to SC1A. When hardware trigger is selected, a conversion is initiated 
+ * following the assertion of the external events. The event will come through
+ * the signal on the line of ADHWT input after a pulse of ADHWTSn input inside SOC.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_hw_trigger(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_ADTRG(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches the hardware average mode on/off.
+ *
+ * This function  enables the hardware average function of the ADC.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_hw_average(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC3_AVGE(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Sets the selection of the hardware average mode.
+ *
+ * The selection of ADC hardware average mode can see to the type definition 
+ * of the adc_hw_average_mode_t.
+ * This function determines how many ADC conversions are averaged to create 
+ * the ADC average result.
+ *
+ * @param instance ADC instance ID.
+ * @param mode The selection of hardware average mode.
+ */
+static inline void adc_hal_set_hw_average_mode(uint32_t instance, 
+        adc_hw_average_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC3_AVGS(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Switches  the hardware compare mode on/off.
+ *
+ * This function  enables the compare function.
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_hw_compare(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_ACFE(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches the hardware compare greater configuration on/off .
+ *
+ * This function configures the compare function to check the conversion 
+ * result relative to the compare value register(s) (CV1 and CV2). To enable
+ * will configure greater than or equal to threshold, outside range inclusive
+ * and inside range inclusive functionality based on the values placed in the
+ * CV1 and CV2 registers. Otherwise, it will configure less than threshold,
+ * outside range not inclusive and inside range not inclusive functionality
+ * based on the values placed in the CV1 and CV2 registers.
+ * 
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_hw_compare_greater(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_ACFGT(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches the hardware compare range configuration on/off .
+ *
+ * This function configures the compare function to check if the conversion
+ * result of the input being monitored is either inside or outside the range 
+ * formed by the compare value registers (CV1 and CV2). However, the actual
+ * compare range should be determined alone with the function of
+ * adc_hal_configure_hw_compare_greater() as well.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_hw_compare_in_range(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_ACREN(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Sets the value1 in the hardware compare.
+ *
+ * This function  sets the value of the CV1 register.
+ *
+ * @param instance ADC instance ID.
+ * @param value The setting value.
+ */
+static inline void adc_hal_set_hw_compare_value1(uint32_t instance, uint32_t value)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CV1_CV(instance, value);
+}
+
+/*!
+ * @brief Sets the value2 in the hardware compare.
+ *
+ * This function  sets the value of the CV2 register.
+ *
+ * @param instance ADC instance ID.
+ * @param value The setting value.
+ */
+static inline void adc_hal_set_hw_compare_value2(uint32_t instance, uint32_t value)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_CV2_CV(instance, value);
+}
+
+/*!
+ * @brief Switches  the ADC DMA trigger on/off.
+ *
+ * When DMA is enabled, it asserts the ADC DMA request during the ADC 
+ * conversion complete event noted by the assertion of any of the ADC COCO flags.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_dma(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_SC2_DMAEN(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches off the ADC channel conversion.
+ *
+ * Here the "NUll" channel is set to the conversion channel.
+ *
+ * @param instance ADC instance ID.
+ * @param group The group mux index.
+ */
+static inline void adc_hal_disable(uint32_t instance, uint32_t group)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    BW_ADC_SC1n_ADCH(instance, group, (uint32_t)(kAdcChannelDisable));
+}
+
+/*!
+ * @brief Sets the channel number and switches on the conversion.
+ *
+ * When the available channel is set, the conversion begins to execute.
+ * 
+ * @param instance ADC instance ID.
+ * @param group The group mux index.
+ * @param mode The selection of channel number.
+ * @param isDifferential the selection of differential input.
+ */
+static inline void adc_hal_enable(uint32_t instance, uint32_t group, 
+        adc_channel_mode_t mode, bool isDifferential)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    BW_ADC_SC1n_DIFF(instance, group, (isDifferential ? 1U : 0U));
+    /* Set new channel will restart the conversion. */
+    BW_ADC_SC1n_ADCH(instance, group, (uint32_t)(mode));    
+}
+
+/*!
+ * @brief Switches the ADC interrupt trigger on/off .
+ *
+ * This function  enables conversion complete interrupts. When COCO is 
+ * set while the respective AIEN is high, an interrupt is asserted.
+ *
+ * @param instance ADC instance ID.
+ * @param group The group mux index.
+ * @param inEnable The switcher.
+ */
+static inline void adc_hal_configure_interrupt(uint32_t instance, uint32_t group, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    BW_ADC_SC1n_AIEN(instance, group, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Checks whether the ADC is in process.
+ *
+ * This function  indicates that a conversion or hardware averaging is in 
+ * progress. ADACT is set when a conversion is initiated and cleared when a 
+ * conversion is completed or aborted. Note that if the continuous conversion
+ * is been use, this function will always return true.
+ * 
+ * @param instance ADC instance ID.
+ * @return true if it is.
+ */
+static inline bool adc_hal_is_in_process(uint32_t instance)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    return BR_ADC_SC2_ADACT(instance);
+}
+
+/*!
+ * @brief Checks whether the channel conversion is complete.
+ *
+ * This function  indicates whether each conversion is completed.
+ * 
+ * @param instance ADC instance ID.
+ * @param group The grout mux index.
+ * @return true if it is.
+ */
+static inline bool adc_hal_is_conversion_completed(uint32_t instance, uint32_t group)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    return BR_ADC_SC1n_COCO(instance, group);
+}
+
+/*!
+ * @brief Checks whether the calibration  failed.
+ *
+ * This function displays the result of the calibration sequence.
+ * 
+ * @param instance ADC instance ID.
+ * @return true if it is.
+ */
+static inline bool adc_hal_is_calibration_fail(uint32_t instance)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    return BR_ADC_SC3_CALF(instance);
+}
+
+/*!
+ * @brief Gets the conversion value.
+ *
+ * This function returns the conversion value kept in the Rn Register. Unused bits 
+ * in the Rn register are cleared in unsigned right justified modes and carry 
+ * the sign bit (MSB) in sign extended 2's complement modes.
+ * 
+ * @param instance ADC instance ID.
+ * @param group The group mux index.
+ */
+static inline uint32_t adc_hal_get_conversion_value(uint32_t instance, 
+        uint32_t group)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    return BR_ADC_Rn_D(instance, group);
+}
+
+/*!
+ * @brief Sets the current group mux that executes the conversion.
+ *
+ * ADC Mux select bit changes the ADC group setting to select between 
+ * alternate sets of ADC channels. It will activate group A or group B.
+ * 
+ * @param instance ADC instance ID.
+ * @param group The group mux index.
+ */
+static inline void adc_hal_set_group_mux(uint32_t instance, adc_group_mux_mode_t group)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    assert(group < HW_ADC_SC1n_COUNT);
+    BW_ADC_CFG2_MUXSEL(instance, (uint32_t)group);
+}
+
+#if FSL_FEATURE_ADC_HAS_PGA
+/*!
+ * @brief Switches on/off to enable the ADC Programmable Gain Amplifier.
+ *
+ * The Programmable Gain Amplifier (PGA) is designed to increase the dynamic 
+ * range by amplifying low-amplitude signals before they are fed to the 16-bit 
+ * SAR ADC. The gain of this amplifier ranges between 1 to 64 in (2^N) steps.
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_pga(uint32_t instance, bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_PGA_PGAEN(instance, (isEnabled ? 1U : 0U));
+}
+
+/*!
+ * @brief Switches on/off to enable the PGA chopping mode.
+ *
+ * The PGA employs chopping to remove/reduce offset and 1/f noise and offers an 
+ * offset measurement configuration that aids the offset calibration. 
+ *
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_pga_chopping(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_PGA_PGACHPb(instance, (isEnabled ? 0U : 1U));
+}
+
+/*!
+ * @brief Switches on/off to enable the PGA in a low power mode.
+ *
+ * This function  configures the PGA running in low power mode.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_pga_in_low_power(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_PGA_PGALPb(instance, (isEnabled ? 0U : 1U));
+}
+
+/*!
+ * @brief Switches on/off to enable the offset measurement mode.
+ *
+ * When this function is asserted, the PGA disconnects  from the external 
+ * inputs and auto-configures into offset measurement mode. With this function is
+ * asserted,  run the ADC in recommended settings and enable maximum
+ * hardware averaging to get the PGA offset number. The output  is 
+ * (PGA offset * (64+1)) for a given PGA setting.
+ * 
+ * @param instance ADC instance ID.
+ * @param isEnabled The switcher.
+ */
+static inline void adc_hal_configure_pga_offset_measurement(uint32_t instance, 
+        bool isEnabled)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_PGA_PGAOFSM(instance, (isEnabled ? 0U : 1U));
+}
+
+/*!
+ * @brief Sets the selection of the PGA gain mode.
+ *
+ * The selection of the PGA gain mode can see to the type definition of the adc_pga_mode_t.
+ * 
+ * @param instance ADC instance ID.
+ * @param mode The selection of gain.
+ */
+static inline void adc_hal_set_pga_gain_mode(uint32_t instance, 
+        adc_pga_mode_t mode)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    BW_ADC_PGA_PGAG(instance, (uint32_t)(mode));
+}
+
+/*!
+ * @brief Gets the selection of the current PGA gain mode.
+ *
+ * This function  returns the selection of the current PGA gain mode status.
+ * 
+ * @param instance ADC instance ID.
+ * @return Current selection of gain mode.
+ */
+static inline adc_pga_mode_t adc_hal_get_pga_gain_mode(uint32_t instance)
+{
+    assert(instance < HW_ADC_INSTANCE_COUNT);
+    
+    return (adc_pga_mode_t)(BR_ADC_PGA_PGAG(instance));
+}
+
+#endif /* FSL_FEATURE_ADC_HAS_PGA */
+
+#if defined(__cplusplus)
+}
+#endif
+
+/*! @}*/
+
+#endif /* __FSL_ADC_HAL_H__ */
+/*******************************************************************************
+* EOF
+*******************************************************************************/