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