diff --git a/bsp/simulator/drivers/drv_rtc.c b/bsp/simulator/drivers/drv_rtc.c index 27a0861d52bda842b839d371c739052a36afed2e..7e19714da2575046a08e284a8a858fea715d21da 100644 --- a/bsp/simulator/drivers/drv_rtc.c +++ b/bsp/simulator/drivers/drv_rtc.c @@ -48,7 +48,7 @@ static void soft_rtc_alarm_update(struct rt_rtc_wkalarm *palarm) static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args) { __time32_t *t; - struct tm *newtime; + struct tm newtime; RT_ASSERT(dev != RT_NULL); @@ -57,10 +57,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args) case RT_DEVICE_CTRL_RTC_GET_TIME: { t = (__time32_t *)args; - _time32(t); - /* TODO The libc time module not support timezone now. So get the time from locatime. */ - newtime = _localtime32(t); - *t = _mkgmtime32(newtime); + SYSTEMTIME sys_time; + + GetSystemTime(&sys_time); + newtime.tm_year = sys_time.wYear - 1900; + newtime.tm_mon = sys_time.wMonth - 1; + newtime.tm_mday = sys_time.wDay; + newtime.tm_hour = sys_time.wHour; + newtime.tm_min = sys_time.wMinute; + newtime.tm_sec = sys_time.wSecond; + *t = timegm(&newtime); break; } case RT_DEVICE_CTRL_RTC_SET_TIME: @@ -79,6 +85,16 @@ static rt_err_t soft_rtc_control(rt_device_t dev, int cmd, void *args) soft_rtc_alarm_update(&wkalarm); break; #endif + case RT_DEVICE_CTRL_RTC_GET_TIME_US: + { + long *tv_usec = (long *)args; + SYSTEMTIME sys_time; + GetSystemTime(&sys_time); + *tv_usec = sys_time.wMilliseconds * 1000UL; + break; + } + default: + return -RT_ERROR; } return RT_EOK; diff --git a/components/libc/compilers/common/time.c b/components/libc/compilers/common/time.c index 72aa8a42f484fe4172966f2fd9d387f21f87186a..dcfc4b97764db1a97edfd712a9a0c95d8c1408cf 100644 --- a/components/libc/compilers/common/time.c +++ b/components/libc/compilers/common/time.c @@ -120,7 +120,7 @@ struct tm* localtime_r(const time_t* t, struct tm* r) time_t local_tz; int utc_plus; - utc_plus = 0; /* GTM: UTC+0 */ + utc_plus = 8; /* GMT: UTC+8 */ local_tz = *t + utc_plus * 3600; return gmtime_r(&local_tz, r); } @@ -183,18 +183,14 @@ char* ctime(const time_t *tim_p) } RTM_EXPORT(ctime); -/** - * Returns the current time. - * - * @param time_t * t the timestamp pointer, if not used, keep NULL. - * - * @return The value ((time_t)-1) is returned if the calendar time is not available. - * If timer is not a NULL pointer, the return value is also stored in timer. - * - */ -RT_WEAK time_t time(time_t *t) +static void get_timeval(struct timeval *tv) { - time_t time_now = ((time_t)-1); /* default is not available */ + if (tv == RT_NULL) + return; + /* default is not available */ + tv->tv_sec = -1; + /* default is 0 */ + tv->tv_usec = 0; #ifdef RT_USING_RTC static rt_device_t device = RT_NULL; @@ -210,26 +206,41 @@ RT_WEAK time_t time(time_t *t) { if (rt_device_open(device, 0) == RT_EOK) { - rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &time_now); + rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME, &tv->tv_sec); + rt_device_control(device, RT_DEVICE_CTRL_RTC_GET_TIME_US, &tv->tv_usec); rt_device_close(device); } } #endif /* RT_USING_RTC */ - /* if t is not NULL, write timestamp to *t */ - if (t != RT_NULL) - { - *t = time_now; - } - - if(time_now == (time_t)-1) + if (tv->tv_sec == (time_t) -1) { /* LOG_W will cause a recursive printing if ulog timestamp function is turned on */ rt_kprintf("Cannot find a RTC device to provide time!\r\n"); errno = ENOSYS; } +} - return time_now; +/** + * Returns the current time. + * + * @param time_t * t the timestamp pointer, if not used, keep NULL. + * + * @return The value ((time_t)-1) is returned if the calendar time is not available. + * If timer is not a NULL pointer, the return value is also stored in timer. + * + */ +RT_WEAK time_t time(time_t *t) +{ + struct timeval now; + + get_timeval(&now); + + if (t) + { + *t = now.tv_sec; + } + return now.tv_sec; } RTM_EXPORT(time); @@ -344,12 +355,10 @@ RTM_EXPORT(timegm); /* TODO: timezone */ int gettimeofday(struct timeval *tv, struct timezone *tz) { - time_t t = time(RT_NULL); + get_timeval(tv); - if (tv != RT_NULL && t != (time_t)-1) + if (tv != RT_NULL && tv->tv_sec != (time_t) -1) { - tv->tv_sec = t; - tv->tv_usec = 0; return 0; } else diff --git a/include/rtdef.h b/include/rtdef.h index b368208175c9d8caccc5c6b17bc1ccde8dae50f2..aba8a6f12d24f446aea09baf2188a63fc42e2254 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -962,10 +962,12 @@ enum rt_device_class_type #define RT_DEVICE_CTRL_BLK_AUTOREFRESH 0x13 /**< block device : enter/exit auto refresh mode */ #define RT_DEVICE_CTRL_NETIF_GETMAC 0x10 /**< get mac address */ #define RT_DEVICE_CTRL_MTD_FORMAT 0x10 /**< format a MTD device */ -#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10 /**< get time */ -#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11 /**< set time */ +#define RT_DEVICE_CTRL_RTC_GET_TIME 0x10 /**< get second time */ +#define RT_DEVICE_CTRL_RTC_SET_TIME 0x11 /**< set second time */ #define RT_DEVICE_CTRL_RTC_GET_ALARM 0x12 /**< get alarm */ #define RT_DEVICE_CTRL_RTC_SET_ALARM 0x13 /**< set alarm */ +#define RT_DEVICE_CTRL_RTC_GET_TIME_US 0x14 /**< get microsecond time */ +#define RT_DEVICE_CTRL_RTC_SET_TIME_US 0x15 /**< set microsecond time */ typedef struct rt_device *rt_device_t;