Browse Source

update: 重新适配rtc

Wendal Chen 3 years ago
parent
commit
ad1c7db4f1
2 changed files with 122 additions and 15 deletions
  1. 11 7
      app/main.c
  2. 111 8
      app/port/luat_rtc_air101.c

+ 11 - 7
app/main.c

@@ -13,6 +13,7 @@
 #include "luat_base.h"
 #include "luat_msgbus.h"
 #include "luat_pm.h"
+#include "luat_rtc.h"
 
 #include <string.h>
 #include "wm_irq.h"
@@ -122,16 +123,19 @@ void UserMain(void){
 	// printf("Bit 2 -- %d\n", CHECK_BIT(power_bk_reg, 2));
 	//printf("bsp reboot_reason %d\n", tls_sys_get_reboot_reason());
 
-	struct tm tblock = {0};
+	struct tm tt = {0};
+	luat_rtc_get(&tt);
+	printf("main get %d-%d-%d %d:%d:%d\n", tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec);
 	
-	uint32_t rtc_ctrl1 = tls_reg_read32(HR_PMU_RTC_CTRL1);
+	// uint32_t rtc_ctrl1 = tls_reg_read32(HR_PMU_RTC_CTRL1);
+	// printf("rtc_ctrl1 %ld\n", rtc_ctrl1);
 	// 如果RTC计数少于1, 那肯定是第一次开机, 启动RTC并设置到1970年.
 	// uint32_t rtc_ctrl2 = tls_reg_read32(HR_PMU_RTC_CTRL2);
-	if (0x2 > rtc_ctrl1) {
-		tblock.tm_mday = 1;
-		tblock.tm_mon = 0;
-		tblock.tm_year = 70;
-		tls_set_rtc(&tblock);
+	if (tt.tm_year == 0) {
+		tt.tm_mday = 1;
+		tt.tm_mon = 0;
+		tt.tm_year = 71;
+		luat_rtc_set(&tt);
 	}
 	else {
 		// 只需要确保RTC启用

+ 111 - 8
app/port/luat_rtc_air101.c

@@ -1,3 +1,4 @@
+#include "luat_base.h"
 #include "luat_rtc.h"
 #include "luat_msgbus.h"
 #include "wm_rtc.h"
@@ -6,6 +7,9 @@
 #define LUAT_LOG_TAG "rtc"
 #include "luat_log.h"
 
+int rtc_timezone;
+
+
 static int luat_rtc_handler(lua_State *L, void* ptr) {
     lua_getglobal(L, "sys_pub");
     if (lua_isfunction(L, -1)) {
@@ -25,8 +29,12 @@ static void luat_rtc_cb(void *arg) {
 int luat_rtc_set(struct tm *tblock) {
     if (tblock == NULL)
         return -1;
-    tblock->tm_mon ++;
+    // TODO 防御非法的RTC值
     tls_set_rtc(tblock);
+    struct tm tt;
+    tls_get_rtc(&tt);
+    // printf("set %d-%d-%d %d:%d:%d\n", tblock->tm_year + 1900, tblock->tm_mon + 1, tblock->tm_mday, tblock->tm_hour, tblock->tm_min, tblock->tm_sec);
+    // printf("get %d-%d-%d %d:%d:%d\n", tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec);
     return 0;
 }
 
@@ -34,7 +42,6 @@ int luat_rtc_get(struct tm *tblock) {
     if (tblock == NULL)
         return -1;
     tls_get_rtc(tblock);
-    tblock->tm_mon --;
     return 0;
 }
 
@@ -54,22 +61,26 @@ int luat_rtc_timer_stop(int id) {
 }
 
 int luat_rtc_timezone(int* timezone) {
-    return 32; // 暂不支持
+    if (timezone)
+        rtc_timezone = *timezone;
+    return rtc_timezone;
 }
 
 void luat_rtc_set_tamp32(uint32_t tamp) {
     time_t t;
-    t = tamp + (8*3600); // 固定东八区
+    t = tamp;
     struct tm *tblock = gmtime(&t);
     luat_rtc_set(tblock);
 }
 
 time_t time(time_t* _tm)
 {
-  struct tm tmt = {0};
-  tls_get_rtc(&tmt);
-  tmt.tm_mon --;
-  time_t t = mktime(&tmt);
+  struct tm tt = {0};
+  tls_get_rtc(&tt);
+//   printf(">> %d-%d-%d %d:%d:%d\n", tt.tm_year + 1900, tt.tm_mon + 1, tt.tm_mday, tt.tm_hour, tt.tm_min, tt.tm_sec);
+  time_t t = mktime(&tt);
+  if (rtc_timezone)
+    t += rtc_timezone * (3600 / 4);
   if (_tm != NULL)
     memcpy(_tm, &t, sizeof(time_t));
   return t;
@@ -79,3 +90,95 @@ clock_t clock(void)
 {
   return (clock_t)time(NULL);
 }
+
+//---------------------------------------
+#include "c_common.h"
+void RTC_GetDateTime(Date_UserDataStruct *Date, Time_UserDataStruct *Time);
+
+time_t __wrap_mktime(struct tm* tt) {
+    Time_UserDataStruct Time = {0};
+	Date_UserDataStruct Date = {0};
+
+    Time.Hour = tt->tm_hour;
+    Time.Min = tt->tm_min;
+    Time.Sec = tt->tm_sec;
+    Time.Week = tt->tm_wday;
+
+    Date.Day = tt->tm_mday;
+    Date.Mon = tt->tm_mon + 1;
+    Date.Year = tt->tm_year + 1900;
+    // printf("????\n");
+    uint64_t t = UTC2Tamp(&Date, &Time);
+    // printf("????2\n");
+    time_t tmp = (time_t) t & 0xFFFFFFFF;
+    return tmp;
+}
+
+void RTC_GetDateTime(Date_UserDataStruct *Date, Time_UserDataStruct *Time) {
+    struct tm tt = {0};
+    tls_get_rtc(&tt);
+    Time->Hour = tt.tm_hour;
+    Time->Min = tt.tm_min;
+    Time->Sec = tt.tm_sec;
+    Time->Week = tt.tm_wday;
+
+    Date->Day = tt.tm_mday;
+    Date->Mon = tt.tm_mon + 1;
+    Date->Year = tt.tm_year + 1900;
+}
+
+static struct tm prvTM;
+extern const uint32_t DayTable[2][12];
+
+struct tm *__wrap_localtime (const time_t *_timer)
+{
+	Time_UserDataStruct Time;
+	Date_UserDataStruct Date;
+	uint64_t Sec;
+	if (_timer)
+	{
+		Sec = *_timer;
+		Tamp2UTC(Sec, &Date, &Time, 0);
+	}
+	else
+	{
+		RTC_GetDateTime(&Date, &Time);
+	}
+	prvTM.tm_year = Date.Year - 1900;
+	prvTM.tm_mon = Date.Mon - 1;
+	prvTM.tm_mday = Date.Day;
+	prvTM.tm_hour = Time.Hour;
+	prvTM.tm_min = Time.Min;
+	prvTM.tm_sec = Time.Sec;
+	prvTM.tm_wday = Time.Week;
+	prvTM.tm_yday = Date.Day - 1;
+	prvTM.tm_yday += DayTable[IsLeapYear(Date.Year)][Date.Mon - 1];
+	return &prvTM;
+}
+
+struct tm *__wrap_gmtime (const time_t *_timer)
+{
+	Time_UserDataStruct Time;
+	Date_UserDataStruct Date;
+	uint64_t Sec;
+	if (_timer)
+	{
+		Sec = *_timer;
+		Tamp2UTC(Sec, &Date, &Time, 0);
+	}
+	else
+	{
+		RTC_GetDateTime(&Date, &Time);
+	}
+	prvTM.tm_year = Date.Year - 1900;
+	prvTM.tm_mon = Date.Mon - 1;
+	prvTM.tm_mday = Date.Day;
+	prvTM.tm_hour = Time.Hour;
+	prvTM.tm_min = Time.Min;
+	prvTM.tm_sec = Time.Sec;
+	prvTM.tm_wday = Time.Week;
+	prvTM.tm_yday = Date.Day - 1;
+	prvTM.tm_yday += DayTable[IsLeapYear(Date.Year)][Date.Mon - 1];
+	return &prvTM;
+}
+