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