Skip to content

Commit 32dc431

Browse files
committed
drivers: adc: nrfx_saadc: Remove platform dependencies
Make the saadc driver more generic by including a generic header file for analog peripherals and removing platform dependencies. Signed-off-by: Jakub Zymelka <[email protected]>
1 parent 6099b15 commit 32dc431

File tree

1 file changed

+21
-128
lines changed

1 file changed

+21
-128
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 21 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
#define ADC_CONTEXT_USES_KERNEL_TIMER
88
#include "adc_context.h"
99
#include <nrfx_saadc.h>
10-
#include <zephyr/dt-bindings/adc/nrf-saadc-v3.h>
11-
#include <zephyr/dt-bindings/adc/nrf-saadc-nrf54l.h>
12-
#include <zephyr/dt-bindings/adc/nrf-saadc-haltium.h>
10+
#include <zephyr/dt-bindings/adc/nrf-saadc.h>
1311
#include <zephyr/linker/devicetree_regions.h>
1412
#include <zephyr/logging/log.h>
1513
#include <zephyr/irq.h>
@@ -18,85 +16,23 @@ LOG_MODULE_REGISTER(adc_nrfx_saadc, CONFIG_ADC_LOG_LEVEL);
1816

1917
#define DT_DRV_COMPAT nordic_nrf_saadc
2018

21-
#if (NRF_SAADC_HAS_AIN_AS_PIN)
22-
23-
#if defined(CONFIG_NRF_PLATFORM_HALTIUM)
24-
static const uint32_t saadc_psels[NRF_SAADC_AIN13 + 1] = {
25-
[NRF_SAADC_AIN0] = NRF_PIN_PORT_TO_PIN_NUMBER(0U, 1),
26-
[NRF_SAADC_AIN1] = NRF_PIN_PORT_TO_PIN_NUMBER(1U, 1),
27-
[NRF_SAADC_AIN2] = NRF_PIN_PORT_TO_PIN_NUMBER(2U, 1),
28-
[NRF_SAADC_AIN3] = NRF_PIN_PORT_TO_PIN_NUMBER(3U, 1),
29-
[NRF_SAADC_AIN4] = NRF_PIN_PORT_TO_PIN_NUMBER(4U, 1),
30-
[NRF_SAADC_AIN5] = NRF_PIN_PORT_TO_PIN_NUMBER(5U, 1),
31-
[NRF_SAADC_AIN6] = NRF_PIN_PORT_TO_PIN_NUMBER(6U, 1),
32-
[NRF_SAADC_AIN7] = NRF_PIN_PORT_TO_PIN_NUMBER(7U, 1),
33-
[NRF_SAADC_AIN8] = NRF_PIN_PORT_TO_PIN_NUMBER(0U, 9),
34-
[NRF_SAADC_AIN9] = NRF_PIN_PORT_TO_PIN_NUMBER(1U, 9),
35-
[NRF_SAADC_AIN10] = NRF_PIN_PORT_TO_PIN_NUMBER(2U, 9),
36-
[NRF_SAADC_AIN11] = NRF_PIN_PORT_TO_PIN_NUMBER(3U, 9),
37-
[NRF_SAADC_AIN12] = NRF_PIN_PORT_TO_PIN_NUMBER(4U, 9),
38-
[NRF_SAADC_AIN13] = NRF_PIN_PORT_TO_PIN_NUMBER(5U, 9),
39-
};
40-
#elif defined(CONFIG_SOC_NRF54L05) || defined(CONFIG_SOC_NRF54L10) || defined(CONFIG_SOC_NRF54L15)
41-
static const uint32_t saadc_psels[NRF_SAADC_DVDD + 1] = {
42-
[NRF_SAADC_AIN0] = NRF_PIN_PORT_TO_PIN_NUMBER(4U, 1),
43-
[NRF_SAADC_AIN1] = NRF_PIN_PORT_TO_PIN_NUMBER(5U, 1),
44-
[NRF_SAADC_AIN2] = NRF_PIN_PORT_TO_PIN_NUMBER(6U, 1),
45-
[NRF_SAADC_AIN3] = NRF_PIN_PORT_TO_PIN_NUMBER(7U, 1),
46-
[NRF_SAADC_AIN4] = NRF_PIN_PORT_TO_PIN_NUMBER(11U, 1),
47-
[NRF_SAADC_AIN5] = NRF_PIN_PORT_TO_PIN_NUMBER(12U, 1),
48-
[NRF_SAADC_AIN6] = NRF_PIN_PORT_TO_PIN_NUMBER(13U, 1),
49-
[NRF_SAADC_AIN7] = NRF_PIN_PORT_TO_PIN_NUMBER(14U, 1),
50-
[NRF_SAADC_VDD] = NRF_SAADC_INPUT_VDD,
51-
[NRF_SAADC_AVDD] = NRF_SAADC_INPUT_AVDD,
52-
[NRF_SAADC_DVDD] = NRF_SAADC_INPUT_DVDD,
53-
};
54-
#elif defined(NRF54LM20A_ENGA_XXAA)
55-
static const uint32_t saadc_psels[NRF_SAADC_DVDD + 1] = {
56-
[NRF_SAADC_AIN0] = NRF_PIN_PORT_TO_PIN_NUMBER(0U, 1),
57-
[NRF_SAADC_AIN1] = NRF_PIN_PORT_TO_PIN_NUMBER(31U, 1),
58-
[NRF_SAADC_AIN2] = NRF_PIN_PORT_TO_PIN_NUMBER(30U, 1),
59-
[NRF_SAADC_AIN3] = NRF_PIN_PORT_TO_PIN_NUMBER(29U, 1),
60-
[NRF_SAADC_AIN4] = NRF_PIN_PORT_TO_PIN_NUMBER(6U, 1),
61-
[NRF_SAADC_AIN5] = NRF_PIN_PORT_TO_PIN_NUMBER(5U, 1),
62-
[NRF_SAADC_AIN6] = NRF_PIN_PORT_TO_PIN_NUMBER(4U, 1),
63-
[NRF_SAADC_AIN7] = NRF_PIN_PORT_TO_PIN_NUMBER(3U, 1),
64-
[NRF_SAADC_VDD] = NRF_SAADC_INPUT_VDD,
65-
[NRF_SAADC_AVDD] = NRF_SAADC_INPUT_AVDD,
66-
[NRF_SAADC_DVDD] = NRF_SAADC_INPUT_DVDD,
67-
};
68-
#elif defined(NRF54LV10A_ENGA_XXAA)
69-
static const uint32_t saadc_psels[NRF_SAADC_DVDD + 1] = {
70-
[NRF_SAADC_AIN0] = NRF_PIN_PORT_TO_PIN_NUMBER(0U, 1),
71-
[NRF_SAADC_AIN1] = NRF_PIN_PORT_TO_PIN_NUMBER(1U, 1),
72-
[NRF_SAADC_AIN2] = NRF_PIN_PORT_TO_PIN_NUMBER(2U, 1),
73-
[NRF_SAADC_AIN3] = NRF_PIN_PORT_TO_PIN_NUMBER(3U, 1),
74-
[NRF_SAADC_AIN4] = NRF_PIN_PORT_TO_PIN_NUMBER(7U, 1),
75-
[NRF_SAADC_AIN5] = NRF_PIN_PORT_TO_PIN_NUMBER(10U, 1),
76-
[NRF_SAADC_AIN6] = NRF_PIN_PORT_TO_PIN_NUMBER(11U, 1),
77-
[NRF_SAADC_AIN7] = NRF_PIN_PORT_TO_PIN_NUMBER(12U, 1),
78-
[NRF_SAADC_VDD] = NRF_SAADC_INPUT_VDD,
79-
[NRF_SAADC_DVDD] = NRF_SAADC_INPUT_DVDD,
80-
};
81-
#endif
82-
83-
#else
84-
BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
85-
(NRF_SAADC_AIN1 == NRF_SAADC_INPUT_AIN1) &&
86-
(NRF_SAADC_AIN2 == NRF_SAADC_INPUT_AIN2) &&
87-
(NRF_SAADC_AIN3 == NRF_SAADC_INPUT_AIN3) &&
88-
(NRF_SAADC_AIN4 == NRF_SAADC_INPUT_AIN4) &&
89-
(NRF_SAADC_AIN5 == NRF_SAADC_INPUT_AIN5) &&
90-
(NRF_SAADC_AIN6 == NRF_SAADC_INPUT_AIN6) &&
91-
(NRF_SAADC_AIN7 == NRF_SAADC_INPUT_AIN7) &&
19+
#if (NRF_SAADC_HAS_AIN_AS_PIN == 0)
20+
BUILD_ASSERT((NRF_SAADC_AIN0 == NRFX_SAADC_AIN0) &&
21+
(NRF_SAADC_AIN1 == NRFX_SAADC_AIN1) &&
22+
(NRF_SAADC_AIN2 == NRFX_SAADC_AIN2) &&
23+
(NRF_SAADC_AIN3 == NRFX_SAADC_AIN3) &&
24+
(NRF_SAADC_AIN4 == NRFX_SAADC_AIN4) &&
25+
(NRF_SAADC_AIN5 == NRFX_SAADC_AIN5) &&
26+
(NRF_SAADC_AIN6 == NRFX_SAADC_AIN6) &&
27+
(NRF_SAADC_AIN7 == NRFX_SAADC_AIN7) &&
9228
#if defined(SAADC_CH_PSELP_PSELP_VDDHDIV5)
93-
(NRF_SAADC_VDDHDIV5 == NRF_SAADC_INPUT_VDDHDIV5) &&
29+
(NRF_SAADC_VDDHDIV5 == NRFX_SAADC_VDDHDIV5) &&
9430
#endif
9531
#if defined(SAADC_CH_PSELP_PSELP_VDD)
96-
(NRF_SAADC_VDD == NRF_SAADC_INPUT_VDD) &&
32+
(NRF_SAADC_VDD == NRFX_SAADC_VDD) &&
9733
#endif
9834
1,
99-
"Definitions from nrf-adc.h do not match those from nrf_saadc.h");
35+
"Definitions from nrf-saadc.h do not match those from nrfx_analog_common.h");
10036
#endif
10137

10238
#if defined(CONFIG_NRF_PLATFORM_HALTIUM)
@@ -192,34 +128,17 @@ static int input_assign(nrf_saadc_input_t *pin_p,
192128
nrf_saadc_input_t *pin_n,
193129
const struct adc_channel_cfg *channel_cfg)
194130
{
195-
#if (NRF_SAADC_HAS_AIN_AS_PIN)
196-
if (channel_cfg->input_positive > ARRAY_SIZE(saadc_psels) ||
197-
channel_cfg->input_positive < NRF_SAADC_AIN0) {
198-
LOG_ERR("Invalid analog positive input number: %d", channel_cfg->input_positive);
131+
if (nrfx_saadc_psels_are_valid(channel_cfg->input_positive,
132+
channel_cfg->input_negative,
133+
channel_cfg->differential) != NRFX_SUCCESS) {
134+
LOG_ERR("Invalid ADC input pin configuration");
199135
return -EINVAL;
200136
}
201137

202-
*pin_p = saadc_psels[channel_cfg->input_positive];
203-
204-
if (channel_cfg->differential) {
205-
if (channel_cfg->input_negative > ARRAY_SIZE(saadc_psels) ||
206-
channel_cfg->input_negative < NRF_SAADC_AIN0 ||
207-
(IS_ENABLED(CONFIG_NRF_PLATFORM_HALTIUM) &&
208-
(channel_cfg->input_positive > NRF_SAADC_AIN7) !=
209-
(channel_cfg->input_negative > NRF_SAADC_AIN7))) {
210-
LOG_ERR("Invalid analog negative input number: %d",
211-
channel_cfg->input_negative);
212-
return -EINVAL;
213-
}
214-
*pin_n = saadc_psels[channel_cfg->input_negative];
215-
} else {
216-
*pin_n = NRF_SAADC_INPUT_DISABLED;
217-
}
218-
#else
219-
*pin_p = channel_cfg->input_positive;
220-
*pin_n = channel_cfg->differential ? channel_cfg->input_negative
138+
*pin_p = nrfx_saadc_psel_to_nrf(channel_cfg->input_positive);
139+
*pin_n = channel_cfg->differential ? nrfx_saadc_psel_to_nrf(channel_cfg->input_negative)
221140
: NRF_SAADC_INPUT_DISABLED;
222-
#endif
141+
223142
LOG_DBG("ADC positive input: %d", *pin_p);
224143
LOG_DBG("ADC negative input: %d", *pin_n);
225144

@@ -679,35 +598,9 @@ static DEVICE_API(adc, adc_nrfx_driver_api) = {
679598
#ifdef CONFIG_ADC_ASYNC
680599
.read_async = adc_nrfx_read_async,
681600
#endif
682-
#if defined(NRF54LV10A_ENGA_XXAA)
683-
.ref_internal = 1300,
684-
#elif defined(CONFIG_SOC_COMPATIBLE_NRF54LX)
685-
.ref_internal = 900,
686-
#elif defined(CONFIG_NRF_PLATFORM_HALTIUM)
687-
.ref_internal = 1024,
688-
#else
689-
.ref_internal = 600,
690-
#endif
601+
.ref_internal = NRFX_SAADC_REF_INTERNAL_VALUE,
691602
};
692603

693-
#if defined(CONFIG_NRF_PLATFORM_HALTIUM)
694-
/* AIN8-AIN14 inputs are on 3v3 GPIO port and they cannot be mixed with other
695-
* analog inputs (from 1v8 ports) in differential mode.
696-
*/
697-
#define CH_IS_3V3(val) (val >= NRF_SAADC_AIN8)
698-
699-
#define MIXED_3V3_1V8_INPUTS(node) \
700-
(DT_NODE_HAS_PROP(node, zephyr_input_negative) && \
701-
(CH_IS_3V3(DT_PROP_OR(node, zephyr_input_negative, 0)) != \
702-
CH_IS_3V3(DT_PROP_OR(node, zephyr_input_positive, 0))))
703-
#else
704-
#define MIXED_3V3_1V8_INPUTS(node) false
705-
#endif
706-
707-
#define VALIDATE_CHANNEL_CONFIG(node) \
708-
BUILD_ASSERT(MIXED_3V3_1V8_INPUTS(node) == false, \
709-
"1v8 inputs cannot be mixed with 3v3 inputs");
710-
711604
/* Validate configuration of all channels. */
712605
DT_FOREACH_CHILD(DT_DRV_INST(0), VALIDATE_CHANNEL_CONFIG)
713606

0 commit comments

Comments
 (0)