inport from local

Dependents:   Hobbyking_Cheetah_0511

Committer:
NYX
Date:
Mon Mar 16 06:35:48 2020 +0000
Revision:
0:85b3fd62ea1a
reinport to mbed;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
NYX 0:85b3fd62ea1a 1 /* mbed Microcontroller Library
NYX 0:85b3fd62ea1a 2 * Copyright (c) 2017 ARM Limited
NYX 0:85b3fd62ea1a 3 *
NYX 0:85b3fd62ea1a 4 * Licensed under the Apache License, Version 2.0 (the "License");
NYX 0:85b3fd62ea1a 5 * you may not use this file except in compliance with the License.
NYX 0:85b3fd62ea1a 6 * You may obtain a copy of the License at
NYX 0:85b3fd62ea1a 7 *
NYX 0:85b3fd62ea1a 8 * http://www.apache.org/licenses/LICENSE-2.0
NYX 0:85b3fd62ea1a 9 *
NYX 0:85b3fd62ea1a 10 * Unless required by applicable law or agreed to in writing, software
NYX 0:85b3fd62ea1a 11 * distributed under the License is distributed on an "AS IS" BASIS,
NYX 0:85b3fd62ea1a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
NYX 0:85b3fd62ea1a 13 * See the License for the specific language governing permissions and
NYX 0:85b3fd62ea1a 14 * limitations under the License.
NYX 0:85b3fd62ea1a 15 */
NYX 0:85b3fd62ea1a 16
NYX 0:85b3fd62ea1a 17 #include "mbed_sleep.h"
NYX 0:85b3fd62ea1a 18 #include "mbed_critical.h"
NYX 0:85b3fd62ea1a 19 #include "sleep_api.h"
NYX 0:85b3fd62ea1a 20 #include "mbed_error.h"
NYX 0:85b3fd62ea1a 21 #include <limits.h>
NYX 0:85b3fd62ea1a 22
NYX 0:85b3fd62ea1a 23 #if DEVICE_SLEEP
NYX 0:85b3fd62ea1a 24
NYX 0:85b3fd62ea1a 25 // deep sleep locking counter. A target is allowed to deep sleep if counter == 0
NYX 0:85b3fd62ea1a 26 static uint16_t deep_sleep_lock = 0U;
NYX 0:85b3fd62ea1a 27
NYX 0:85b3fd62ea1a 28 void sleep_manager_lock_deep_sleep(void)
NYX 0:85b3fd62ea1a 29 {
NYX 0:85b3fd62ea1a 30 core_util_critical_section_enter();
NYX 0:85b3fd62ea1a 31 if (deep_sleep_lock == USHRT_MAX) {
NYX 0:85b3fd62ea1a 32 core_util_critical_section_exit();
NYX 0:85b3fd62ea1a 33 error("Deep sleep lock would overflow (> USHRT_MAX)");
NYX 0:85b3fd62ea1a 34 }
NYX 0:85b3fd62ea1a 35 core_util_atomic_incr_u16(&deep_sleep_lock, 1);
NYX 0:85b3fd62ea1a 36 core_util_critical_section_exit();
NYX 0:85b3fd62ea1a 37 }
NYX 0:85b3fd62ea1a 38
NYX 0:85b3fd62ea1a 39 void sleep_manager_unlock_deep_sleep(void)
NYX 0:85b3fd62ea1a 40 {
NYX 0:85b3fd62ea1a 41 core_util_critical_section_enter();
NYX 0:85b3fd62ea1a 42 if (deep_sleep_lock == 0) {
NYX 0:85b3fd62ea1a 43 core_util_critical_section_exit();
NYX 0:85b3fd62ea1a 44 error("Deep sleep lock would underflow (< 0)");
NYX 0:85b3fd62ea1a 45 }
NYX 0:85b3fd62ea1a 46 core_util_atomic_decr_u16(&deep_sleep_lock, 1);
NYX 0:85b3fd62ea1a 47 core_util_critical_section_exit();
NYX 0:85b3fd62ea1a 48 }
NYX 0:85b3fd62ea1a 49
NYX 0:85b3fd62ea1a 50 bool sleep_manager_can_deep_sleep(void)
NYX 0:85b3fd62ea1a 51 {
NYX 0:85b3fd62ea1a 52 return deep_sleep_lock == 0 ? true : false;
NYX 0:85b3fd62ea1a 53 }
NYX 0:85b3fd62ea1a 54
NYX 0:85b3fd62ea1a 55 void sleep_manager_sleep_auto(void)
NYX 0:85b3fd62ea1a 56 {
NYX 0:85b3fd62ea1a 57 core_util_critical_section_enter();
NYX 0:85b3fd62ea1a 58 // debug profile should keep debuggers attached, no deep sleep allowed
NYX 0:85b3fd62ea1a 59 #ifdef MBED_DEBUG
NYX 0:85b3fd62ea1a 60 hal_sleep();
NYX 0:85b3fd62ea1a 61 #else
NYX 0:85b3fd62ea1a 62 if (sleep_manager_can_deep_sleep()) {
NYX 0:85b3fd62ea1a 63 hal_deepsleep();
NYX 0:85b3fd62ea1a 64 } else {
NYX 0:85b3fd62ea1a 65 hal_sleep();
NYX 0:85b3fd62ea1a 66 }
NYX 0:85b3fd62ea1a 67 #endif
NYX 0:85b3fd62ea1a 68 core_util_critical_section_exit();
NYX 0:85b3fd62ea1a 69 }
NYX 0:85b3fd62ea1a 70
NYX 0:85b3fd62ea1a 71 #else
NYX 0:85b3fd62ea1a 72
NYX 0:85b3fd62ea1a 73 // locking is valid only if DEVICE_SLEEP is defined
NYX 0:85b3fd62ea1a 74 // we provide empty implementation
NYX 0:85b3fd62ea1a 75
NYX 0:85b3fd62ea1a 76 void sleep_manager_lock_deep_sleep(void)
NYX 0:85b3fd62ea1a 77 {
NYX 0:85b3fd62ea1a 78
NYX 0:85b3fd62ea1a 79 }
NYX 0:85b3fd62ea1a 80
NYX 0:85b3fd62ea1a 81 void sleep_manager_unlock_deep_sleep(void)
NYX 0:85b3fd62ea1a 82 {
NYX 0:85b3fd62ea1a 83
NYX 0:85b3fd62ea1a 84 }
NYX 0:85b3fd62ea1a 85
NYX 0:85b3fd62ea1a 86 bool sleep_manager_can_deep_sleep(void)
NYX 0:85b3fd62ea1a 87 {
NYX 0:85b3fd62ea1a 88 // no sleep implemented
NYX 0:85b3fd62ea1a 89 return false;
NYX 0:85b3fd62ea1a 90 }
NYX 0:85b3fd62ea1a 91
NYX 0:85b3fd62ea1a 92 #endif