xref: /nrf52832-nimble/rt-thread/components/libc/compilers/armlibc/time.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  */
9*10465441SEvalZero #include <sys/time.h>
10*10465441SEvalZero #include <rtthread.h>
11*10465441SEvalZero 
12*10465441SEvalZero #ifdef RT_USING_DEVICE
gettimeofday(struct timeval * tp,void * ignore)13*10465441SEvalZero int gettimeofday(struct timeval *tp, void *ignore)
14*10465441SEvalZero {
15*10465441SEvalZero     time_t time;
16*10465441SEvalZero     rt_device_t device;
17*10465441SEvalZero 
18*10465441SEvalZero     device = rt_device_find("rtc");
19*10465441SEvalZero     if (device != RT_NULL)
20*10465441SEvalZero     {
21*10465441SEvalZero         rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time);
22*10465441SEvalZero         if (tp != RT_NULL)
23*10465441SEvalZero         {
24*10465441SEvalZero             tp->tv_sec = time;
25*10465441SEvalZero             tp->tv_usec = 0;
26*10465441SEvalZero         }
27*10465441SEvalZero 
28*10465441SEvalZero         return time;
29*10465441SEvalZero     }
30*10465441SEvalZero 
31*10465441SEvalZero     return 0;
32*10465441SEvalZero }
33*10465441SEvalZero #endif
34*10465441SEvalZero 
35*10465441SEvalZero /**
36*10465441SEvalZero  * Returns the current time.
37*10465441SEvalZero  *
38*10465441SEvalZero  * @param time_t * t the timestamp pointer, if not used, keep NULL.
39*10465441SEvalZero  *
40*10465441SEvalZero  * @return time_t return timestamp current.
41*10465441SEvalZero  *
42*10465441SEvalZero  */
43*10465441SEvalZero /* for IAR 6.2 later Compiler */
44*10465441SEvalZero #if defined (__IAR_SYSTEMS_ICC__) &&  (__VER__) >= 6020000
45*10465441SEvalZero #pragma module_name = "?time"
time_t(__time32)46*10465441SEvalZero time_t (__time32)(time_t *t) /* Only supports 32-bit timestamp */
47*10465441SEvalZero #else
48*10465441SEvalZero time_t time(time_t *t)
49*10465441SEvalZero #endif
50*10465441SEvalZero {
51*10465441SEvalZero     time_t time_now = 0;
52*10465441SEvalZero 
53*10465441SEvalZero #ifdef RT_USING_RTC
54*10465441SEvalZero     static rt_device_t device = RT_NULL;
55*10465441SEvalZero 
56*10465441SEvalZero     /* optimization: find rtc device only first. */
57*10465441SEvalZero     if (device == RT_NULL)
58*10465441SEvalZero     {
59*10465441SEvalZero         device = rt_device_find("rtc");
60*10465441SEvalZero     }
61*10465441SEvalZero 
62*10465441SEvalZero     /* read timestamp from RTC device. */
63*10465441SEvalZero     if (device != RT_NULL)
64*10465441SEvalZero     {
65*10465441SEvalZero         if (rt_device_open(device, 0) == RT_EOK)
66*10465441SEvalZero         {
67*10465441SEvalZero             rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now);
68*10465441SEvalZero             rt_device_close(device);
69*10465441SEvalZero         }
70*10465441SEvalZero     }
71*10465441SEvalZero #endif /* RT_USING_RTC */
72*10465441SEvalZero 
73*10465441SEvalZero     /* if t is not NULL, write timestamp to *t */
74*10465441SEvalZero     if (t != RT_NULL)
75*10465441SEvalZero     {
76*10465441SEvalZero         *t = time_now;
77*10465441SEvalZero     }
78*10465441SEvalZero 
79*10465441SEvalZero     return time_now;
80*10465441SEvalZero }
81*10465441SEvalZero 
clock(void)82*10465441SEvalZero RT_WEAK clock_t clock(void)
83*10465441SEvalZero {
84*10465441SEvalZero     return rt_tick_get();
85*10465441SEvalZero }
86