summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorMeco Man <[email protected]>2021-02-08 00:56:31 +0800
committerMeco Man <[email protected]>2021-02-08 00:56:31 +0800
commit6c7dd305329602611aba93772357aa5a394a3a6e (patch)
tree7c9e3fcb7802500aed14464cc570b95bc3f84e50 /components
parent4c6962436ae8a89252c397dffac4b865f5cb663f (diff)
add function settimeofday & stime
Diffstat (limited to 'components')
-rw-r--r--components/libc/compilers/common/sys/time.h4
-rw-r--r--components/libc/compilers/common/time.c71
2 files changed, 55 insertions, 20 deletions
diff --git a/components/libc/compilers/common/sys/time.h b/components/libc/compilers/common/sys/time.h
index e99fd7d54f..599b8b5262 100644
--- a/components/libc/compilers/common/sys/time.h
+++ b/components/libc/compilers/common/sys/time.h
@@ -48,8 +48,10 @@ struct timezone {
int tz_dsttime; /* type of dst correction */
};
-int gettimeofday(struct timeval *tp, struct timezone *tz);
+int stime(const time_t *t);
time_t timegm(struct tm * const t);
+int gettimeofday(struct timeval *tv, struct timezone *tz);
+int settimeofday(const struct timeval *tv, const struct timezone *tz);
#ifdef __cplusplus
}
diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c
index bdbb27bce4..155a04f92f 100644
--- a/components/libc/compilers/common/time.c
+++ b/components/libc/compilers/common/time.c
@@ -8,6 +8,8 @@
* 2019-08-21 zhangjun copy from minilibc
* 2020-09-07 Meco Man combine gcc armcc iccarm
* 2021-02-05 Meco Man add timegm()
+ * 2021-02-07 Meco Man fixed gettimeofday() time()
+ * 2021-02-08 Meco Man add settimeofday() stime()
*/
#include <sys/time.h>
@@ -175,24 +177,15 @@ time_t time(time_t *t)
#endif
{
time_t time_now = 0;
-
#ifdef RT_USING_RTC
- static rt_device_t device = RT_NULL;
-
- /* optimization: find rtc device only first. */
- if (device == RT_NULL)
- {
- device = rt_device_find("rtc");
- }
+ rt_device_t device;
/* read timestamp from RTC device. */
- if (device != RT_NULL)
+ device = rt_device_find("rtc");
+ if (rt_device_open(device, 0) == RT_EOK)
{
- if (rt_device_open(device, 0) == RT_EOK)
- {
- rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
- rt_device_close(device);
- }
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
+ rt_device_close(device);
}
#endif /* RT_USING_RTC */
@@ -210,15 +203,27 @@ RT_WEAK clock_t clock(void)
return rt_tick_get();
}
-/* TODO: timezone */
-int gettimeofday(struct timeval *tp, struct timezone *tz)
+int stime(const time_t *t)
{
- if (tp != RT_NULL)
+#ifdef RT_USING_RTC
+ rt_device_t device;
+
+ /* read timestamp from RTC device. */
+ device = rt_device_find("rtc");
+ if (rt_device_open(device, 0) == RT_EOK)
+ {
+ rt_device_control(device, RT_DEVICE_CTRL_RTC_SET_TIME, (void*)t);
+ rt_device_close(device);
+ }
+ else
{
- tp->tv_sec = time(RT_NULL);
- tp->tv_usec = 0;
+ return -1;
}
return 0;
+
+#else
+ return -1;
+#endif /* RT_USING_RTC */
}
time_t timegm(struct tm * const t)
@@ -294,3 +299,31 @@ time_t timegm(struct tm * const t)
i = 60;
return ((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
}
+
+/* TODO: timezone */
+int gettimeofday(struct timeval *tv, struct timezone *tz)
+{
+ if (tv != RT_NULL)
+ {
+ tv->tv_sec = time(RT_NULL);
+ tv->tv_usec = 0;
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
+}
+
+/* TODO: timezone */
+int settimeofday(const struct timeval *tv, const struct timezone *tz)
+{
+ if (tv != RT_NULL)
+ {
+ return stime(&tv->tv_sec);
+ }
+ else
+ {
+ return -1;
+ }
+}