summaryrefslogtreecommitdiff
path: root/bsp/renesas/libraries/HAL_Drivers/drivers/drv_adc.c
blob: 51d61725f969ea5f57dbdffaba59b48d06066fe3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-08-19     Mr.Tiger     first version
 */

#include "drv_config.h"
#ifdef RT_USING_ADC

#define DRV_DEBUG
#define DBG_TAG "drv.adc"
#ifdef DRV_DEBUG
#define DBG_LVL DBG_LOG
#else
#define DBG_LVL DBG_INFO
#endif /* DRV_DEBUG */
#include <rtdbg.h>

#if defined(SOC_SERIES_R7KA8P1)

#define R_ADC_Open      R_ADC_B_Open
#define R_ADC_ScanCfg   R_ADC_B_ScanCfg
#define R_ADC_ScanStart R_ADC_B_ScanStart
#define R_ADC_Read32    R_ADC_B_Read32
#define R_ADC_Read      R_ADC_B_Read
#define R_ADC_ScanStop  R_ADC_B_ScanStop
#define R_ADC_Close     R_ADC_B_Close

#elif defined(SOC_SERIES_R7SA6W1)

#define R_ADC_Open           R_ADC_W_Open
#define R_ADC_ScanCfg        R_ADC_W_ScanCfg
#define R_ADC_ScanStart      R_ADC_W_ScanStart
#define R_ADC_Read32         R_ADC_W_Read32
#define R_ADC_Read           R_ADC_W_Read
#define R_ADC_ScanStop       R_ADC_W_ScanStop
#define R_ADC_Close          R_ADC_W_Close
#define RA_ADC_FULL_SCALE_MV 1400
#endif

struct ra_adc_map ra_adc[] = {
#ifdef BSP_USING_ADC0
    {
        .device_name = "adc0",
        .g_cfg = &g_adc0_cfg,
        .g_ctrl = &g_adc0_ctrl,
#ifdef SOC_SERIES_R7KA8P1
        .g_channel_cfg = &g_adc0_scan_cfg,
#else
        .g_channel_cfg = &g_adc0_channel_cfg,
#endif
    },
#endif
#ifdef BSP_USING_ADC1
    {
        .device_name = "adc1",
        .g_cfg = &g_adc1_cfg,
        .g_ctrl = &g_adc1_ctrl,
        .g_channel_cfg = &g_adc1_channel_cfg,
    },
#endif
};

static struct rt_adc_dev adc_obj[sizeof(ra_adc) / sizeof(ra_adc[0])] = { 0 };

static rt_err_t ra_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
    /**< start adc*/
    if (enabled)
    {
        if (FSP_SUCCESS != R_ADC_ScanStart((adc_ctrl_t *)adc->g_ctrl))
        {
            LOG_E("start %s failed.", adc->device_name);
            return -RT_ERROR;
        }
    }
    else
    {
        /**< stop adc*/
        if (FSP_SUCCESS != R_ADC_ScanStop((adc_ctrl_t *)adc->g_ctrl))
        {
            LOG_E("stop %s failed.", adc->device_name);
            return -RT_ERROR;
        }
    }
    return RT_EOK;
}

rt_err_t ra_adc_close(struct rt_adc_device *device)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
    if (FSP_SUCCESS != R_ADC_Close((adc_ctrl_t *)adc->g_ctrl))
    {
        LOG_E("close %s failed.", adc->device_name);
        return -RT_ERROR;
    }
    return RT_EOK;
}

static rt_err_t ra_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value)
{
    RT_ASSERT(device != RT_NULL);
    struct ra_adc_map *adc = (struct ra_adc_map *)device->parent.user_data;
    if (RT_EOK != R_ADC_Read32((adc_ctrl_t *)adc->g_ctrl, channel, value))
    {
        LOG_E("get adc value failed.\n");
        return -RT_ERROR;
    }
#if defined(SOC_SERIES_R7SA6W1)
    /* R_ADC_W returns the 12-bit result left-aligned in a 16-bit FIFO field. */
    *value >>= 4U;
#endif
    return RT_EOK;
}

static rt_uint8_t ra_adc_get_resolution(struct rt_adc_device *device)
{
    struct ra_adc_map *adc;

    RT_ASSERT(device != RT_NULL);
    adc = (struct ra_adc_map *)device->parent.user_data;

    switch (adc->g_cfg->resolution)
    {
    case ADC_RESOLUTION_12_BIT:
        return 12;
    case ADC_RESOLUTION_10_BIT:
        return 10;
    case ADC_RESOLUTION_7_BIT:
        return 7;
    case ADC_RESOLUTION_4_BIT:
        return 4;
    default:
        return 0;
    }
}
static rt_int16_t ra_adc_get_vref(struct rt_adc_device *device)
{
#if defined(SOC_SERIES_R7SA6W1)
    return RA_ADC_FULL_SCALE_MV;
#else
    return 0;
#endif
}

static const struct rt_adc_ops ra_adc_ops = {
    .enabled = ra_adc_enabled,
    .convert = ra_get_adc_value,
    .get_resolution = ra_adc_get_resolution,
    .get_vref = ra_adc_get_vref,
};

static int ra_adc_init(void)
{
    rt_err_t result = 0;
    rt_size_t obj_num = sizeof(adc_obj) / sizeof(struct rt_adc_dev);

    for (int i = 0; i < obj_num; i++)
    {
        /* init ADC object */
        result = R_ADC_Open((adc_ctrl_t *)ra_adc[i].g_ctrl, ra_adc[i].g_cfg);

        result = R_ADC_ScanCfg((adc_ctrl_t *)ra_adc[i].g_ctrl, ra_adc[i].g_channel_cfg);

        /* register ADC device */
        if (rt_hw_adc_register(&adc_obj[i].adc_device,
                               ra_adc[i].device_name,
                               &ra_adc_ops,
                               &ra_adc[i]) == RT_EOK)
        {
            LOG_D("%s init success", ra_adc[i].device_name);
        }
        else
        {
            LOG_E("%s register failed", ra_adc[i].device_name);
            result = -RT_ERROR;
        }
        RT_ASSERT(result == RT_EOK);
    }
    return RT_EOK;
}
INIT_DEVICE_EXPORT(ra_adc_init);
#endif