Ver código fonte

rtctime.dsleep() current draw improvements (#1659)

* Switch off interrupts before rtctime dsleep.

* Deal with the fact that MCU keeps running after being told to enter deep sleep
(It can keep running for quite a few instructions at times (and none at
all at others), and it appears that trying to cache additional code from
SPI flash while trying to go to sleep fails miserably at both....)

* Ensure flash is not active when going into deep sleep.
Johny Mattsson 7 anos atrás
pai
commit
c5c0143b2f

+ 13 - 0
app/include/rtc/rtcaccess.h

@@ -54,4 +54,17 @@ static inline uint32_t rtc_reg_read(uint32_t addr)
   rtc_memw();
   return *((volatile uint32_t*)addr);
 }
+
+static inline void rtc_reg_write_and_loop(uint32_t addr, uint32_t val)
+{
+  addr+=RTC_MMIO_BASE;
+  rtc_memw();
+  asm("j 1f\n"
+      ".align 32\n"
+      "1:\n"
+      "s32i.n %1,%0,0\n"
+      "2:\n"
+      "j 2b\n"::"r"(addr),"r"(val):);
+}
+
 #endif

+ 6 - 4
app/include/rtc/rtctime_internal.h

@@ -396,6 +396,8 @@ static inline void rtc_time_add_sleep_tracking(uint32_t us, uint32_t cycles)
   }
 }
 
+extern void rtc_time_enter_deep_sleep_final(void);
+
 static void rtc_time_enter_deep_sleep_us(uint32_t us)
 {
   if (rtc_time_check_wake_magic())
@@ -430,14 +432,14 @@ static void rtc_time_enter_deep_sleep_us(uint32_t us)
   rtc_reg_write(0x9c,17);
   rtc_reg_write(0xa0,3);
 
-  // Clear bit 0 of DPORT 0x04. Doesn't seem to be necessary
-  // wm(0x3fff0004,bitrm(0x3fff0004),0xfffffffe));
+  volatile uint32_t* dport4=(volatile uint32_t*)0x3ff00004;
+  *dport4&=0xfffffffe;
+
   rtc_reg_write(0x40,-1);
   rtc_reg_write(0x44,32);
   rtc_reg_write(0x10,0);
 
-  rtc_reg_write(0x18,8);
-  rtc_reg_write(0x08,0x00100000); //  go to sleep
+  rtc_time_enter_deep_sleep_final();
 }
 
 static inline void rtc_time_deep_sleep_us(uint32_t us)

+ 8 - 0
app/modules/rtctime.c

@@ -35,6 +35,14 @@ static int __isleap (int year) {
 }
 
 // ******* C API functions *************
+void __attribute__((noreturn)) TEXT_SECTION_ATTR rtc_time_enter_deep_sleep_final (void)
+{
+  ets_intr_lock();
+  Cache_Read_Disable();
+  rtc_reg_write(0x18,8);
+  rtc_reg_write_and_loop(0x08,0x00100000); //  go to sleep
+  __builtin_unreachable();
+}
 
 void rtctime_early_startup (void)
 {