Skip to content

Commit 45b852f

Browse files
committed
drivers: adc: nrfx_saadc: Add support for DMM
Add support for DMM which manages cache and dedicated memory spaces. Signed-off-by: Jakub Zymelka <jakub.zymelka@nordicsemi.no>
1 parent e8665f1 commit 45b852f

File tree

1 file changed

+42
-35
lines changed

1 file changed

+42
-35
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <zephyr/linker/devicetree_regions.h>
1414
#include <zephyr/logging/log.h>
1515
#include <zephyr/irq.h>
16+
#include <dmm.h>
1617

1718
LOG_MODULE_REGISTER(adc_nrfx_saadc, CONFIG_ADC_LOG_LEVEL);
1819

@@ -86,34 +87,22 @@ BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
8687
"Definitions from nrf-adc.h do not match those from nrf_saadc.h");
8788
#endif
8889

89-
#if defined(CONFIG_NRF_PLATFORM_HALTIUM)
90-
#include <dmm.h>
91-
/* Haltium devices always use bounce buffers in RAM */
92-
static uint16_t adc_samples_buffer[SAADC_CH_NUM] DMM_MEMORY_SECTION(DT_NODELABEL(adc));
93-
94-
#define ADC_BUFFER_IN_RAM
95-
96-
#endif /* defined(CONFIG_NRF_PLATFORM_HALTIUM) */
97-
9890
struct driver_data {
9991
struct adc_context ctx;
100-
10192
uint8_t single_ended_channels;
102-
103-
#if defined(ADC_BUFFER_IN_RAM)
104-
void *samples_buffer;
93+
void *mem_reg;
10594
void *user_buffer;
106-
uint8_t channels_cnt;
107-
#endif
95+
void *samples_buffer;
10896
const nrfx_saadc_evt_t *event;
97+
uint8_t channels_cnt;
10998
};
11099

111100
static struct driver_data m_data = {
112101
ADC_CONTEXT_INIT_TIMER(m_data, ctx),
113102
ADC_CONTEXT_INIT_LOCK(m_data, ctx),
114103
ADC_CONTEXT_INIT_SYNC(m_data, ctx),
115-
#if defined(ADC_BUFFER_IN_RAM)
116-
.samples_buffer = adc_samples_buffer,
104+
#if defined(CONFIG_HAS_NORDIC_DMM)
105+
.mem_reg = DMM_DEV_TO_REG(DT_NODELABEL(adc)),
117106
#endif
118107
};
119108

@@ -414,21 +403,30 @@ static void adc_context_start_sampling(struct adc_context *ctx)
414403

415404
if (ret != NRFX_SUCCESS) {
416405
LOG_ERR("Cannot start sampling: %d", ret);
406+
adc_context_complete(&m_data.ctx, -EIO);
417407
}
418408
}
419409
}
420410

421411
static void adc_context_update_buffer_pointer(struct adc_context *ctx, bool repeat)
422412
{
423413
if (!repeat) {
424-
#if defined(ADC_BUFFER_IN_RAM)
425-
m_data.user_buffer = (uint16_t *)m_data.user_buffer +
426-
m_data.event->data.done.size;
427-
#else
428-
nrf_saadc_value_t *buffer =
429-
(uint16_t *)m_data.event->data.done.p_buffer +
430-
m_data.event->data.done.size;
431-
nrfx_saadc_buffer_set(buffer, m_data.event->data.done.size);
414+
m_data.user_buffer = (uint16_t *)m_data.user_buffer + m_data.event->data.done.size;
415+
416+
int error = dmm_buffer_in_prepare(m_data.mem_reg,
417+
m_data.user_buffer,
418+
samples_to_bytes(m_data.channels_cnt),
419+
(void **)&m_data.samples_buffer);
420+
if (error != 0) {
421+
LOG_ERR("DMM buffer allocation failed err=%d", error);
422+
dmm_buffer_in_release(m_data.mem_reg,
423+
m_data.user_buffer,
424+
samples_to_bytes(m_data.channels_cnt),
425+
m_data.user_buffer);
426+
adc_context_complete(&m_data.ctx, -EIO);
427+
}
428+
#if !defined(CONFIG_HAS_NORDIC_DMM)
429+
nrfx_saadc_buffer_set(m_data.samples_buffer, m_data.event->data.done.size);
432430
#endif
433431
}
434432
}
@@ -604,17 +602,26 @@ static int start_read(const struct device *dev,
604602
return error;
605603
}
606604

607-
#if defined(ADC_BUFFER_IN_RAM)
608-
m_data.user_buffer = sequence->buffer;
609605
m_data.channels_cnt = channels_cnt;
606+
m_data.user_buffer = sequence->buffer;
607+
608+
error = dmm_buffer_in_prepare(m_data.mem_reg,
609+
m_data.user_buffer,
610+
samples_to_bytes(channels_cnt),
611+
(void **)&m_data.samples_buffer);
612+
if (error != 0) {
613+
LOG_ERR("DMM buffer allocation failed err=%d", error);
614+
dmm_buffer_in_release(m_data.mem_reg,
615+
m_data.user_buffer,
616+
samples_to_bytes(channels_cnt),
617+
m_data.user_buffer);
618+
return error;
619+
}
610620

611-
nrfx_saadc_buffer_set(m_data.samples_buffer, channels_cnt);
612-
#else
613621
/* Buffer is filled in chunks, each chunk composed of number of samples equal to number
614622
* of active channels. Buffer pointer is advanced and reloaded after each chunk.
615623
*/
616-
nrfx_saadc_buffer_set(sequence->buffer, channels_cnt);
617-
#endif
624+
nrfx_saadc_buffer_set(m_data.samples_buffer, channels_cnt);
618625

619626
adc_context_start_read(&m_data.ctx, sequence);
620627

@@ -661,10 +668,10 @@ static void event_handler(const nrfx_saadc_evt_t *event)
661668
correct_single_ended(&m_data.ctx.sequence);
662669
}
663670

664-
#if defined(ADC_BUFFER_IN_RAM)
665-
memcpy(m_data.user_buffer, m_data.samples_buffer,
666-
samples_to_bytes(m_data.channels_cnt));
667-
#endif
671+
dmm_buffer_in_release(m_data.mem_reg,
672+
m_data.user_buffer,
673+
samples_to_bytes(m_data.channels_cnt),
674+
m_data.samples_buffer);
668675

669676
adc_context_on_sampling_done(&m_data.ctx, DEVICE_DT_INST_GET(0));
670677
} else if (m_data.event->type == NRFX_SAADC_EVT_CALIBRATEDONE) {

0 commit comments

Comments
 (0)