esp-idf/components/hal/include/hal/adc_oneshot_hal.h

89 lines
2.5 KiB
C

/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "hal/adc_types.h"
#include "hal/adc_hal_common.h"
#include "soc/soc_caps.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct sens_dev_t *adc_oneshot_soc_handle_t;
typedef struct adc_oneshot_hal_cfg_t {
adc_unit_t unit; ///< ADC unit
adc_hal_work_mode_t work_mode; ///< ADC work mode
adc_oneshot_clk_src_t clk_src; ///< Clock source
uint32_t clk_src_freq_hz; ///< Clock source frequency in hz
} adc_oneshot_hal_cfg_t;
/**
* ADC channel configuration
*/
typedef struct adc_oneshot_hal_chan_cfg_t {
adc_atten_t atten; ///< ADC attenuation
adc_bitwidth_t bitwidth; ///< ADC conversion result bits
} adc_oneshot_hal_chan_cfg_t;
/**
* Context of the ADC unit, should be maintained by both the driver and the HAL.
*/
typedef struct adc_oneshot_hal_ctx_t {
/* These should be configured by driver, dou't modify these directly in hal*/
adc_oneshot_soc_handle_t dev; ///< ADC SoC layer handle
adc_unit_t unit; ///< ADC unit
adc_hal_work_mode_t work_mode; ///< ADC work mode
adc_oneshot_hal_chan_cfg_t chan_configs[SOC_ADC_MAX_CHANNEL_NUM]; ///< ADC configurations per channel
adc_oneshot_clk_src_t clk_src; ///< Clock source
uint32_t clk_src_freq_hz; ///< Clock source frequency in hz
} adc_oneshot_hal_ctx_t;
/**
* Initialise the context
*
* @param hal ADC Oneshot Hal context
* @param config ADC Oneshot Hal init config
*/
void adc_oneshot_hal_init(adc_oneshot_hal_ctx_t *hal, const adc_oneshot_hal_cfg_t *config);
/**
* Prepare ADC Oneshot hal context
*
* @param hal ADC Oneshot Hal context
* @param config ADC Oneshot Hal configuration
* @param chan ADC Channel
*/
void adc_oneshot_hal_channel_config(adc_oneshot_hal_ctx_t *hal, const adc_oneshot_hal_chan_cfg_t *config, adc_channel_t chan);
/**
* Set ADC Oneshot mode required registers
*
* @param hal ADC Oneshot Hal context
* @param channel ADC Channel
*/
void adc_oneshot_hal_setup(adc_oneshot_hal_ctx_t *hal, adc_channel_t channel);
/**
* Start ADC conversion in Oneshot mode and get the raw result
*
* @param hal ADC Oneshot Hal context
* @param[out] out_raw ADC oneshot conversion raw result
*
* @return
* - true: ADC raw result is valid
* - false: ADC raw result is invalid
*/
bool adc_oneshot_hal_convert(adc_oneshot_hal_ctx_t *hal, int *out_raw);
#ifdef __cplusplus
}
#endif