1 /* 2 * Copyright (c) 2021 Bestechnic (Shanghai) Co., Ltd. All rights reserved. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 #ifndef __HAL_SLEEP_H__ 16 #define __HAL_SLEEP_H__ 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 #include "plat_types.h" 23 24 enum HAL_CPU_WAKE_LOCK_USER_T { 25 HAL_CPU_WAKE_LOCK_USER_RTOS, 26 HAL_CPU_WAKE_LOCK_USER_EXTERNAL, 27 HAL_CPU_WAKE_LOCK_USER_AUDIOFLINGER, 28 HAL_CPU_WAKE_LOCK_USER_3, 29 HAL_CPU_WAKE_LOCK_USER_4, 30 HAL_SYS_WAKE_LOCK_USER_TRANSQ, 31 HAL_CPU_WAKE_LOCK_USER_6, 32 HAL_CPU_WAKE_LOCK_USER_7, 33 HAL_CPU_WAKE_LOCK_USER_8, 34 HAL_CPU_WAKE_LOCK_USER_9, 35 HAL_CPU_WAKE_LOCK_USER_10, 36 HAL_CPU_WAKE_LOCK_USER_11, 37 HAL_CPU_WAKE_LOCK_USER_12, 38 HAL_CPU_WAKE_LOCK_USER_13, 39 HAL_CPU_WAKE_LOCK_USER_14, 40 HAL_CPU_WAKE_LOCK_USER_15, 41 HAL_CPU_WAKE_LOCK_USER_16, 42 HAL_CPU_WAKE_LOCK_USER_17, 43 HAL_CPU_WAKE_LOCK_USER_18, 44 HAL_CPU_WAKE_LOCK_USER_19, 45 HAL_CPU_WAKE_LOCK_USER_20, 46 HAL_CPU_WAKE_LOCK_USER_21, 47 HAL_CPU_WAKE_LOCK_USER_22, 48 HAL_CPU_WAKE_LOCK_USER_23, 49 HAL_CPU_WAKE_LOCK_USER_24, 50 HAL_CPU_WAKE_LOCK_USER_25, 51 HAL_CPU_WAKE_LOCK_USER_26, 52 HAL_CPU_WAKE_LOCK_USER_27, 53 HAL_CPU_WAKE_LOCK_USER_28, 54 HAL_CPU_WAKE_LOCK_USER_29, 55 HAL_CPU_WAKE_LOCK_USER_30, 56 HAL_CPU_WAKE_LOCK_USER_31, 57 58 HAL_CPU_WAKE_LOCK_USER_QTY 59 }; 60 61 enum HAL_SYS_WAKE_LOCK_USER_T { 62 HAL_SYS_WAKE_LOCK_USER_INTERSYS, 63 HAL_SYS_WAKE_LOCK_USER_INTERSYS_HCI, 64 HAL_SYS_WAKE_LOCK_USER_I2C, 65 HAL_SYS_WAKE_LOCK_USER_3, 66 HAL_SYS_WAKE_LOCK_USER_4, 67 HAL_SYS_WAKE_LOCK_USER_5, 68 HAL_SYS_WAKE_LOCK_USER_6, 69 HAL_SYS_WAKE_LOCK_USER_7, 70 HAL_SYS_WAKE_LOCK_USER_8, 71 HAL_SYS_WAKE_LOCK_USER_9, 72 HAL_SYS_WAKE_LOCK_USER_10, 73 HAL_SYS_WAKE_LOCK_USER_11, 74 HAL_SYS_WAKE_LOCK_USER_12, 75 HAL_SYS_WAKE_LOCK_USER_13, 76 HAL_SYS_WAKE_LOCK_USER_14, 77 HAL_SYS_WAKE_LOCK_USER_15, 78 HAL_SYS_WAKE_LOCK_USER_16, 79 HAL_SYS_WAKE_LOCK_USER_17, 80 HAL_SYS_WAKE_LOCK_USER_18, 81 HAL_SYS_WAKE_LOCK_USER_19, 82 HAL_SYS_WAKE_LOCK_USER_20, 83 HAL_SYS_WAKE_LOCK_USER_21, 84 HAL_SYS_WAKE_LOCK_USER_22, 85 HAL_SYS_WAKE_LOCK_USER_23, 86 HAL_SYS_WAKE_LOCK_USER_24, 87 HAL_SYS_WAKE_LOCK_USER_25, 88 HAL_SYS_WAKE_LOCK_USER_26, 89 HAL_SYS_WAKE_LOCK_USER_27, 90 HAL_SYS_WAKE_LOCK_USER_28, 91 HAL_SYS_WAKE_LOCK_USER_29, 92 HAL_SYS_WAKE_LOCK_USER_30, 93 HAL_SYS_WAKE_LOCK_USER_31, 94 95 HAL_SYS_WAKE_LOCK_USER_QTY 96 }; 97 98 enum HAL_CHIP_WAKE_LOCK_USER_T { 99 HAL_CHIP_WAKE_LOCK_USER_ANC, 100 HAL_CHIP_WAKE_LOCK_USER_VAD, 101 HAL_CHIP_WAKE_LOCK_USER_CP, 102 HAL_CHIP_WAKE_LOCK_USER_3, 103 HAL_CHIP_WAKE_LOCK_USER_4, 104 HAL_CHIP_WAKE_LOCK_USER_5, 105 HAL_CHIP_WAKE_LOCK_USER_6, 106 HAL_CHIP_WAKE_LOCK_USER_7, 107 HAL_CHIP_WAKE_LOCK_USER_8, 108 HAL_CHIP_WAKE_LOCK_USER_9, 109 HAL_CHIP_WAKE_LOCK_USER_10, 110 HAL_CHIP_WAKE_LOCK_USER_11, 111 HAL_CHIP_WAKE_LOCK_USER_12, 112 HAL_CHIP_WAKE_LOCK_USER_13, 113 HAL_CHIP_WAKE_LOCK_USER_14, 114 HAL_CHIP_WAKE_LOCK_USER_15, 115 HAL_CHIP_WAKE_LOCK_USER_16, 116 HAL_CHIP_WAKE_LOCK_USER_17, 117 HAL_CHIP_WAKE_LOCK_USER_18, 118 HAL_CHIP_WAKE_LOCK_USER_19, 119 HAL_CHIP_WAKE_LOCK_USER_20, 120 HAL_CHIP_WAKE_LOCK_USER_21, 121 HAL_CHIP_WAKE_LOCK_USER_22, 122 HAL_CHIP_WAKE_LOCK_USER_23, 123 HAL_CHIP_WAKE_LOCK_USER_24, 124 HAL_CHIP_WAKE_LOCK_USER_25, 125 HAL_CHIP_WAKE_LOCK_USER_26, 126 HAL_CHIP_WAKE_LOCK_USER_27, 127 HAL_CHIP_WAKE_LOCK_USER_28, 128 HAL_CHIP_WAKE_LOCK_USER_29, 129 HAL_CHIP_WAKE_LOCK_USER_30, 130 HAL_CHIP_WAKE_LOCK_USER_31, 131 132 HAL_CHIP_WAKE_LOCK_USER_QTY 133 }; 134 135 enum HAL_SLEEP_HOOK_USER_T { 136 HAL_SLEEP_HOOK_USER_NVRECORD = 0, 137 HAL_SLEEP_HOOK_USER_OTA, 138 HAL_SLEEP_HOOK_NORFLASH_API, 139 HAL_SLEEP_HOOK_DUMP_LOG, 140 HAL_SLEEP_HOOK_USER_QTY 141 }; 142 143 enum HAL_DEEP_SLEEP_HOOK_USER_T { 144 HAL_DEEP_SLEEP_HOOK_USER_WDT = 0, 145 HAL_DEEP_SLEEP_HOOK_USER_NVRECORD, 146 HAL_DEEP_SLEEP_HOOK_USER_OTA, 147 HAL_DEEP_SLEEP_HOOK_NORFLASH_API, 148 HAL_DEEP_SLEEP_HOOK_DUMP_LOG, 149 HAL_DEEP_SLEEP_HOOK_USER_QTY 150 }; 151 152 enum HAL_SLEEP_STATUS_T { 153 HAL_SLEEP_STATUS_DEEP, 154 HAL_SLEEP_STATUS_LIGHT, 155 }; 156 157 enum HAL_PM_USER_TYPE_T { 158 HAL_PM_USER_HAL, 159 HAL_PM_USER_DRV, 160 HAL_PM_USER_APP_LOW_LEVEL, 161 HAL_PM_USER_APP_MED_LEVEL, 162 HAL_PM_USER_APP_HI_LEVEL, 163 164 HAL_PM_USER_QTY, 165 }; 166 167 enum HAL_PM_STATE_T { 168 HAL_PM_STATE_NORMAL_SLEEP, 169 HAL_PM_STATE_NORMAL_WAKEUP, 170 HAL_PM_STATE_POWER_DOWN_SLEEP, 171 HAL_PM_STATE_POWER_DOWN_WAKEUP, 172 173 HAL_PM_STATE_QTY, 174 }; 175 176 struct CPU_USAGE_T { 177 uint8_t busy; 178 uint8_t light_sleep; 179 uint8_t sys_deep_sleep; 180 uint8_t chip_deep_sleep; 181 }; 182 183 typedef int (*HAL_SLEEP_HOOK_HANDLER)(void); 184 typedef int (*HAL_DEEP_SLEEP_HOOK_HANDLER)(void); 185 typedef int (*HAL_PM_NOTIF_HANDLER)(enum HAL_PM_STATE_T state); 186 187 int hal_sleep_irq_pending(void); 188 189 int hal_sleep_specific_irq_pending(const uint32_t *irq, uint32_t cnt); 190 191 enum HAL_SLEEP_STATUS_T hal_sleep_enter_sleep(void); 192 193 enum HAL_SLEEP_STATUS_T hal_sleep_light_sleep(void); 194 195 int hal_sleep_set_sleep_hook(enum HAL_SLEEP_HOOK_USER_T user, HAL_SLEEP_HOOK_HANDLER handler); 196 197 int hal_sleep_set_deep_sleep_hook(enum HAL_DEEP_SLEEP_HOOK_USER_T user, HAL_DEEP_SLEEP_HOOK_HANDLER handler); 198 199 int hal_cpu_wake_lock(enum HAL_CPU_WAKE_LOCK_USER_T user); 200 201 int hal_cpu_wake_unlock(enum HAL_CPU_WAKE_LOCK_USER_T user); 202 203 int hal_sys_wake_lock(enum HAL_SYS_WAKE_LOCK_USER_T user); 204 205 int hal_sys_wake_unlock(enum HAL_SYS_WAKE_LOCK_USER_T user); 206 207 int hal_chip_wake_lock(enum HAL_CHIP_WAKE_LOCK_USER_T user); 208 209 int hal_chip_wake_unlock(enum HAL_CHIP_WAKE_LOCK_USER_T user); 210 211 void hal_sleep_power_down_enable(void); 212 213 void hal_sleep_power_down_disable(void); 214 215 int hal_pm_notif_register(enum HAL_PM_USER_TYPE_T user, HAL_PM_NOTIF_HANDLER handler); 216 217 int hal_pm_notif_deregister(enum HAL_PM_USER_TYPE_T user, HAL_PM_NOTIF_HANDLER handler); 218 219 void hal_sleep_start_stats(uint32_t stats_interval_ms, uint32_t trace_interval_ms); 220 221 int hal_sleep_get_stats(struct CPU_USAGE_T *usage); 222 223 #ifdef __cplusplus 224 } 225 #endif 226 227 #endif 228 229