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,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
400386static 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