536 lines
17 KiB
C
536 lines
17 KiB
C
|
/*
|
|||
|
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
|||
|
* All Rights Reserved.
|
|||
|
*
|
|||
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
|||
|
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
|||
|
* either version 1.0 of the License, or (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
* See the Phytium Public License for more details.
|
|||
|
*
|
|||
|
*
|
|||
|
* FilePath: fadc.c
|
|||
|
* Date: 2022-02-10 14:53:42
|
|||
|
* LastEditTime: 2022-02-18 08:28:45
|
|||
|
* Description: This files is for
|
|||
|
*
|
|||
|
* Modify History:
|
|||
|
* Ver Who Date Changes
|
|||
|
* ----- ------ -------- --------------------------------------
|
|||
|
*/
|
|||
|
#include <string.h>
|
|||
|
#include "fgeneric_timer.h"
|
|||
|
#include "fkernel.h"
|
|||
|
#include "ftypes.h"
|
|||
|
#include "ferror_code.h"
|
|||
|
#include "fdebug.h"
|
|||
|
#include "fadc.h"
|
|||
|
#include "fadc_hw.h"
|
|||
|
#include "fparameters.h"
|
|||
|
#include "fassert.h"
|
|||
|
#include "fsleep.h"
|
|||
|
|
|||
|
#define FADC_DEBUG_TAG "FT_ADC"
|
|||
|
#define FADC_DEBUG(format, ...) FT_DEBUG_PRINT_D(FADC_DEBUG_TAG, format, ##__VA_ARGS__)
|
|||
|
#define FADC_INFO(format, ...) FT_DEBUG_PRINT_I(FADC_DEBUG_TAG, format, ##__VA_ARGS__)
|
|||
|
#define FADC_WARN(format, ...) FT_DEBUG_PRINT_W(FADC_DEBUG_TAG, format, ##__VA_ARGS__)
|
|||
|
#define FADC_ERROR(format, ...) FT_DEBUG_PRINT_E(FADC_DEBUG_TAG, format, ##__VA_ARGS__)
|
|||
|
|
|||
|
#define FADC_MAX_CLOCK_PRESC 16
|
|||
|
|
|||
|
#define FADC_MAX_THRESHOLD 0x400
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcPowerDownControl
|
|||
|
* @msg: Set power down signal
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {u8} power_state, this parameter must be enable or disable.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
static FError FAdcPowerDownControl(FAdcCtrl *pctrl, u8 power_state)
|
|||
|
{
|
|||
|
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
if (power_state == FADC_CTRL_PD_ENABLE)
|
|||
|
{
|
|||
|
reg_val |= FADC_CTRL_REG_PD_EN;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_PD_EN);
|
|||
|
}
|
|||
|
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcChannelEnable
|
|||
|
* @msg: enable channel, corresponding to fix channel mode or multi channel mode.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {boolean} state, TRUE-enable, FALSE-disable
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
void FAdcChannelEnable(FAdcCtrl *pctrl, FAdcChannel channel, boolean state)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
FASSERT(channel < FADC_CHANNEL_NUM);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
|
|||
|
if (state == TRUE)
|
|||
|
{
|
|||
|
if (reg_val & FADC_CTRL_REG_FIX_CHANNEL)
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_FIX_CHANNEL_NUM_MASK);
|
|||
|
reg_val |= FADC_CTRL_REG_FIX_CHANNEL_NUM(channel);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reg_val |= FADC_CTRL_REG_CHANNEL_EN(channel);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
/* fix channel mode, disable means stop convert */
|
|||
|
if (reg_val & FADC_CTRL_REG_FIX_CHANNEL)
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_SOC_EN);
|
|||
|
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_CHANNEL_EN(channel));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcChannelThresholdSet
|
|||
|
* @msg: Set adc channel high_threshold and low_threshold.
|
|||
|
* you need use this function after FAdcConvertSet. If you want to use this function to
|
|||
|
* add other channel enable when the adc conversion is started, you need to restart the
|
|||
|
* adc convert start signal(adc_soc_en) after use to make the operation valid.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {FAdcThresholdConfig} *threshold_config, pointer to adc channel threshold value struct.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcChannelThresholdSet(FAdcCtrl *pctrl, FAdcChannel channel, FAdcThresholdConfig *threshold_config)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
FASSERT(channel < FADC_CHANNEL_NUM);
|
|||
|
|
|||
|
u16 low_threshold = threshold_config->low_threshold;
|
|||
|
u16 high_threshold = threshold_config->high_threshold;
|
|||
|
|
|||
|
FASSERT(high_threshold < FADC_MAX_THRESHOLD);
|
|||
|
FASSERT(low_threshold < high_threshold);
|
|||
|
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
|
|||
|
u32 threshold = (FADC_LEVEL_REG_HIGH_LEVEL(high_threshold)) |
|
|||
|
(FADC_LEVEL_REG_LOW_LEVEL(low_threshold));
|
|||
|
FADC_WRITE_REG32(base_addr, (FADC_LEVEL_REG_OFFSET(channel)), threshold);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcConvertSet
|
|||
|
* @msg: config adc convert parameters.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcConvertConfig} *convert_config, include convert mode,channel mode,
|
|||
|
* clock divider and convert_interval.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcConvertSet(FAdcCtrl *pctrl, FAdcConvertConfig *convert_config)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
|
|||
|
/* clk_div config */
|
|||
|
u32 clk_div = convert_config->clk_div;
|
|||
|
FASSERT(clk_div < FADC_MAX_CLOCK_PRESC);
|
|||
|
if (clk_div % 2 == 1)
|
|||
|
{
|
|||
|
FADC_ERROR("clk_div is not even.");
|
|||
|
return FADC_ERR_INVAL_PARM;
|
|||
|
}
|
|||
|
reg_val &= (~FADC_CTRL_REG_CLK_DIV_MASK);
|
|||
|
reg_val |= FADC_CTRL_REG_CLK_DIV(clk_div);
|
|||
|
|
|||
|
/* config convert mode */
|
|||
|
FAdcConvertMode convert_mode = convert_config->convert_mode;
|
|||
|
FASSERT(convert_mode < FADC_CONVERT_MODE_NUM);
|
|||
|
if (convert_mode == FADC_SINGLE_CONVERT)
|
|||
|
{
|
|||
|
reg_val |= FADC_CTRL_REG_SINGLE_CONVERT;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_SINGLE_CONVERT);
|
|||
|
}
|
|||
|
|
|||
|
/* config channel mode */
|
|||
|
FAdcChannelMode channel_mode = convert_config->channel_mode;
|
|||
|
FASSERT(channel_mode < FADC_CHANNEL_MODE_NUM);
|
|||
|
|
|||
|
if (channel_mode == FADC_FIXED_CHANNEL)
|
|||
|
{
|
|||
|
reg_val |= FADC_CTRL_REG_FIX_CHANNEL;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
reg_val &= ~(FADC_CTRL_REG_FIX_CHANNEL);
|
|||
|
}
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
/* config time interval between two converts */
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_INTER_REG_OFFSET, convert_config->convert_interval);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcInterruptEnable
|
|||
|
* @msg: enable channel interrupt.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {FAdcIntrEvtType} event_type, interrupt event type
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcInterruptEnable(FAdcCtrl *pctrl, FAdcChannel channel, FAdcIntrEventType event_type)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
u32 reg_val = 0;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_INTRMASK_REG_OFFSET);
|
|||
|
switch (event_type)
|
|||
|
{
|
|||
|
case FADC_INTR_EVENT_COVFIN: /* enable channel convert complete irq */
|
|||
|
reg_val &= ~(FADC_INTRMASK_REG_COVFIN_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_DLIMIT:
|
|||
|
reg_val &= ~(FADC_INTRMASK_REG_DLIMIT_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_ULIMIT:
|
|||
|
reg_val &= ~(FADC_INTRMASK_REG_ULIMIT_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_ERROR:
|
|||
|
reg_val &= ~(FADC_INTRMASK_REG_ERR_MASK);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_INTRMASK_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcInterruptDisable
|
|||
|
* @msg: disable channel interrupt.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {FAdcIntrEvtType} event_type, interrupt event type
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcInterruptDisable(FAdcCtrl *pctrl, FAdcChannel channel, FAdcIntrEventType event_type)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
FASSERT(channel < FADC_CHANNEL_NUM);
|
|||
|
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
u32 reg_val = 0;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_INTRMASK_REG_OFFSET);
|
|||
|
switch (event_type)
|
|||
|
{
|
|||
|
case FADC_INTR_EVENT_COVFIN: /* enable channel convert complete irq */
|
|||
|
reg_val |= (FADC_INTRMASK_REG_COVFIN_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_DLIMIT:
|
|||
|
reg_val |= (FADC_INTRMASK_REG_DLIMIT_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_ULIMIT:
|
|||
|
reg_val |= (FADC_INTRMASK_REG_ULIMIT_MASK(channel));
|
|||
|
break;
|
|||
|
|
|||
|
case FADC_INTR_EVENT_ERROR:
|
|||
|
reg_val |= (FADC_INTRMASK_REG_ERR_MASK);
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_INTRMASK_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcConvertStart
|
|||
|
* @msg: Start adc convert.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @return
|
|||
|
*/
|
|||
|
void FAdcConvertStart(FAdcCtrl *pctrl)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
reg_val |= FADC_CTRL_REG_SOC_EN;
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcConvertStop
|
|||
|
* @msg: Stop adc convert.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @return
|
|||
|
*/
|
|||
|
void FAdcConvertStop(FAdcCtrl *pctrl)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
reg_val &= (~FADC_CTRL_REG_SOC_EN);
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcInit
|
|||
|
* @msg: init adc variable configuration.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcConvertConfig} *convert_config, pointer to adc convert configuration
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcVariableConfig(FAdcCtrl *pctrl, FAdcConvertConfig *convert_config)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(convert_config != NULL);
|
|||
|
|
|||
|
FError ret = FADC_SUCCESS;
|
|||
|
|
|||
|
/* disable power down signal */
|
|||
|
ret = FAdcPowerDownControl(pctrl, FADC_CTRL_PD_DISABLE);
|
|||
|
if (ret != FADC_SUCCESS)
|
|||
|
{
|
|||
|
FADC_ERROR("FAdcPowerDownControl failed.");
|
|||
|
return FADC_ERR_CMD_FAILED;
|
|||
|
}
|
|||
|
|
|||
|
/* set time interval between two converts */
|
|||
|
ret = FAdcConvertSet(pctrl, convert_config);
|
|||
|
if (ret != FADC_SUCCESS)
|
|||
|
{
|
|||
|
FADC_ERROR("FAdcConvertSet failed.");
|
|||
|
return FADC_ERR_CMD_FAILED;
|
|||
|
}
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcSingleConvertEnable
|
|||
|
* @msg: Enable single convert signal, when convert mode is set to single conversion.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
static FError FAdcSingleConvertEnable(FAdcCtrl *pctrl)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
reg_val |= FADC_CTRL_REG_SINGLE_CONVERT_EN;
|
|||
|
FADC_WRITE_REG32(base_addr, FADC_CTRL_REG_OFFSET, reg_val);
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcReadConvertResult
|
|||
|
* @msg: read adc channel convert result value.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {u16} *val, pointer to adc convert result value.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed.
|
|||
|
*/
|
|||
|
FError FAdcReadConvertResult(FAdcCtrl *pctrl, FAdcChannel channel, u16 *val)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(channel < FADC_CHANNEL_NUM);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
int timeout = FADC_READ_DELAY;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
|
|||
|
u32 reg_val = FADC_READ_REG32(base_addr, FADC_CTRL_REG_OFFSET);
|
|||
|
/* single conversion */
|
|||
|
if (reg_val & FADC_CTRL_REG_SINGLE_CONVERT)
|
|||
|
{
|
|||
|
FAdcSingleConvertEnable(pctrl);
|
|||
|
}
|
|||
|
|
|||
|
do
|
|||
|
{
|
|||
|
fsleep_millisec(10);
|
|||
|
}
|
|||
|
while ((!pctrl->convert_complete[channel]) && (0 <= --timeout));
|
|||
|
|
|||
|
if (0 >= timeout)
|
|||
|
{
|
|||
|
FADC_ERROR("timeout when read adc data, convert is not completed.");
|
|||
|
*val = 0;
|
|||
|
return FADC_ERR_TIMEOUT;
|
|||
|
}
|
|||
|
|
|||
|
FADC_CONVERT_UNCOMPLETE(pctrl->convert_complete[channel]);
|
|||
|
*val = pctrl->value[channel];
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcReadFinishCnt
|
|||
|
* @msg: read adc channel convert finish count.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {u32} *count, pointer to adc convert finish count.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed.
|
|||
|
*/
|
|||
|
FError FAdcReadFinishCnt(FAdcCtrl *pctrl, FAdcChannel channel, u32 *count)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
*count = FADC_READ_REG32(base_addr, FADC_FINISH_CNT_REG_OFFSET(channel));
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcReadHisLimit
|
|||
|
* @msg: read adc channel history limit value, include upper limit and lower limit.
|
|||
|
* @param {FAdcCtrl} *pctrl, pointer to a FAdcCtrl structure that contains
|
|||
|
* the configuration information for the specified adc module.
|
|||
|
* @param {FAdcChannel} channel, adc channel number.
|
|||
|
* @param {u16} *u_his_limit, pointer to adc convert history upper limit value.
|
|||
|
* @param {u16} *d_his_limit, pointer to adc convert history lower limit value.
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed.
|
|||
|
*/
|
|||
|
FError FAdcReadHisLimit(FAdcCtrl *pctrl, FAdcChannel channel, u16 *u_his_limit, u16 *d_his_limit)
|
|||
|
{
|
|||
|
FASSERT(pctrl != NULL);
|
|||
|
FASSERT(FT_COMPONENT_IS_READY == pctrl->is_ready);
|
|||
|
u32 reg_val = 0;
|
|||
|
uintptr base_addr = pctrl->config.base_addr;
|
|||
|
|
|||
|
reg_val = FADC_READ_REG32(base_addr, FADC_HIS_LIMIT_REG_OFFSET(channel));
|
|||
|
|
|||
|
*u_his_limit = (reg_val & FADC_HIS_LIMIT_REG_UMASK) >> 16;
|
|||
|
*d_his_limit = (reg_val & FADC_HIS_LIMIT_REG_DMASK) ;
|
|||
|
|
|||
|
return FADC_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcDeInitialize
|
|||
|
* @msg: DeInitialization function for the device instance
|
|||
|
* @param {FAdcCtrl} *pctrl, instance of FADC controller
|
|||
|
* @return {*}
|
|||
|
*/
|
|||
|
void FAdcDeInitialize(FAdcCtrl *pctrl)
|
|||
|
{
|
|||
|
FASSERT(pctrl);
|
|||
|
|
|||
|
pctrl->is_ready = 0;
|
|||
|
memset(pctrl, 0, sizeof(*pctrl));
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @name: FAdcCfgInitialize
|
|||
|
* @msg: Initializes a specific instance such that it is ready to be used.
|
|||
|
* @param {FAdcCtrl} *pctrl, instance of FADC controller
|
|||
|
* @param {FAdcConfig} *input_config_p, Default configuration parameters of FADC
|
|||
|
* @return err code information, FADC_SUCCESS indicates success,others indicates failed
|
|||
|
*/
|
|||
|
FError FAdcCfgInitialize(FAdcCtrl *pctrl, const FAdcConfig *input_config_p)
|
|||
|
{
|
|||
|
FASSERT(pctrl && input_config_p);
|
|||
|
|
|||
|
FError ret = FADC_SUCCESS;
|
|||
|
/*
|
|||
|
* If the device is started, disallow the initialize and return a Status
|
|||
|
* indicating it is started. This allows the user to de-initialize the device
|
|||
|
* and reinitialize, but prevents a user from inadvertently
|
|||
|
* initializing.
|
|||
|
*/
|
|||
|
if (FT_COMPONENT_IS_READY == pctrl->is_ready)
|
|||
|
{
|
|||
|
FADC_WARN("device is already initialized!!!");
|
|||
|
}
|
|||
|
|
|||
|
/*Set default values and configuration data */
|
|||
|
FAdcDeInitialize(pctrl);
|
|||
|
|
|||
|
pctrl->config = *input_config_p;
|
|||
|
|
|||
|
pctrl->is_ready = FT_COMPONENT_IS_READY;
|
|||
|
|
|||
|
return ret;
|
|||
|
}
|