245 lines
5.7 KiB
C
245 lines
5.7 KiB
C
/*----------------------------------------------------------------------------
|
|
* Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved.
|
|
*
|
|
* Description: rtc_port.c
|
|
*
|
|
* Author: luziquan@ss-tjd.com
|
|
*
|
|
* Create: 2024-07-12
|
|
*--------------------------------------------------------------------------*/
|
|
|
|
#include "rtc_port.h"
|
|
#include "rtc.h"
|
|
#include "rtc_api.h"
|
|
#include "sql_setting.h"
|
|
#include "stdint.h"
|
|
#include "sys/time.h"
|
|
#include "sys_config.h"
|
|
#include "time.h"
|
|
#include <stdbool.h>
|
|
|
|
#define ENABLE_PRINT_INFO 1
|
|
#if ENABLE_PRINT_INFO
|
|
#define static_print_info(...) sys_rtc_log_i(__VA_ARGS__) // 一般信息打印宏控制
|
|
#define static_print_warn(...) sys_rtc_log_w(__VA_ARGS__) // 警告信息打印一般常开
|
|
#define static_print_error(...) sys_rtc_log_e(__VA_ARGS__) // 错误信息打印一般常开
|
|
#else
|
|
#define static_print_info(...)
|
|
#define static_print_warn(...)
|
|
#define static_print_error(...)
|
|
#endif
|
|
|
|
static bool rtc_init_flag = false;
|
|
|
|
uint32_t rtc_host_peripheral_init(uint64_t *timestamp)
|
|
{
|
|
rtc_init_flag = true;
|
|
|
|
sql_setting_get_system_time(timestamp);
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_host_peripheral_deinit(void)
|
|
{
|
|
static_print_info("rtc_host_peripheral_deinit success");
|
|
|
|
rtc_init_flag = false;
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_set_timestamp(const uint64_t timestamp)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
struct timeval tv = {0};
|
|
struct timezone tz = {0};
|
|
|
|
if (rtc_init_flag == false) {
|
|
static_print_error("rtc_host_peripheral_init failed");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
tv.tv_sec = timestamp;
|
|
tz.tz_minuteswest = sql_setting_get_zone();
|
|
ret = settimeofday(&tv, &tz);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("settimeofday failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_set_ms_timestamp(const uint64_t timestamp_ms)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
struct timeval tv = {0};
|
|
struct timezone tz = {0};
|
|
|
|
if (rtc_init_flag == false) {
|
|
static_print_error("rtc_host_peripheral_init failed");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
tv.tv_sec = timestamp_ms / 1000;
|
|
tv.tv_usec = timestamp_ms % 1000;
|
|
tz.tz_minuteswest = sql_setting_get_zone();
|
|
ret = settimeofday(&tv, &tz);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("settimeofday failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_get_timestamp(uint64_t *timestamp)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
struct timeval tv = {0};
|
|
|
|
if (rtc_init_flag == false) {
|
|
static_print_error("rtc_host_peripheral_init failed");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
ret = gettimeofday(&tv, NULL);
|
|
if (ret != RTC_SUCC) {
|
|
*timestamp = 0;
|
|
static_print_error("gettimeofday failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
*timestamp = tv.tv_sec + rtc_get_diff();
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_get_ms_timestamp(uint64_t *timestamp_ms)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
struct timeval tv = {0};
|
|
|
|
if (rtc_init_flag == false) {
|
|
static_print_error("rtc_host_peripheral_init failed");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
ret = gettimeofday(&tv, NULL);
|
|
if (ret != RTC_SUCC) {
|
|
*timestamp_ms = 0;
|
|
static_print_error("gettimeofday failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
*timestamp_ms = ((uint64_t)tv.tv_sec + rtc_get_diff()) * 1000 + (uint64_t)tv.tv_usec / 1000;
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_set_diff_time_of_sec(const int64_t secs)
|
|
{
|
|
sql_setting_set_time_diff(secs);
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
int32_t rtc_get_diff(void)
|
|
{
|
|
return sql_setting_get_time_diff();
|
|
}
|
|
|
|
uint32_t rtc_save_time_of_sql(uint64_t timestamp)
|
|
{
|
|
sql_setting_set_system_time(timestamp);
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
#if ALARM_ENABLE
|
|
static rtc_handle_t g_rtc_handle;
|
|
static rtc_alarm_callback g_rtc_callback = NULL;
|
|
static uint64_t alarm_time = 0;
|
|
|
|
uint32_t rtc_alarm_init(void)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
|
|
ret = uapi_rtc_init();
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("uapi_rtc_init failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = uapi_rtc_adapter(RTC_0, 3, 3);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("Tuapi_rtc_adapter fail 0x%x", ret);
|
|
return ret;
|
|
}
|
|
|
|
ret = uapi_rtc_create(RTC_0, &g_rtc_handle);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("uapi_rtc_create 0x%x", ret);
|
|
return ret;
|
|
}
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t rtc_alarm_deinit(void)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t register_rtc_alarm_callback(rtc_alarm_callback callback)
|
|
{
|
|
g_rtc_callback = callback;
|
|
return RTC_SUCC;
|
|
}
|
|
|
|
uint32_t set_alarm_time(struct tm *time)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
uint64_t timestamp = 0;
|
|
struct timeval tv = {0};
|
|
|
|
if (rtc_init_flag == false) {
|
|
static_print_error("rtc_host_peripheral_init failed");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
ret = rtc_time_valid(time);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("rtc_time_valid failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static void rtc_callback_handle(uintptr_t data)
|
|
{
|
|
unused(data);
|
|
uapi_rtc_start(g_rtc_handle, 1000, rtc_callback_handle, NULL);
|
|
}
|
|
|
|
uint32_t ret_alarm_start(void)
|
|
{
|
|
uint32_t ret = RTC_SUCC;
|
|
|
|
if (g_rtc_handle == NULL) {
|
|
static_print_error("g_rtc_handle is NULL");
|
|
return RTC_FAIL;
|
|
}
|
|
|
|
ret = uapi_rtc_start(g_rtc_handle, 1000, rtc_callback_handle, NULL);
|
|
if (ret != RTC_SUCC) {
|
|
static_print_error("uapi_rtc_start failed, ret = %x", ret);
|
|
return ret;
|
|
}
|
|
|
|
return RTC_SUCC;
|
|
}
|
|
#endif
|