Skip to content

Commit

Permalink
drivers: adc: adc_nrfx_saadc: align shim to new HAL definitions
Browse files Browse the repository at this point in the history
Updated SAADC HAL has new definitions that needs to be handled
in the adc shim

Signed-off-by: Jakub Zymelka <[email protected]>
Signed-off-by: Nikodem Kastelik <[email protected]>
  • Loading branch information
jaz1-nordic authored and nika-nordic committed Oct 27, 2023
1 parent d436537 commit 2a755b3
Showing 1 changed file with 86 additions and 25 deletions.
111 changes: 86 additions & 25 deletions drivers/adc/adc_nrfx_saadc.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ LOG_MODULE_REGISTER(adc_nrfx_saadc);

#define DT_DRV_COMPAT nordic_nrf_saadc

#if !(NRF_SAADC_HAS_AIN_AS_PIN)
BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
(NRF_SAADC_AIN1 == NRF_SAADC_INPUT_AIN1) &&
(NRF_SAADC_AIN2 == NRF_SAADC_INPUT_AIN2) &&
Expand All @@ -25,12 +26,15 @@ BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
(NRF_SAADC_AIN5 == NRF_SAADC_INPUT_AIN5) &&
(NRF_SAADC_AIN6 == NRF_SAADC_INPUT_AIN6) &&
(NRF_SAADC_AIN7 == NRF_SAADC_INPUT_AIN7) &&
(NRF_SAADC_AIN7 == NRF_SAADC_INPUT_AIN7) &&
(NRF_SAADC_AIN7 == NRF_SAADC_INPUT_AIN7)
#if defined(SAADC_CH_PSELP_PSELP_VDDHDIV5)
(NRF_SAADC_VDDHDIV5 == NRF_SAADC_INPUT_VDDHDIV5) &&
&& (NRF_SAADC_VDDHDIV5 == NRF_SAADC_INPUT_VDDHDIV5)
#endif
#if defined(SAADC_CH_PSELP_PSELP_VDD)
&& (NRF_SAADC_VDD == NRF_SAADC_INPUT_VDD)
#endif
, "Definitions from nrf-adc.h do not match those from nrf_saadc.h");
#endif
(NRF_SAADC_VDD == NRF_SAADC_INPUT_VDD),
"Definitions from nrf-adc.h do not match those from nrf_saadc.h");

struct driver_data {
struct adc_context ctx;
Expand All @@ -44,6 +48,57 @@ static struct driver_data m_data = {
ADC_CONTEXT_INIT_SYNC(m_data, ctx),
};

/* Helper function to convert acquisition time to register TACQ value. */
static int adc_convert_acq_time(uint16_t acquisition_time, nrf_saadc_acqtime_t *p_tacq_val)
{
#if NRF_SAADC_HAS_ACQTIME_ENUM
switch (acquisition_time) {
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 3):
*p_tacq_val = NRF_SAADC_ACQTIME_3US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 5):
*p_tacq_val = NRF_SAADC_ACQTIME_5US;
break;
case ADC_ACQ_TIME_DEFAULT:
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 10):
*p_tacq_val = NRF_SAADC_ACQTIME_10US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 15):
*p_tacq_val = NRF_SAADC_ACQTIME_15US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 20):
*p_tacq_val = NRF_SAADC_ACQTIME_20US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40):
*p_tacq_val = NRF_SAADC_ACQTIME_40US;
break;
default:
return -EINVAL;
}
#else
#define MINIMUM_ACQ_TIME_IN_NS 125
#define DEFAULT_ACQ_TIME_IN_NS 10000

nrf_saadc_acqtime_t tacq = 0;
uint16_t acq_time;
if (acquisition_time == ADC_ACQ_TIME_DEFAULT) {

Check warning on line 84 in drivers/adc/adc_nrfx_saadc.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

LINE_SPACING

drivers/adc/adc_nrfx_saadc.c:84 Missing a blank line after declarations
acq_time = DEFAULT_ACQ_TIME_IN_NS;
} else if (ADC_ACQ_TIME_UNIT(acquisition_time) == ADC_ACQ_TIME_MICROSECONDS) {
acq_time = ADC_ACQ_TIME_VALUE(acquisition_time) * 1000;
} else {
acq_time = ADC_ACQ_TIME_VALUE(acquisition_time);
}

tacq = (nrf_saadc_acqtime_t)(acq_time / MINIMUM_ACQ_TIME_IN_NS) - 1;
if ((tacq > SAADC_CH_CONFIG_TACQ_Max) || (acq_time < MINIMUM_ACQ_TIME_IN_NS)) {
return -EINVAL;
} else {

Check warning on line 95 in drivers/adc/adc_nrfx_saadc.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

UNNECESSARY_ELSE

drivers/adc/adc_nrfx_saadc.c:95 else is not generally useful after a break or return
*p_tacq_val = tacq;
}
#endif

return 0;
}

/* Implementation of the ADC driver API function: adc_channel_setup. */
static int adc_nrfx_channel_setup(const struct device *dev,
Expand All @@ -61,21 +116,36 @@ static int adc_nrfx_channel_setup(const struct device *dev,
}

switch (channel_cfg->gain) {
#if defined(SAADC_CH_CONFIG_GAIN_Gain1_6)
case ADC_GAIN_1_6:
config.gain = NRF_SAADC_GAIN1_6;
break;
#endif
#if defined(SAADC_CH_CONFIG_GAIN_Gain1_5)
case ADC_GAIN_1_5:
config.gain = NRF_SAADC_GAIN1_5;
break;
#endif
#if defined(SAADC_CH_CONFIG_GAIN_Gain1_4)
case ADC_GAIN_1_4:
config.gain = NRF_SAADC_GAIN1_4;
break;
#endif
#if defined(SAADC_CH_CONFIG_GAIN_Gain1_3)
case ADC_GAIN_1_3:
config.gain = NRF_SAADC_GAIN1_3;
break;
#endif
#if defined(SAADC_CH_CONFIG_GAIN_Gain1_2)
case ADC_GAIN_1_2:
config.gain = NRF_SAADC_GAIN1_2;
break;
#endif
#if defined(SAADC_CH_CONFIG_GAIN_Gain2_3)
case ADC_GAIN_2_3:
config.gain = NRF_SAADC_GAIN2_3;
break;
#endif
case ADC_GAIN_1:
config.gain = NRF_SAADC_GAIN1;
break;
Expand All @@ -91,38 +161,29 @@ static int adc_nrfx_channel_setup(const struct device *dev,
}

switch (channel_cfg->reference) {
#if defined(SAADC_CH_CONFIG_REFSEL_Internal)
case ADC_REF_INTERNAL:
config.reference = NRF_SAADC_REFERENCE_INTERNAL;
break;
#endif
#if defined(SAADC_CH_CONFIG_REFSEL_VDD1_4)
case ADC_REF_VDD_1_4:
config.reference = NRF_SAADC_REFERENCE_VDD4;
break;
#endif
#if defined(SAADC_CH_CONFIG_REFSEL_External)
case ADC_REF_EXTERNAL0:
config.reference = NRF_SAADC_REFERENCE_EXTERNAL;
break;
#endif
default:
LOG_ERR("Selected ADC reference is not valid");
return -EINVAL;
}

switch (channel_cfg->acquisition_time) {
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 3):
config.acq_time = NRF_SAADC_ACQTIME_3US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 5):
config.acq_time = NRF_SAADC_ACQTIME_5US;
break;
case ADC_ACQ_TIME_DEFAULT:
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 10):
config.acq_time = NRF_SAADC_ACQTIME_10US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 15):
config.acq_time = NRF_SAADC_ACQTIME_15US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 20):
config.acq_time = NRF_SAADC_ACQTIME_20US;
break;
case ADC_ACQ_TIME(ADC_ACQ_TIME_MICROSECONDS, 40):
config.acq_time = NRF_SAADC_ACQTIME_40US;
break;
default:
int ret = adc_convert_acq_time(channel_cfg->acquisition_time, &config.acq_time);
if (ret)

Check warning on line 185 in drivers/adc/adc_nrfx_saadc.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

LINE_SPACING

drivers/adc/adc_nrfx_saadc.c:185 Missing a blank line after declarations

Check failure on line 185 in drivers/adc/adc_nrfx_saadc.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

OPEN_BRACE

drivers/adc/adc_nrfx_saadc.c:185 that open brace { should be on the previous line
{
LOG_ERR("Selected ADC acquisition time is not valid");
return -EINVAL;
}
Expand Down

0 comments on commit 2a755b3

Please sign in to comment.