From 6ea9a4b3b5880b369319241e846f45896748c8d0 Mon Sep 17 00:00:00 2001 From: Dozingfiretruck <1473454180@qq.com> Date: Wed, 25 Aug 2021 10:11:31 +0800 Subject: [PATCH] implement RTC framework V2.0 --- bsp/at32/Libraries/rt_drivers/drv_rtc.c | 121 ++++++++++-------------- 1 file 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 +#include #include #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) +{ +#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) + { + LOG_E("rtc init failed."); + return -RT_ERROR; + } + + 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; - RT_ASSERT(dev != RT_NULL); - switch (cmd) - { - 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; - 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; + 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);