1 /*
2  * Copyright (c) 2006-2025, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-08-19     Mr.Tiger     first version
9  */
10 
11 #include "drv_config.h"
12 #ifdef RT_USING_ADC
13 
14 #define DRV_DEBUG
15 #define DBG_TAG              "drv.adc"
16 #ifdef DRV_DEBUG
17     #define DBG_LVL               DBG_LOG
18 #else
19     #define DBG_LVL               DBG_INFO
20 #endif /* DRV_DEBUG */
21 #include <rtdbg.h>
22 
23 struct ra_adc_map ra_adc[] =
24 {
25 #ifdef BSP_USING_ADC0
26     {
27       .device_name = "adc0",
28       .g_cfg = &g_adc0_cfg,
29       .g_ctrl = &g_adc0_ctrl,
30       .g_channel_cfg = &g_adc0_channel_cfg,
31     },
32 #endif
33 #ifdef BSP_USING_ADC1
34     {
35       .device_name = "adc1",
36       .g_cfg = &g_adc1_cfg,
37       .g_ctrl = &g_adc1_ctrl,
38       .g_channel_cfg = &g_adc1_channel_cfg,
39     },
40 #endif
41 };
42 
43 static struct rt_adc_dev adc_obj[sizeof(ra_adc) / sizeof(ra_adc[0])] = {0};
44 
ra_adc_enabled(struct rt_adc_device * device,rt_int8_t channel,rt_bool_t enabled)45 static rt_err_t ra_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled)
46 {
47     RT_ASSERT(device != RT_NULL);
48     struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
49     /**< start adc*/
50     if (enabled)
51     {
52         if (FSP_SUCCESS != R_ADC_ScanStart((adc_ctrl_t *)adc->g_ctrl))
53         {
54             LOG_E("start %s failed.", adc->device_name);
55             return -RT_ERROR;
56         }
57     }
58     else
59     {
60         /**< stop adc*/
61         if (FSP_SUCCESS != R_ADC_ScanStop((adc_ctrl_t *)adc->g_ctrl))
62         {
63             LOG_E("stop %s failed.", adc->device_name);
64             return -RT_ERROR;
65         }
66     }
67     return RT_EOK;
68 }
69 
ra_adc_close(struct rt_adc_device * device)70 rt_err_t ra_adc_close(struct rt_adc_device *device)
71 {
72     RT_ASSERT(device != RT_NULL);
73     struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
74     if (FSP_SUCCESS != R_ADC_Close((adc_ctrl_t *)adc->g_ctrl))
75     {
76         LOG_E("close %s failed.", adc->device_name);
77         return -RT_ERROR;
78     }
79     return RT_EOK;
80 }
81 
ra_get_adc_value(struct rt_adc_device * device,rt_int8_t channel,rt_uint32_t * value)82 static rt_err_t ra_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value)
83 {
84     RT_ASSERT(device != RT_NULL);
85     struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
86     if (RT_EOK != R_ADC_Read32((adc_ctrl_t *)adc->g_ctrl, channel, value))
87     {
88         LOG_E("get adc value failed.\n");
89         return -RT_ERROR;
90     }
91     return RT_EOK;
92 }
93 
94 static const struct rt_adc_ops ra_adc_ops =
95 {
96     .enabled = ra_adc_enabled,
97     .convert = ra_get_adc_value,
98 };
99 
ra_adc_init(void)100 static int ra_adc_init(void)
101 {
102     rt_err_t result = 0;
103     rt_size_t obj_num = sizeof(adc_obj) / sizeof(struct rt_adc_dev);
104 
105     for (int i = 0; i < obj_num; i++)
106     {
107         /* init ADC object */
108         result = R_ADC_Open((adc_ctrl_t *)ra_adc[i].g_ctrl, ra_adc[i].g_cfg);
109 
110         result = R_ADC_ScanCfg((adc_ctrl_t *)ra_adc[i].g_ctrl, ra_adc[i].g_channel_cfg);
111 
112         /* register ADC device */
113         if(rt_hw_adc_register(&adc_obj[i].adc_device,
114                                        ra_adc[i].device_name,
115                                        &ra_adc_ops,
116                                        &ra_adc[i]) == RT_EOK)
117         {
118             LOG_D("%s init success", ra_adc[i].device_name);
119         }
120         else
121         {
122             LOG_E("%s register failed", ra_adc[i].device_name);
123             result = -RT_ERROR;
124         }
125         RT_ASSERT(result == RT_EOK);
126     }
127     return RT_EOK;
128 }
129 INIT_DEVICE_EXPORT(ra_adc_init);
130 #endif
131