summaryrefslogtreecommitdiff
path: root/components/drivers/rtc/soft_rtc.c
diff options
context:
space:
mode:
Diffstat (limited to 'components/drivers/rtc/soft_rtc.c')
-rw-r--r--components/drivers/rtc/soft_rtc.c63
1 files changed, 55 insertions, 8 deletions
diff --git a/components/drivers/rtc/soft_rtc.c b/components/drivers/rtc/soft_rtc.c
index adcbf81fe3..6a04314675 100644
--- a/components/drivers/rtc/soft_rtc.c
+++ b/components/drivers/rtc/soft_rtc.c
@@ -11,8 +11,7 @@
#include <time.h>
#include <string.h>
#include <rtthread.h>
-
-#include <drivers/rtc.h>
+#include <rtdevice.h>
#ifdef RT_USING_SOFT_RTC
@@ -28,9 +27,37 @@ static struct rt_device soft_rtc_dev;
static rt_tick_t init_tick;
static time_t init_time;
+#ifdef RT_USING_ALARM
+
+static struct rt_rtc_wkalarm wkalarm;
+static struct rt_timer alarm_time;
+
+static void alarm_timeout(void *param)
+{
+ rt_alarm_update(param, 1);
+}
+
+static void soft_rtc_alarm_update(struct rt_rtc_wkalarm *palarm)
+{
+ rt_tick_t next_tick;
+
+ if (palarm->enable)
+ {
+ next_tick = RT_TICK_PER_SECOND;
+ rt_timer_control(&alarm_time, RT_TIMER_CTRL_SET_TIME, &next_tick);
+ rt_timer_start(&alarm_time);
+ }
+ else
+ {
+ rt_timer_stop(&alarm_time);
+ }
+}
+
+#endif
+
static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
{
- time_t *time;
+ time_t *t;
struct tm time_temp;
RT_ASSERT(dev != RT_NULL);
@@ -39,16 +66,27 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args)
switch (cmd)
{
case RT_DEVICE_CTRL_RTC_GET_TIME:
- time = (time_t *) args;
- *time = init_time + (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
+ t = (time_t *) args;
+ *t = init_time + (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
break;
-
case RT_DEVICE_CTRL_RTC_SET_TIME:
{
- time = (time_t *) args;
- init_time = *time - (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
+ t = (time_t *) args;
+ init_time = *t - (rt_tick_get() - init_tick) / RT_TICK_PER_SECOND;
+#ifdef RT_USING_ALARM
+ soft_rtc_alarm_update(&wkalarm);
+#endif
break;
}
+#ifdef RT_USING_ALARM
+ case RT_DEVICE_CTRL_RTC_GET_ALARM:
+ *((struct rt_rtc_wkalarm *)args) = wkalarm;
+ break;
+ case RT_DEVICE_CTRL_RTC_SET_ALARM:
+ wkalarm = *((struct rt_rtc_wkalarm *)args);
+ soft_rtc_alarm_update(&wkalarm);
+ break;
+#endif
}
return RT_EOK;
@@ -78,6 +116,15 @@ int rt_soft_rtc_init(void)
/* make sure only one 'rtc' device */
RT_ASSERT(!rt_device_find("rtc"));
+#ifdef RT_USING_ALARM
+ rt_timer_init(&alarm_time,
+ "alarm",
+ alarm_timeout,
+ &soft_rtc_dev,
+ 0,
+ RT_TIMER_FLAG_SOFT_TIMER|RT_TIMER_FLAG_ONE_SHOT);
+#endif
+
init_tick = rt_tick_get();
init_time = mktime(&time_new);