فهرست منبع

fix: 获取开机原因, 能区分rtc/wakeup开机 还是 上电复位 开机

Wendal Chen 4 سال پیش
والد
کامیت
dd5edc8a54
3فایلهای تغییر یافته به همراه49 افزوده شده و 20 حذف شده
  1. 3 3
      app/main.c
  2. 29 8
      app/port/luat_pm_air101.c
  3. 17 9
      platform/sys/wm_main.c

+ 3 - 3
app/main.c

@@ -99,7 +99,7 @@ static OS_STK __attribute__((aligned(4))) 			TaskStartStk[TASK_START_STK_SIZE] =
 
 #endif
 
-uint32_t rst_sta = 0;
+// uint32_t rst_sta = 0;
 
 #ifdef __LUATOS__
 extern unsigned int  TLS_FLASH_PARAM_DEFAULT        ;
@@ -131,8 +131,8 @@ void UserMain(void){
 	// printf("HR_CLK_SEL_CTL %08X\n", value);
 
 	// 读取开机原因
-	rst_sta = tls_reg_read32(HR_CLK_RST_STA);
-	tls_reg_write32(HR_CLK_RST_STA, 0xFF);
+	// rst_sta = tls_reg_read32(HR_CLK_RST_STA);
+	// tls_reg_write32(HR_CLK_RST_STA, 0xFF);
 
 #ifdef LUAT_USE_SHELL
 	luat_shell_poweron(0);

+ 29 - 8
app/port/luat_pm_air101.c

@@ -53,19 +53,40 @@ int luat_pm_dtimer_check(int id) {
 
 //void luat_pm_cb(int event, int arg, void* args);
 
-extern int rst_sta;
+#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
+extern int power_bk_reg; // from wm_main.c
 // extern int wake_src;
 int luat_pm_last_state(int *lastState, int *rtcOrPad) {
-    *rtcOrPad = 0; // 暂不支持
-    if (rst_sta & 0x01) { // bit 0 , watchdog 复位
-        *lastState = 8;
-    }
-    else if (rst_sta & 0x02) { // bit 1, 软件重启
-        *lastState = 3;
+    // 实际情况与寄存器手册的描述不符
+    // 复位开机,   是 00D90344
+    // RTC或wakeup 是 00D10240
+    if (CHECK_BIT(power_bk_reg, 8)) {
+        *lastState = 0;
+        *rtcOrPad = 0;
     }
     else {
-        *lastState = 0;
+        *lastState = 1;
+        *rtcOrPad = 4;
     }
+
+    // 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;
 }
 

+ 17 - 9
platform/sys/wm_main.c

@@ -163,24 +163,32 @@ void task_start_free()
 }
 #endif
 
-// int main(void)
-// {
-// 	tls_sys_clk_set(CPU_CLK_80M);
-
-// 	while (1);
-// }
+#define CHECK_BIT(var,pos) ((var) & (1<<(pos)))
+uint32 power_bk_reg = 0;
 
 
 int main(void)
 {
     u32 value = 0;
-    /*32K switch to use RC circuit & calibration*/
-    tls_pmu_clk_select(1);
 
-    /*Switch to DBG*/
     value = tls_reg_read32(HR_PMU_BK_REG);
+    power_bk_reg = value;
+    printf("HR_PMU_BK_REG PowerOn %08X\n", value);
+    printf("HR_PMU_BK_REG PowerOn Reson %08X\n", CHECK_BIT(value, 8));
+    printf("HR_PMU_BK_REG PowerOn RTC %08X\n", CHECK_BIT(value, 5));
+    printf("HR_PMU_BK_REG PowerOn Wakeup Pin %08X\n", CHECK_BIT(value, 2));
     value &= ~(BIT(19));
+    value &= ~(BIT(8));
+    value &= ~(BIT(5));
+    value &= ~(BIT(2));
+    // printf("HR_PMU_BK_REG write %08X\n", value);
     tls_reg_write32(HR_PMU_BK_REG, value);
+
+    /*32K switch to use RC circuit & calibration*/
+    tls_pmu_clk_select(1);
+
+    
+    /*Switch to DBG*/
     value = tls_reg_read32(HR_PMU_PS_CR);
     value &= ~(BIT(5));
     tls_reg_write32(HR_PMU_PS_CR, value);