Skip to content

Commit c535d6e

Browse files
jaz1-nordiccarlescufi
authored andcommitted
drivers: adc: nrfx_saadc: Add support for DMM
Add support for DMM which manages cache and dedicated memory spaces. Signed-off-by: Jakub Zymelka <[email protected]>
1 parent cafc00c commit c535d6e

File tree

1 file changed

+34
-38
lines changed

1 file changed

+34
-38
lines changed

drivers/adc/adc_nrfx_saadc.c

Lines changed: 34 additions & 38 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,22 +378,29 @@ 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
{
388+
void *samples_buffer;
389+
402390
if (!repeat) {
403-
#if defined(ADC_BUFFER_IN_RAM)
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;
392+
}
407393

408-
nrfx_saadc_buffer_set(buffer, m_data.active_channel_cnt);
409-
#endif
394+
int error = dmm_buffer_in_prepare(
395+
m_data.mem_reg, m_data.user_buffer,
396+
NRFX_SAADC_SAMPLES_TO_BYTES(m_data.active_channel_cnt),
397+
&samples_buffer);
398+
if (error != 0) {
399+
LOG_ERR("DMM buffer allocation failed err=%d", error);
400+
adc_context_complete(ctx, -EIO);
410401
}
402+
403+
nrfx_saadc_buffer_set(samples_buffer, m_data.active_channel_cnt);
411404
}
412405

413406
static int get_resolution(const struct adc_sequence *sequence, nrf_saadc_resolution_t *resolution)
@@ -502,12 +495,12 @@ static bool has_single_ended(const struct adc_sequence *sequence)
502495
return sequence->channels & m_data.single_ended_channels;
503496
}
504497

505-
static void correct_single_ended(const struct adc_sequence *sequence)
498+
static void correct_single_ended(const struct adc_sequence *sequence, nrf_saadc_value_t *buffer)
506499
{
507500
uint16_t channel_bit = BIT(0);
508501
uint8_t selected_channels = sequence->channels;
509502
uint8_t single_ended_channels = m_data.single_ended_channels;
510-
int16_t *sample = (int16_t *)m_data.buffer;
503+
int16_t *sample = (int16_t *)buffer;
511504

512505
while (channel_bit <= single_ended_channels) {
513506
if (channel_bit & selected_channels) {
@@ -532,6 +525,7 @@ static int start_read(const struct device *dev,
532525
nrf_saadc_oversample_t oversampling;
533526
uint8_t active_channel_cnt = 0U;
534527
uint8_t channel_id = 0U;
528+
void *samples_buffer;
535529

536530
/* Signal an error if channel selection is invalid (no channels or
537531
* a non-existing one is selected).
@@ -582,16 +576,21 @@ static int start_read(const struct device *dev,
582576
}
583577

584578
m_data.active_channel_cnt = active_channel_cnt;
585-
#if defined(ADC_BUFFER_IN_RAM)
586579
m_data.user_buffer = sequence->buffer;
587580

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

596595
adc_context_start_read(&m_data.ctx, sequence);
597596

@@ -632,17 +631,14 @@ static void event_handler(const nrfx_saadc_evt_t *event)
632631
nrfx_err_t err;
633632

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

637639
if (has_single_ended(&m_data.ctx.sequence)) {
638-
correct_single_ended(&m_data.ctx.sequence);
640+
correct_single_ended(&m_data.ctx.sequence, m_data.user_buffer);
639641
}
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-
646642
adc_context_on_sampling_done(&m_data.ctx, DEVICE_DT_INST_GET(0));
647643
} else if (event->type == NRFX_SAADC_EVT_CALIBRATEDONE) {
648644
err = nrfx_saadc_mode_trigger();

0 commit comments

Comments
 (0)