1
1
/*
2
- * Copyright (c) 2024 Renesas Electronics Corporation
2
+ * Copyright (c) 2024-2025 Renesas Electronics Corporation
3
3
* SPDX-License-Identifier: Apache-2.0
4
4
*/
5
5
8
8
#include <zephyr/drivers/adc.h>
9
9
#include <zephyr/irq.h>
10
10
#include <zephyr/logging/log.h>
11
- #include "r_adc_c.h"
11
+ #include <zephyr/devicetree.h>
12
12
13
- LOG_MODULE_REGISTER (adc_renesas_rz , CONFIG_ADC_LOG_LEVEL );
13
+ #if defined(CONFIG_ADC_RENESAS_RZ_ADC_C )
14
+ #include "r_adc_c.h"
15
+ typedef adc_c_channel_cfg_t adc_channel_cfg_t ;
16
+ typedef adc_c_instance_ctrl_t adc_instance_ctrl_t ;
17
+ typedef adc_c_extended_cfg_t adc_extended_cfg_t ;
18
+ void adc_c_scan_end_isr (void * irq );
19
+ #define ADC_SCAN_END_ISR adc_c_scan_end_isr
20
+ #else /* CONFIG_ADC_RENESAS_RZ */
21
+ #include "r_adc.h"
22
+ void adc_scan_end_isr (void * irq );
23
+ #define ADC_SCAN_END_ISR adc_scan_end_isr
24
+ #endif
14
25
15
26
#define ADC_CONTEXT_USES_KERNEL_TIMER
16
27
#include "adc_context.h"
17
28
18
29
#define ADC_RZ_MAX_RESOLUTION 12
19
30
20
- void adc_c_scan_end_isr ( void );
31
+ LOG_MODULE_REGISTER ( adc_renesas_rz , CONFIG_ADC_LOG_LEVEL );
21
32
22
33
/**
23
34
* @brief RZ ADC config
@@ -42,11 +53,11 @@ struct adc_rz_data {
42
53
/** Pointer to RZ ADC own device structure */
43
54
const struct device * dev ;
44
55
/** Structure that handle fsp ADC */
45
- adc_c_instance_ctrl_t fsp_ctrl ;
56
+ adc_instance_ctrl_t fsp_ctrl ;
46
57
/** Structure that handle fsp ADC config */
47
58
struct st_adc_cfg fsp_cfg ;
48
59
/** Structure that handle fsp ADC channel config */
49
- adc_c_channel_cfg_t fsp_channel_cfg ;
60
+ adc_channel_cfg_t fsp_channel_cfg ;
50
61
/** Pointer to memory where next sample will be written */
51
62
uint16_t * buf ;
52
63
/** Mask with channels that will be sampled */
@@ -133,7 +144,7 @@ static void adc_rz_isr(const struct device *dev)
133
144
}
134
145
channels = channels >> 1 ;
135
146
}
136
- adc_c_scan_end_isr ( );
147
+ ADC_SCAN_END_ISR (( void * ) data -> fsp_cfg . scan_end_irq );
137
148
adc_context_on_sampling_done (& data -> ctx , dev );
138
149
}
139
150
@@ -303,18 +314,9 @@ static int adc_rz_init(const struct device *dev)
303
314
* ************************* DRIVER REGISTER SECTION ***************************
304
315
*/
305
316
306
- #define ADC_RZG_IRQ_CONNECT (idx , irq_name , isr ) \
307
- do { \
308
- IRQ_CONNECT(DT_INST_IRQ_BY_NAME(idx, irq_name, irq), \
309
- DT_INST_IRQ_BY_NAME(idx, irq_name, priority), isr, \
310
- DEVICE_DT_INST_GET(idx), 0); \
311
- irq_enable(DT_INST_IRQ_BY_NAME(idx, irq_name, irq)); \
312
- } while (0)
313
-
314
- #define ADC_RZG_CONFIG_FUNC (idx ) ADC_RZG_IRQ_CONNECT(idx, scanend, adc_rz_isr);
315
-
316
- #define ADC_RZG_INIT (idx ) \
317
- static const adc_c_extended_cfg_t g_adc##idx##_cfg_extend = { \
317
+ #if defined(CONFIG_ADC_RENESAS_RZ_ADC_C )
318
+ #define ADC_RZ_EXTENDED_FSP_CFG (idx ) \
319
+ static const adc_extended_cfg_t g_adc##idx##_cfg_extend = { \
318
320
.trigger_mode = ADC_C_TRIGGER_MODE_SOFTWARE, \
319
321
.trigger_source = ADC_C_ACTIVE_TRIGGER_EXTERNAL, \
320
322
.trigger_edge = ADC_C_TRIGGER_EDGE_FALLING, \
@@ -324,43 +326,123 @@ static int adc_rz_init(const struct device *dev)
324
326
.sampling_time = 100, \
325
327
.external_trigger_filter = ADC_C_FILTER_STAGE_SETTING_DISABLE, \
326
328
}; \
329
+ static const struct adc_rz_config adc_rz_config_##idx = { \
330
+ .channel_available_mask = DT_INST_PROP(idx, channel_available_mask), \
331
+ .fsp_api = &g_adc_on_adc_c, \
332
+ };
333
+
334
+ #define ADC_RZ_FSP_CFG (idx ) \
335
+ .fsp_cfg = \
336
+ { \
337
+ .mode = ADC_MODE_SINGLE_SCAN, \
338
+ .p_callback = NULL, \
339
+ .p_context = NULL, \
340
+ .p_extend = &g_adc##idx##_cfg_extend, \
341
+ .scan_end_irq = DT_INST_IRQ_BY_NAME(idx, scanend, irq), \
342
+ .scan_end_ipl = DT_INST_IRQ_BY_NAME(idx, scanend, priority), \
343
+ }, \
344
+ .fsp_channel_cfg = { \
345
+ .scan_mask = 0, \
346
+ .interrupt_setting = ADC_C_INTERRUPT_CHANNEL_SETTING_ENABLE, \
347
+ }
348
+
349
+ #endif /* CONFIG_ADC_RENESAS_RZ_ADC_C */
350
+
351
+ #if defined(CONFIG_ADC_RENESAS_RZ )
352
+ #define ADC_RZ_EXTENDED_FSP_CFG (idx ) \
353
+ static const adc_extended_cfg_t g_adc##idx##_cfg_extend = { \
354
+ .add_average_count = ADC_ADD_OFF, \
355
+ .clearing = ADC_CLEAR_AFTER_READ_ON, \
356
+ .trigger_group_b = ADC_TRIGGER_SYNC_ELC, \
357
+ .double_trigger_mode = ADC_DOUBLE_TRIGGER_DISABLED, \
358
+ .adc_start_trigger_a = ADC_ACTIVE_TRIGGER_DISABLED, \
359
+ .adc_start_trigger_b = ADC_ACTIVE_TRIGGER_DISABLED, \
360
+ .adc_start_trigger_c_enabled = 0, \
361
+ .adc_start_trigger_c = ADC_ACTIVE_TRIGGER_DISABLED, \
362
+ .adc_elc_ctrl = ADC_ELC_SINGLE_SCAN, \
363
+ .window_a_irq = FSP_INVALID_VECTOR, \
364
+ .window_a_ipl = BSP_IRQ_DISABLED, \
365
+ .window_b_irq = FSP_INVALID_VECTOR, \
366
+ .window_b_ipl = BSP_IRQ_DISABLED, \
367
+ }; \
368
+ static const struct adc_rz_config adc_rz_config_##idx = { \
369
+ .channel_available_mask = DT_INST_PROP(idx, channel_available_mask), \
370
+ .fsp_api = &g_adc_on_adc, \
371
+ };
372
+
373
+ #define ADC_RZ_FSP_CFG (idx ) \
374
+ .fsp_cfg = \
375
+ { \
376
+ .unit = DT_INST_PROP(idx, unit), \
377
+ .mode = ADC_MODE_SINGLE_SCAN, \
378
+ .resolution = ADC_RESOLUTION_12_BIT, \
379
+ .alignment = (adc_alignment_t)ADC_ALIGNMENT_RIGHT, \
380
+ .trigger = ADC_TRIGGER_SOFTWARE, \
381
+ .p_callback = NULL, \
382
+ .p_context = NULL, \
383
+ .p_extend = &g_adc##idx##_cfg_extend, \
384
+ .scan_end_irq = DT_INST_IRQ_BY_NAME(idx, scanend, irq), \
385
+ .scan_end_ipl = DT_INST_IRQ_BY_NAME(idx, scanend, priority), \
386
+ .scan_end_b_irq = FSP_INVALID_VECTOR, \
387
+ .scan_end_b_ipl = BSP_IRQ_DISABLED, \
388
+ .scan_end_c_irq = FSP_INVALID_VECTOR, \
389
+ .scan_end_c_ipl = BSP_IRQ_DISABLED, \
390
+ }, \
391
+ .fsp_channel_cfg = { \
392
+ .scan_mask = 0, \
393
+ .scan_mask_group_b = 0, \
394
+ .priority_group_a = ADC_GROUP_A_PRIORITY_OFF, \
395
+ .add_mask = 0, \
396
+ .sample_hold_mask = 0, \
397
+ .sample_hold_states = 24, \
398
+ .scan_mask_group_c = 0, \
399
+ }
400
+
401
+ #endif /* CONFIG_ADC_RENESAS_RZ */
402
+
403
+ #ifdef CONFIG_CPU_CORTEX_M
404
+ #define GET_IRQ_FLAGS (index ) 0
405
+ #else /* Cortex-A/R */
406
+ #define GET_IRQ_FLAGS (index ) DT_INST_IRQ_BY_IDX(index, 0, flags)
407
+ #endif
408
+
409
+ #define ADC_RZ_IRQ_CONNECT (idx , irq_name , isr ) \
410
+ do { \
411
+ IRQ_CONNECT(DT_INST_IRQ_BY_NAME(idx, irq_name, irq), \
412
+ DT_INST_IRQ_BY_NAME(idx, irq_name, priority), isr, \
413
+ DEVICE_DT_INST_GET(idx), GET_IRQ_FLAGS(idx)); \
414
+ irq_enable(DT_INST_IRQ_BY_NAME(idx, irq_name, irq)); \
415
+ } while (0)
416
+
417
+ #define ADC_RZ_CONFIG_FUNC (idx ) ADC_RZ_IRQ_CONNECT(idx, scanend, adc_rz_isr);
418
+
419
+ #define ADC_RZ_INIT (idx ) \
420
+ ADC_RZ_EXTENDED_FSP_CFG(idx) \
327
421
static DEVICE_API(adc, adc_rz_api_##idx) = { \
328
422
.channel_setup = adc_rz_channel_setup, \
329
423
.read = adc_rz_read, \
330
424
.ref_internal = DT_INST_PROP(idx, vref_mv), \
331
425
IF_ENABLED(CONFIG_ADC_ASYNC, \
332
426
(.read_async = adc_rz_read_async))}; \
333
- static const struct adc_rz_config adc_rz_config_##idx = { \
334
- .channel_available_mask = DT_INST_PROP(idx, channel_available_mask), \
335
- .fsp_api = &g_adc_on_adc, \
336
- }; \
337
427
static struct adc_rz_data adc_rz_data_##idx = { \
338
428
ADC_CONTEXT_INIT_TIMER(adc_rz_data_##idx, ctx), \
339
429
ADC_CONTEXT_INIT_LOCK(adc_rz_data_##idx, ctx), \
340
430
ADC_CONTEXT_INIT_SYNC(adc_rz_data_##idx, ctx), \
341
431
.dev = DEVICE_DT_INST_GET(idx), \
342
- .fsp_cfg = \
343
- { \
344
- .mode = ADC_MODE_SINGLE_SCAN, \
345
- .p_callback = NULL, \
346
- .p_context = NULL, \
347
- .p_extend = &g_adc##idx##_cfg_extend, \
348
- .scan_end_irq = DT_INST_IRQ_BY_NAME(idx, scanend, irq), \
349
- .scan_end_ipl = DT_INST_IRQ_BY_NAME(idx, scanend, priority), \
350
- }, \
351
- .fsp_channel_cfg = \
352
- { \
353
- .scan_mask = 0, \
354
- .interrupt_setting = ADC_C_INTERRUPT_CHANNEL_SETTING_ENABLE, \
355
- }, \
432
+ ADC_RZ_FSP_CFG(idx), \
356
433
}; \
357
434
static int adc_rz_init_##idx(const struct device *dev) \
358
435
{ \
359
- ADC_RZG_CONFIG_FUNC (idx) \
436
+ ADC_RZ_CONFIG_FUNC (idx) \
360
437
return adc_rz_init(dev); \
361
438
} \
362
439
DEVICE_DT_INST_DEFINE(idx, adc_rz_init_##idx, NULL, &adc_rz_data_##idx, \
363
440
&adc_rz_config_##idx, POST_KERNEL, CONFIG_ADC_INIT_PRIORITY, \
364
441
&adc_rz_api_##idx)
365
442
366
- DT_INST_FOREACH_STATUS_OKAY (ADC_RZG_INIT );
443
+ DT_INST_FOREACH_STATUS_OKAY (ADC_RZ_INIT );
444
+
445
+ #undef DT_DRV_COMPAT
446
+ #define DT_DRV_COMPAT renesas_rz_adc_c
447
+
448
+ DT_INST_FOREACH_STATUS_OKAY (ADC_RZ_INIT );
0 commit comments