-
-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(power): Initial deep sleep work.
* New ZMK_SLEEP Kconfig symbol to enable the functionality. * Switch to PORT events that allows wake from deep sleep. * Initial basic power management policy, with idle ms, and ignoring deep sleep if we detect a USB connection.
- Loading branch information
1 parent
9be5666
commit a7496ab
Showing
5 changed files
with
121 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
/* | ||
* Copyright (c) 2020 The ZMK Contributors | ||
* | ||
* SPDX-License-Identifier: MIT | ||
*/ | ||
|
||
#include <zephyr.h> | ||
#include <kernel.h> | ||
#include <power/power.h> | ||
|
||
#include <logging/log.h> | ||
|
||
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); | ||
|
||
#include <zmk/usb.h> | ||
#include <zmk/event-manager.h> | ||
#include <zmk/events/position-state-changed.h> | ||
#include <zmk/events/sensor-event.h> | ||
|
||
static u32_t power_last_uptime; | ||
|
||
#define MAX_IDLE_MS CONFIG_ZMK_IDLE_SLEEP_TIMEOUT | ||
|
||
bool is_usb_power_present() { | ||
#ifdef CONFIG_USB | ||
enum usb_dc_status_code usb_status = zmk_usb_get_status(); | ||
switch (usb_status) { | ||
case USB_DC_DISCONNECTED: | ||
case USB_DC_UNKNOWN: | ||
return false; | ||
default: | ||
return true; | ||
} | ||
#else | ||
return false; | ||
#endif /* CONFIG_USB */ | ||
} | ||
|
||
enum power_states sys_pm_policy_next_state(s32_t ticks) { | ||
#ifdef CONFIG_SYS_POWER_DEEP_SLEEP_STATES | ||
#ifdef CONFIG_HAS_SYS_POWER_STATE_DEEP_SLEEP_1 | ||
s32_t current = k_uptime_get(); | ||
if (power_last_uptime > 0 && !is_usb_power_present() && | ||
current - power_last_uptime > MAX_IDLE_MS) { | ||
return SYS_POWER_STATE_DEEP_SLEEP_1; | ||
} | ||
#endif /* CONFIG_HAS_SYS_POWER_STATE_DEEP_SLEEP_1 */ | ||
#endif /* CONFIG_SYS_POWER_DEEP_SLEEP_STATES */ | ||
|
||
return SYS_POWER_STATE_ACTIVE; | ||
} | ||
|
||
int power_event_listener(const struct zmk_event_header *eh) { | ||
power_last_uptime = k_uptime_get(); | ||
|
||
return 0; | ||
} | ||
|
||
int power_init() { | ||
power_last_uptime = k_uptime_get(); | ||
|
||
return 0; | ||
} | ||
|
||
ZMK_LISTENER(power, power_event_listener); | ||
ZMK_SUBSCRIPTION(power, position_state_changed); | ||
ZMK_SUBSCRIPTION(power, sensor_event); | ||
|
||
SYS_INIT(power_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY); |