Merge pull request #7201 from jepler/rp2040-light-sleep
raspberrypi: Make port_idle_until_interrupt work
This commit is contained in:
commit
ef34378b1d
@ -120,13 +120,14 @@ SRC_LWIP :=
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
INC += \
|
INC += \
|
||||||
-I. \
|
-I. \
|
||||||
-Ilwip_inc \
|
-Ilwip_inc \
|
||||||
-I../.. \
|
-I../.. \
|
||||||
-I../lib/mp-readline \
|
-I../lib/mp-readline \
|
||||||
-I../shared/timeutils \
|
-I../shared/timeutils \
|
||||||
-Iboards/$(BOARD) \
|
-Iboards/$(BOARD) \
|
||||||
-Iboards/ \
|
-Iboards/ \
|
||||||
|
-isystem ./../../lib/cmsis/inc \
|
||||||
-isystem sdk/ \
|
-isystem sdk/ \
|
||||||
-isystem sdk/src/common/pico_base/include/ \
|
-isystem sdk/src/common/pico_base/include/ \
|
||||||
-isystem sdk/src/common/pico_binary_info/include/ \
|
-isystem sdk/src/common/pico_binary_info/include/ \
|
||||||
|
@ -72,6 +72,9 @@
|
|||||||
|
|
||||||
#include "supervisor/serial.h"
|
#include "supervisor/serial.h"
|
||||||
|
|
||||||
|
#include "tusb.h"
|
||||||
|
#include <cmsis_compiler.h>
|
||||||
|
|
||||||
extern volatile bool mp_msc_enabled;
|
extern volatile bool mp_msc_enabled;
|
||||||
|
|
||||||
STATIC void _tick_callback(uint alarm_num);
|
STATIC void _tick_callback(uint alarm_num);
|
||||||
@ -241,38 +244,48 @@ uint32_t port_get_saved_word(void) {
|
|||||||
return __scratch_x_start__;
|
return __scratch_x_start__;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static volatile bool ticks_enabled;
|
||||||
|
|
||||||
uint64_t port_get_raw_ticks(uint8_t *subticks) {
|
uint64_t port_get_raw_ticks(uint8_t *subticks) {
|
||||||
uint64_t microseconds = time_us_64();
|
uint64_t microseconds = time_us_64();
|
||||||
return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977;
|
return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC void _tick_callback(uint alarm_num) {
|
STATIC void _tick_callback(uint alarm_num) {
|
||||||
supervisor_tick();
|
if (ticks_enabled) {
|
||||||
hardware_alarm_set_target(0, delayed_by_us(get_absolute_time(), 977));
|
supervisor_tick();
|
||||||
|
hardware_alarm_set_target(0, delayed_by_us(get_absolute_time(), 977));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable 1/1024 second tick.
|
// Enable 1/1024 second tick.
|
||||||
void port_enable_tick(void) {
|
void port_enable_tick(void) {
|
||||||
|
ticks_enabled = true;
|
||||||
hardware_alarm_set_target(0, delayed_by_us(get_absolute_time(), 977));
|
hardware_alarm_set_target(0, delayed_by_us(get_absolute_time(), 977));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable 1/1024 second tick.
|
// Disable 1/1024 second tick.
|
||||||
void port_disable_tick(void) {
|
void port_disable_tick(void) {
|
||||||
// hardware_alarm_cancel(0);
|
// One additional _tick_callback may occur, but it will just return
|
||||||
|
// whenever !ticks_enabled. Cancel is not called just in case
|
||||||
|
// it could nuke a timeout set by port_interrupt_after_ticks.
|
||||||
|
ticks_enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is called by sleep, we ignore it when our ticks are enabled because
|
// This is called by sleep, we ignore it when our ticks are enabled because
|
||||||
// they'll wake us up earlier. If we don't, we'll mess up ticks by overwriting
|
// they'll wake us up earlier. If we don't, we'll mess up ticks by overwriting
|
||||||
// the next RTC wake up time.
|
// the next RTC wake up time.
|
||||||
void port_interrupt_after_ticks(uint32_t ticks) {
|
void port_interrupt_after_ticks(uint32_t ticks) {
|
||||||
|
if (!ticks_enabled) {
|
||||||
|
hardware_alarm_set_target(0, delayed_by_us(get_absolute_time(), ticks * 977));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void port_idle_until_interrupt(void) {
|
void port_idle_until_interrupt(void) {
|
||||||
common_hal_mcu_disable_interrupts();
|
common_hal_mcu_disable_interrupts();
|
||||||
if (!background_callback_pending()) {
|
if (!background_callback_pending() && !tud_task_event_ready()) {
|
||||||
// TODO: Does not work when board is power-cycled.
|
__DSB();
|
||||||
// asm volatile ("dsb 0xF" ::: "memory");
|
__WFI();
|
||||||
// __wfi();
|
|
||||||
}
|
}
|
||||||
common_hal_mcu_enable_interrupts();
|
common_hal_mcu_enable_interrupts();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user