summaryrefslogtreecommitdiff
path: root/bsp/hpmicro/libraries/drivers/drv_rtc.c
blob: 114ad7a07bb674dc23f3286df9c019e3743c730d (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
/*
 * Copyright (c) 2021 hpmicro
 *
 * SPDX-License-Identifier: BSD-3-Clause
 *
 * Change Logs:
 * Date         Author      Notes
 * 2021-09-19   HPMICRO     First version
 */
#include "board.h"
#include "drv_rtc.h"
#include "hpm_rtc_drv.h"

#include <rtthread.h>
#include <rtdevice.h>
#include <rtdbg.h>

#ifdef RT_USING_RTC

/*******************************************************************************************
 *
 *  Prototypes
 *
 ******************************************************************************************/
static rt_err_t hpm_rtc_init(rt_device_t dev);
static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag);
static rt_err_t hpm_rtc_close(rt_device_t dev);
static rt_ssize_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size);
static rt_ssize_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size);
static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args);

static time_t hpm_rtc_get_timestamp(void);
static int hpm_rtc_set_timestamp(time_t timestamp);

/*******************************************************************************************
 *
 *  Variables
 *
 ******************************************************************************************/
static struct rt_device hpm_rtc= {
    .type = RT_Device_Class_RTC,
    .init = hpm_rtc_init,
    .open = hpm_rtc_open,
    .close = hpm_rtc_close,
    .read = hpm_rtc_read,
    .write = hpm_rtc_write,
    .control = hpm_rtc_control,
};

/*******************************************************************************************
 *
 *  Codes
 *
 ******************************************************************************************/
static rt_err_t hpm_rtc_init(rt_device_t dev)
{
    return RT_EOK;
}
static rt_err_t hpm_rtc_open(rt_device_t dev, rt_uint16_t oflag)
{
    return RT_EOK;
}
static rt_err_t hpm_rtc_close(rt_device_t dev)
{
    return RT_EOK;
}
static rt_ssize_t hpm_rtc_read(rt_device_t dev, rt_off_t pos, void *buf, rt_size_t size)
{
    return 0;
}
static rt_ssize_t hpm_rtc_write(rt_device_t dev, rt_off_t pos, const void *buf, rt_size_t size)
{
    return 0;
}
static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args)
{
    RT_ASSERT(dev != RT_NULL);

    rt_err_t err = RT_EOK;

    switch(cmd) {
        case RT_DEVICE_CTRL_RTC_GET_TIME:
            *(uint32_t *)args = hpm_rtc_get_timestamp();
            break;
        case RT_DEVICE_CTRL_RTC_SET_TIME:
            hpm_rtc_set_timestamp(*(time_t *)args);
            break;
        default:
            err = RT_EINVAL;
            break;
    }

    return err;
}

static time_t hpm_rtc_get_timestamp(void)
{
    time_t time = rtc_get_time(HPM_RTC);

    return time;
}

static int hpm_rtc_set_timestamp(time_t timestamp)
{
    (void)rtc_config_time(HPM_RTC, timestamp);

    return RT_EOK;
}


int rt_hw_rtc_init(void)
{
    rt_err_t err = RT_EOK;

    err = rt_device_register(&hpm_rtc, "rtc", RT_DEVICE_FLAG_RDWR);
    if (err != RT_EOK) {
        LOG_E("rt device %s failed, status=%d\n", "rtc", err);
        return err;
    }

    rt_device_open(&hpm_rtc, RT_DEVICE_FLAG_RDWR);

    return RT_EOK;
}

INIT_DEVICE_EXPORT(rt_hw_rtc_init);

#endif /* RT_USING_RTC */