Skip to content

Commit 6703d14

Browse files
committed
[nrf fromlist] drivers: adc: nrfx_saadc: Add support for DMM
Add support for DMM which manages cache and dedicated memory spaces. Upstream PR #: 90751 Signed-off-by: Jakub Zymelka <[email protected]>
1 parent e8a162c commit 6703d14

File tree

1 file changed

+34
-37
lines changed

1 file changed

+34
-37
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 34 additions & 37 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

@@ -97,34 +98,19 @@ BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
9798
"Definitions from nrf-adc.h do not match those from nrf_saadc.h");
9899
#endif
99100

100-
#if defined(CONFIG_NRF_PLATFORM_HALTIUM)
101-
#include <dmm.h>
102-
/* Haltium devices always use bounce buffers in RAM */
103-
static uint16_t adc_samples_buffer[SAADC_CH_NUM] DMM_MEMORY_SECTION(DT_NODELABEL(adc));
104-
105-
#define ADC_BUFFER_IN_RAM
106-
107-
#endif /* defined(CONFIG_NRF_PLATFORM_HALTIUM) */
108-
109101
struct driver_data {
110102
struct adc_context ctx;
111103
uint8_t single_ended_channels;
112-
nrf_saadc_value_t *buffer; /* Pointer to the buffer with converted samples. */
113104
uint8_t active_channel_cnt;
114-
115-
#if defined(ADC_BUFFER_IN_RAM)
116-
void *samples_buffer;
105+
void *mem_reg;
117106
void *user_buffer;
118-
#endif
119107
};
120108

121109
static struct driver_data m_data = {
122110
ADC_CONTEXT_INIT_TIMER(m_data, ctx),
123111
ADC_CONTEXT_INIT_LOCK(m_data, ctx),
124112
ADC_CONTEXT_INIT_SYNC(m_data, ctx),
125-
#if defined(ADC_BUFFER_IN_RAM)
126-
.samples_buffer = adc_samples_buffer,
127-
#endif
113+
.mem_reg = DMM_DEV_TO_REG(DT_NODELABEL(adc)),
128114
};
129115

130116
/* Forward declaration */
@@ -392,20 +378,28 @@ static void adc_context_start_sampling(struct adc_context *ctx)
392378

393379
if (ret != NRFX_SUCCESS) {
394380
LOG_ERR("Cannot start sampling: 0x%08x", ret);
395-
adc_context_complete(&m_data.ctx, -EIO);
381+
adc_context_complete(ctx, -EIO);
396382
}
397383
}
398384
}
399385

400386
static void adc_context_update_buffer_pointer(struct adc_context *ctx, bool repeat)
401387
{
402388
if (!repeat) {
403-
#if defined(ADC_BUFFER_IN_RAM)
389+
void *samples_buffer;
390+
404391
m_data.user_buffer = (uint16_t *)m_data.user_buffer + m_data.active_channel_cnt;
405-
#else
406-
nrf_saadc_value_t *buffer = (uint16_t *)m_data.buffer + m_data.active_channel_cnt;
407392

408-
nrfx_saadc_buffer_set(buffer, m_data.active_channel_cnt);
393+
int error = dmm_buffer_in_prepare(
394+
m_data.mem_reg, m_data.user_buffer,
395+
NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt),
396+
&samples_buffer);
397+
if (error != 0) {
398+
LOG_ERR("DMM buffer allocation failed err=%d", error);
399+
adc_context_complete(ctx, -EIO);
400+
}
401+
#if !defined(CONFIG_HAS_NORDIC_DMM)
402+
nrfx_saadc_buffer_set(samples_buffer, m_data.active_channel_cnt);
409403
#endif
410404
}
411405
}
@@ -502,12 +496,12 @@ static bool has_single_ended(const struct adc_sequence *sequence)
502496
return sequence->channels & m_data.single_ended_channels;
503497
}
504498

505-
static void correct_single_ended(const struct adc_sequence *sequence)
499+
static void correct_single_ended(const struct adc_sequence *sequence, nrf_saadc_value_t *buffer)
506500
{
507501
uint16_t channel_bit = BIT(0);
508502
uint8_t selected_channels = sequence->channels;
509503
uint8_t single_ended_channels = m_data.single_ended_channels;
510-
int16_t *sample = (int16_t *)m_data.buffer;
504+
int16_t *sample = (int16_t *)buffer;
511505

512506
while (channel_bit <= single_ended_channels) {
513507
if (channel_bit & selected_channels) {
@@ -532,6 +526,7 @@ static int start_read(const struct device *dev,
532526
nrf_saadc_oversample_t oversampling;
533527
uint8_t active_channel_cnt = 0U;
534528
uint8_t channel_id = 0U;
529+
void *samples_buffer;
535530

536531
/* Signal an error if channel selection is invalid (no channels or
537532
* a non-existing one is selected).
@@ -582,16 +577,21 @@ static int start_read(const struct device *dev,
582577
}
583578

584579
m_data.active_channel_cnt = active_channel_cnt;
585-
#if defined(ADC_BUFFER_IN_RAM)
586580
m_data.user_buffer = sequence->buffer;
587581

588-
nrfx_saadc_buffer_set(m_data.samples_buffer, active_channel_cnt);
589-
#else
582+
error = dmm_buffer_in_prepare(m_data.mem_reg,
583+
m_data.user_buffer,
584+
NRFX_SAADC_SAMPLES_TO_BYTES(active_channel_cnt),
585+
&samples_buffer);
586+
if (error != 0) {
587+
LOG_ERR("DMM buffer allocation failed err=%d", error);
588+
return error;
589+
}
590+
590591
/* Buffer is filled in chunks, each chunk composed of number of samples equal to number
591592
* of active channels. Buffer pointer is advanced and reloaded after each chunk.
592593
*/
593-
nrfx_saadc_buffer_set(sequence->buffer, active_channel_cnt);
594-
#endif
594+
nrfx_saadc_buffer_set(samples_buffer, active_channel_cnt);
595595

596596
adc_context_start_read(&m_data.ctx, sequence);
597597

@@ -632,17 +632,14 @@ static void event_handler(const nrfx_saadc_evt_t *event)
632632
nrfx_err_t err;
633633

634634
if (event->type == NRFX_SAADC_EVT_DONE) {
635-
m_data.buffer = event->data.done.p_buffer;
635+
dmm_buffer_in_release(
636+
m_data.mem_reg, m_data.user_buffer,
637+
NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt),
638+
event->data.done.p_buffer);
636639

637640
if (has_single_ended(&m_data.ctx.sequence)) {
638-
correct_single_ended(&m_data.ctx.sequence);
641+
correct_single_ended(&m_data.ctx.sequence, m_data.user_buffer);
639642
}
640-
641-
#if defined(ADC_BUFFER_IN_RAM)
642-
memcpy(m_data.user_buffer, m_data.samples_buffer,
643-
NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt));
644-
#endif
645-
646643
adc_context_on_sampling_done(&m_data.ctx, DEVICE_DT_INST_GET(0));
647644
} else if (event->type == NRFX_SAADC_EVT_CALIBRATEDONE) {
648645
err = nrfx_saadc_mode_trigger();

0 commit comments

Comments
 (0)