13
13
#include <zephyr/linker/devicetree_regions.h>
14
14
#include <zephyr/logging/log.h>
15
15
#include <zephyr/irq.h>
16
+ #include <dmm.h>
16
17
17
18
LOG_MODULE_REGISTER (adc_nrfx_saadc , CONFIG_ADC_LOG_LEVEL );
18
19
@@ -97,34 +98,19 @@ BUILD_ASSERT((NRF_SAADC_AIN0 == NRF_SAADC_INPUT_AIN0) &&
97
98
"Definitions from nrf-adc.h do not match those from nrf_saadc.h" );
98
99
#endif
99
100
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
-
109
101
struct driver_data {
110
102
struct adc_context ctx ;
111
103
uint8_t single_ended_channels ;
112
- nrf_saadc_value_t * buffer ; /* Pointer to the buffer with converted samples. */
113
104
uint8_t active_channel_cnt ;
114
-
115
- #if defined(ADC_BUFFER_IN_RAM )
116
- void * samples_buffer ;
105
+ void * mem_reg ;
117
106
void * user_buffer ;
118
- #endif
119
107
};
120
108
121
109
static struct driver_data m_data = {
122
110
ADC_CONTEXT_INIT_TIMER (m_data , ctx ),
123
111
ADC_CONTEXT_INIT_LOCK (m_data , ctx ),
124
112
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 )),
128
114
};
129
115
130
116
/* Forward declaration */
@@ -392,22 +378,29 @@ static void adc_context_start_sampling(struct adc_context *ctx)
392
378
393
379
if (ret != NRFX_SUCCESS ) {
394
380
LOG_ERR ("Cannot start sampling: 0x%08x" , ret );
395
- adc_context_complete (& m_data . ctx , - EIO );
381
+ adc_context_complete (ctx , - EIO );
396
382
}
397
383
}
398
384
}
399
385
400
386
static void adc_context_update_buffer_pointer (struct adc_context * ctx , bool repeat )
401
387
{
388
+ void * samples_buffer ;
389
+
402
390
if (!repeat ) {
403
- #if defined(ADC_BUFFER_IN_RAM )
404
391
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
+ }
407
393
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 );
410
401
}
402
+
403
+ nrfx_saadc_buffer_set (samples_buffer , m_data .active_channel_cnt );
411
404
}
412
405
413
406
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)
502
495
return sequence -> channels & m_data .single_ended_channels ;
503
496
}
504
497
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 )
506
499
{
507
500
uint16_t channel_bit = BIT (0 );
508
501
uint8_t selected_channels = sequence -> channels ;
509
502
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 ;
511
504
512
505
while (channel_bit <= single_ended_channels ) {
513
506
if (channel_bit & selected_channels ) {
@@ -532,6 +525,7 @@ static int start_read(const struct device *dev,
532
525
nrf_saadc_oversample_t oversampling ;
533
526
uint8_t active_channel_cnt = 0U ;
534
527
uint8_t channel_id = 0U ;
528
+ void * samples_buffer ;
535
529
536
530
/* Signal an error if channel selection is invalid (no channels or
537
531
* a non-existing one is selected).
@@ -582,16 +576,21 @@ static int start_read(const struct device *dev,
582
576
}
583
577
584
578
m_data .active_channel_cnt = active_channel_cnt ;
585
- #if defined(ADC_BUFFER_IN_RAM )
586
579
m_data .user_buffer = sequence -> buffer ;
587
580
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
+
590
590
/* Buffer is filled in chunks, each chunk composed of number of samples equal to number
591
591
* of active channels. Buffer pointer is advanced and reloaded after each chunk.
592
592
*/
593
- nrfx_saadc_buffer_set (sequence -> buffer , active_channel_cnt );
594
- #endif
593
+ nrfx_saadc_buffer_set (samples_buffer , active_channel_cnt );
595
594
596
595
adc_context_start_read (& m_data .ctx , sequence );
597
596
@@ -632,17 +631,14 @@ static void event_handler(const nrfx_saadc_evt_t *event)
632
631
nrfx_err_t err ;
633
632
634
633
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 );
636
638
637
639
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 );
639
641
}
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
-
646
642
adc_context_on_sampling_done (& m_data .ctx , DEVICE_DT_INST_GET (0 ));
647
643
} else if (event -> type == NRFX_SAADC_EVT_CALIBRATEDONE ) {
648
644
err = nrfx_saadc_mode_trigger ();
0 commit comments