/* * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and * its subsidiaries and affiliates (collectly called MKSEMI). * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into an MKSEMI * integrated circuit in a product or a software update for such product, * must reproduce the above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or other materials * provided with the distribution. * * 3. Neither the name of MKSEMI nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * 4. This software, with or without modification, must only be used with a * MKSEMI integrated circuit. * * 5. Any software provided in binary form under this license must not be * reverse engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef MK_POWER_H_ #define MK_POWER_H_ #include "mk_common.h" /** * @addtogroup MK8000_Power * @{ */ /** Wakeup sources */ enum POWER_WAKEUP_SOURCE_T { POWER_WAKEUP_BY_GPIO_0 = 0, POWER_WAKEUP_BY_GPIO_1, POWER_WAKEUP_BY_GPIO_2, POWER_WAKEUP_BY_GPIO_3, POWER_WAKEUP_BY_GPIO_4, POWER_WAKEUP_BY_GPIO_5, POWER_WAKEUP_BY_GPIO_6, POWER_WAKEUP_BY_GPIO_7, POWER_WAKEUP_BY_GPIO_8, POWER_WAKEUP_BY_GPIO_9, POWER_WAKEUP_BY_GPIO_10, POWER_WAKEUP_BY_GPIO_11, POWER_WAKEUP_BY_GPIO_12, POWER_WAKEUP_BY_GPIO_13, POWER_WAKEUP_BY_GPIO_14, POWER_WAKEUP_BY_GPIO_15, POWER_WAKEUP_BY_GPIO_16, POWER_WAKEUP_BY_GPIO_17, POWER_WAKEUP_BY_ACMP0 = 24, POWER_WAKEUP_BY_ACMP1 = 25, POWER_WAKEUP_BY_SLEEP_TIMER = 26, POWER_WAKEUP_BY_RTC_ALARM = 27, POWER_WAKEUP_BY_RTC_TICK = 28, }; /** Wakeup signal polarity */ enum POWER_WAKEUP_POLARITY_T { POWER_WAKEUP_LEVEL_LOW = 0, POWER_WAKEUP_LEVEL_HIGH, POWER_WAKEUP_LEVEL_NONE, }; /** Power request units */ enum POWER_REQ_UNIT_T { POWER_UNIT_GPIO = (1 << 0), POWER_UNIT_UART = (1 << 1), POWER_UNIT_SPI = (1 << 2), POWER_UNIT_I2C = (1 << 3), POWER_UNIT_TIMER = (1 << 4), POWER_UNIT_RTC = (1 << 5), POWER_UNIT_ADC = (1 << 6), POWER_UNIT_RF = (1 << 7), POWER_UNIT_UWB = (1 << 8), POWER_UNIT_APP = (1 << 9), POWER_UNIT_USER = (1 << 10), POWER_UNIT_UCI_RX = (1 << 11), POWER_UNIT_UCI_TX = (1 << 12), }; /** Power modes */ enum POWER_MODE_T { POWER_MODE_ACTIVE = 0, POWER_MODE_SLEEP, POWER_MODE_POWER_DOWN, POWER_MODE_DEEP_POWER_DOWN, POWER_MODE_SHELF, }; /** Power request */ struct POWER_REQUEST_T { uint32_t power_request[5]; }; #ifdef __cplusplus extern "C" { #endif /** * @brief Initialize power manager */ void power_init(void); /** * @brief Power on radio. * @param[in] tx_en Enable TX * @param[in] rx_en Enable RX */ void power_on_radio(uint8_t tx_en, uint8_t rx_en); /** * @brief Power off radio. */ void power_off_radio(void); /** * @brief Enable a wakeup source. * @param[in] src Wakeup source @ref POWER_WAKEUP_SOURCE_T * @param[in] pol Wakeup signal polarity */ void power_wakeup_enable(enum POWER_WAKEUP_SOURCE_T src, enum POWER_WAKEUP_POLARITY_T pol); /** * @brief Disable a wakeup source. * @param[in] src Wakeup source @ref POWER_WAKEUP_SOURCE_T */ void power_wakeup_disable(enum POWER_WAKEUP_SOURCE_T src); /** * @brief Enter sleep mode. */ void power_enter_sleep_mode(void); /** * @brief Enter power-down mode. * @param[in] deep_en Enable deep power-down */ void power_enter_power_down_mode(bool deep_en); /** * @brief Enter shelf mode. */ void power_enter_shelf_mode(void); /** * @brief Request to enter a power mode. * @param[in] item Requester @ref POWER_REQ_UNIT_T * @param[in] mode Power mode @ref POWER_MODE_T */ void power_mode_request(enum POWER_REQ_UNIT_T item, enum POWER_MODE_T mode); /** * @brief Clear power mode of a requester * @param[in] item Requester @ref POWER_REQ_UNIT_T */ void power_mode_clear(enum POWER_REQ_UNIT_T item); /** * @brief Get the requesters of the specified power mode. * @param[in] mode Power mode @ref POWER_MODE_T * @return all the requesters that request this power mode */ uint32_t power_mode_requester_get(enum POWER_MODE_T mode); /** * @brief Power manager process handler */ void power_manage(void); /** * @brief Restore application form power-down mode */ void app_restore_from_power_down(void); #ifdef __cplusplus } #endif /** * @} */ #endif /* MK_POWER_H_ */