Skip to content

Commit 28457cb

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 28457cb

File tree

1 file changed

+40
-35
lines changed

1 file changed

+40
-35
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 40 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,28 @@ 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, m_data.user_buffer,
417+
samples_to_bytes(m_data.channels_cnt),
418+
(void **)&m_data.samples_buffer);
419+
if (error != 0) {
420+
LOG_ERR("DMM buffer allocation failed err=%d", error);
421+
dmm_buffer_in_release(m_data.mem_reg, m_data.user_buffer,
422+
samples_to_bytes(m_data.channels_cnt),
423+
m_data.user_buffer);
424+
adc_context_complete(&m_data.ctx, -EIO);
425+
}
426+
#if !defined(CONFIG_HAS_NORDIC_DMM)
427+
nrfx_saadc_buffer_set(m_data.samples_buffer, m_data.event->data.done.size);
432428
#endif
433429
}
434430
}
@@ -604,17 +600,26 @@ static int start_read(const struct device *dev,
604600
return error;
605601
}
606602

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

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

619624
adc_context_start_read(&m_data.ctx, sequence);
620625

@@ -661,10 +666,10 @@ static void event_handler(const nrfx_saadc_evt_t *event)
661666
correct_single_ended(&m_data.ctx.sequence);
662667
}
663668

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
669+
dmm_buffer_in_release(m_data.mem_reg,
670+
m_data.user_buffer,
671+
samples_to_bytes(m_data.channels_cnt),
672+
m_data.samples_buffer);
668673

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

0 commit comments

Comments
 (0)