1313#include <zephyr/linker/devicetree_regions.h>
1414#include <zephyr/logging/log.h>
1515#include <zephyr/irq.h>
16+ #include <dmm.h>
1617
1718LOG_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-
109101struct 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
121109static 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
400386static 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
413406static 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