summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDozingfiretruck <[email protected]>2021-08-25 10:11:31 +0800
committerDozingfiretruck <[email protected]>2021-08-25 10:11:50 +0800
commit6ea9a4b3b5880b369319241e846f45896748c8d0 (patch)
tree1711184a7c98a5d853f10ef8b26edd6f02aa0ec2
parent00373d5e23e02f8e0de07e2713e6898933c0705b (diff)
implement RTC framework V2.0
-rw-r--r--bsp/at32/Libraries/rt_drivers/drv_rtc.c121
1 files changed, 50 insertions, 71 deletions
diff --git a/bsp/at32/Libraries/rt_drivers/drv_rtc.c b/bsp/at32/Libraries/rt_drivers/drv_rtc.c
index d943123e88..9eba173741 100644
--- a/bsp/at32/Libraries/rt_drivers/drv_rtc.c
+++ b/bsp/at32/Libraries/rt_drivers/drv_rtc.c
@@ -4,12 +4,14 @@
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
- * Date Author Notes
- * 2020-05-19 shelton first version
+ * Date Author Notes
+ * 2020-05-19 shelton first version
+ * 2021-08-125 Dozingfiretruck implement RTC framework V2.0
*/
#include "board.h"
#include <rtthread.h>
+#include <rtdevice.h>
#include <sys/time.h>
#ifdef BSP_USING_RTC
@@ -24,8 +26,6 @@
#define BKUP_REG_DATA 0xA5A5
-static struct rt_device rtc;
-
static time_t get_rtc_timestamp(void)
{
#ifdef SOC_SERIES_AT32F415
@@ -93,25 +93,7 @@ static rt_err_t set_rtc_time_stamp(time_t time_stamp)
return RT_EOK;
}
-static void rt_rtc_init(void)
-{
-#if defined (SOC_SERIES_AT32F415)
- RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR, ENABLE);
-#else
- RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR | RCC_APB1PERIPH_BKP, ENABLE);
-#endif
-
-#ifdef BSP_RTC_USING_LSI
- RCC_LSICmd(ENABLE);
- while(RCC_GetFlagStatus(RCC_FLAG_LSISTBL) == RESET);
-#else
- PWR_BackupAccessCtrl(ENABLE);
- RCC_LSEConfig(RCC_LSE_ENABLE);
- while(RCC_GetFlagStatus(RCC_FLAG_LSESTBL) == RESET);
-#endif /* BSP_RTC_USING_LSI */
-}
-
-static rt_err_t rt_rtc_config(struct rt_device *dev)
+static rt_err_t rt_rtc_config(void)
{
#if defined (SOC_SERIES_AT32F415)
ERTC_InitType ERTC_InitStructure;
@@ -166,73 +148,70 @@ static rt_err_t rt_rtc_config(struct rt_device *dev)
return RT_EOK;
}
-static rt_err_t rt_rtc_control(rt_device_t dev, int cmd, void *args)
+static rt_err_t at32_rtc_init(void)
{
- rt_err_t result = RT_EOK;
- RT_ASSERT(dev != RT_NULL);
- switch (cmd)
+#if defined (SOC_SERIES_AT32F415)
+ RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR, ENABLE);
+#else
+ RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR | RCC_APB1PERIPH_BKP, ENABLE);
+#endif
+
+#ifdef BSP_RTC_USING_LSI
+ RCC_LSICmd(ENABLE);
+ while(RCC_GetFlagStatus(RCC_FLAG_LSISTBL) == RESET);
+#else
+ PWR_BackupAccessCtrl(ENABLE);
+ RCC_LSEConfig(RCC_LSE_ENABLE);
+ while(RCC_GetFlagStatus(RCC_FLAG_LSESTBL) == RESET);
+#endif /* BSP_RTC_USING_LSI */
+ if (rt_rtc_config() != RT_EOK)
{
- case RT_DEVICE_CTRL_RTC_GET_TIME:
- *(rt_uint32_t *)args = get_rtc_timestamp();
- LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args);
- break;
+ LOG_E("rtc init failed.");
+ return -RT_ERROR;
+ }
- case RT_DEVICE_CTRL_RTC_SET_TIME:
- if (set_rtc_time_stamp(*(rt_uint32_t *)args))
- {
- result = -RT_ERROR;
- }
- LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args);
- break;
+ return RT_EOK;
+}
+
+static rt_err_t at32_rtc_get_secs(void *args)
+{
+ *(rt_uint32_t *)args = get_rtc_timestamp();
+ LOG_D("RTC: get rtc_time %x\n", *(rt_uint32_t *)args);
+
+ return RT_EOK;
+}
+
+static rt_err_t at32_rtc_set_secs(void *args)
+{
+ rt_err_t result = RT_EOK;
+
+ if (set_rtc_time_stamp(*(rt_uint32_t *)args))
+ {
+ result = -RT_ERROR;
}
+ LOG_D("RTC: set rtc_time %x\n", *(rt_uint32_t *)args);
return result;
}
-#ifdef RT_USING_DEVICE_OPS
-const static struct rt_device_ops rtc_ops =
+static const struct rt_rtc_ops at32_rtc_ops =
{
+ at32_rtc_init,
+ at32_rtc_get_secs,
+ at32_rtc_set_secs,
RT_NULL,
RT_NULL,
RT_NULL,
RT_NULL,
- RT_NULL,
- rt_rtc_control
};
-#endif
-
-static rt_err_t rt_hw_rtc_register(rt_device_t device, const char *name, rt_uint32_t flag)
-{
- RT_ASSERT(device != RT_NULL);
- rt_rtc_init();
- if (rt_rtc_config(device) != RT_EOK)
- {
- return -RT_ERROR;
- }
-#ifdef RT_USING_DEVICE_OPS
- device->ops = &rtc_ops;
-#else
- device->init = RT_NULL;
- device->open = RT_NULL;
- device->close = RT_NULL;
- device->read = RT_NULL;
- device->write = RT_NULL;
- device->control = rt_rtc_control;
-#endif
- device->type = RT_Device_Class_RTC;
- device->rx_indicate = RT_NULL;
- device->tx_complete = RT_NULL;
- device->user_data = RT_NULL;
-
- /* register a character device */
- return rt_device_register(device, name, flag);
-}
+static rt_rtc_dev_t at32_rtc_dev;
int rt_hw_rtc_init(void)
{
rt_err_t result;
- result = rt_hw_rtc_register(&rtc, "rtc", RT_DEVICE_FLAG_RDWR);
+ at32_rtc_dev.ops = &at32_rtc_ops;
+ result = rt_hw_rtc_register(&at32_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR,RT_NULL);
if (result != RT_EOK)
{
LOG_E("rtc register err code: %d", result);