Browse Source

update: 重新适配pm的开机原因 https://gitee.com/openLuat/LuatOS/issues/I6Q00J

Wendal Chen 3 years ago
parent
commit
a788012b26
3 changed files with 81 additions and 28 deletions
  1. 25 1
      app/main.c
  2. 2 2
      app/port/luat_malloc_air101.c
  3. 54 25
      app/port/luat_pm_air101.c

+ 25 - 1
app/main.c

@@ -4,6 +4,7 @@
 #include "wm_internal_flash.h"
 #include "wm_rtc.h"
 #include "wm_osal.h"
+#include "wm_watchdog.h"
 
 #ifdef __LUATOS__
 #include "string.h"
@@ -87,10 +88,27 @@ static void check_stack(void* ptr) {
 	}
 }
 
+static const const char* reason[] = {
+	"power or reset",
+	"by charge", // 不可能
+	"wakeup by rtc",
+	"reset by software",
+	"unkown",
+	"reset by key",
+	"reboot by exception",
+	"reboot by tool",
+	"reset by watchdoy",
+	"reset by pad",
+	"by charge" // 不可能
+};
+
+extern int luat_pm_get_poweron_reason(void);
+extern int power_bk_reg;
+#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
 void UserMain(void){
 	char unique_id [18] = {0};
 
-	tls_uart_options_t opt;
+	tls_uart_options_t opt = {0};
 	opt.baudrate = UART_BAUDRATE_B921600;
 	opt.charlength = TLS_UART_CHSIZE_8BIT;
 	opt.flow_ctrl = TLS_UART_FLOW_CTRL_NONE;
@@ -98,6 +116,12 @@ void UserMain(void){
 	opt.stopbits = TLS_UART_ONE_STOPBITS;
 	tls_uart_port_init(0, &opt, 0);
 
+	LLOGD("poweron: %s", reason[luat_pm_get_poweron_reason()]);
+	// printf("Bit 8 -- %d\n", CHECK_BIT(power_bk_reg, 8));
+	// printf("Bit 5 -- %d\n", CHECK_BIT(power_bk_reg, 5));
+	// 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};
 	
 	uint32_t rtc_ctrl1 = tls_reg_read32(HR_PMU_RTC_CTRL1);

+ 2 - 2
app/port/luat_malloc_air101.c

@@ -60,9 +60,9 @@ extern luat_profiler_mem_t profiler_memregs[];
 void luat_heap_init(void) {
 	// 毕竟sram还是快很多的, 优先sram吧
 #ifndef LUAT_USE_TLSF
-	bpool((void*)(0x20048000 - LUAT_HEAP_MIN_SIZE), LUAT_HEAP_MIN_SIZE);
+	bpool((void*)(0x20048000 - LUAT_HEAP_MIN_SIZE), LUAT_HEAP_MIN_SIZE - 64);
 #else
-	luavm_tlsf = tlsf_create_with_pool((void*)(0x20048000 - LUAT_HEAP_MIN_SIZE), LUAT_HEAP_MIN_SIZE);
+	luavm_tlsf = tlsf_create_with_pool((void*)(0x20048000 - LUAT_HEAP_MIN_SIZE), LUAT_HEAP_MIN_SIZE - 64);
 #endif
 
 #ifdef LUAT_USE_PSRAM

+ 54 - 25
app/port/luat_pm_air101.c

@@ -4,6 +4,8 @@
 #include "wm_pmu.h"
 #include "wm_regs.h"
 #include "wm_timer.h"
+#include "wm_watchdog.h"
+#include "wm_ram_config.h"
 
 #define LUAT_LOG_TAG "pm"
 #include "luat_log.h"
@@ -60,39 +62,66 @@ int luat_pm_dtimer_check(int id) {
 extern int power_bk_reg; // from wm_main.c
 // extern int wake_src;
 int luat_pm_last_state(int *lastState, int *rtcOrPad) {
-    // 实际情况与寄存器手册的描述不符
-    // 复位开机,   是 00D90344
-    // RTC或wakeup 是 00D10240
-    if (CHECK_BIT(power_bk_reg, 8)) {
+    int reson = tls_sys_get_reboot_reason();
+    switch (tls_sys_get_reboot_reason())
+    {
+    case REBOOT_REASON_POWER_ON:// 硬件复位开机
         *lastState = 0;
         *rtcOrPad = 0;
-    }
-    else {
-        *lastState = 1;
+        break;
+    case REBOOT_REASON_STANDBY: // 唤醒重启
+        *lastState = 3;
+        *rtcOrPad = 3;
+        break;
+    case REBOOT_REASON_EXCEPTION: // 异常重启
+        *lastState = 0;
+        *rtcOrPad = 1;
+        break;
+    case REBOOT_REASON_WDG_TIMEOUT: // 硬狗超时
+        *lastState = 0;
+        *rtcOrPad = 1;
+        break;
+    case REBOOT_REASON_ACTIVE: // 用户主动复位
+        *lastState = 0;
+        *rtcOrPad = 0;
+        break;
+    case REBOOT_REASON_SLEEP: // 不可能出现
+        *lastState = 0;
         *rtcOrPad = 4;
+        break;
+
+    default:
+        break;
     }
 
-    // if (CHECK_BIT(power_bk_reg, 8)) {
-    //     if (CHECK_BIT(power_bk_reg, 5)) {
-    //         *lastState = 3;
-    //         *rtcOrPad = 1;
-    //     }
-    //     else if (CHECK_BIT(power_bk_reg, 2)) {
-    //         *lastState = 3;
-    //         *rtcOrPad = 2;
-    //     }
-    //     else {
-    //         *lastState = 99;
-    //         *rtcOrPad = 0;
-    //     }
-    // }
-    // else {
-    //     *lastState = 0;
-    //     *rtcOrPad = 0;
-    // }
     return 0;
 }
 
+int luat_pm_get_poweron_reason(void)
+{
+int reson = tls_sys_get_reboot_reason();
+    switch (tls_sys_get_reboot_reason())
+    {
+    case REBOOT_REASON_POWER_ON:// 硬件复位开机
+        return 0;
+    case REBOOT_REASON_STANDBY:
+        return 2;
+    case REBOOT_REASON_EXCEPTION:
+        return 6;
+    case REBOOT_REASON_WDG_TIMEOUT:
+        return 8;
+    case REBOOT_REASON_ACTIVE:
+        return 3;
+    case REBOOT_REASON_SLEEP:
+        return 2;
+
+    default:
+        break;
+    }
+
+    return 4;
+}
+
 int luat_pm_force(int mode) {
     return luat_pm_request(mode);
 }