#ifndef _PM_H_ #define _PM_H_ #ifdef __cplusplus extern "C" { #endif #include #include "common/bk_err.h" #include "sys_types.h" #define PARAM_DATA_VALID (0xFFFF) #define PM_APP_AUTO_VOTE_ENABLE (0x1) #define PM_APP_AUTO_VOTE_DISENABLE (0x0) #define PM_CP1_AUTO_POWER_DOWN_ENABLE (0x1) #define PM_CP1_AUTO_POWER_DOWN_DISENABLE (0x0) /*--------------------------WAKEUP SOURCE DEFINE START--------------------------------*/ #define pm_wakeup_source_e wakeup_source_t #define PM_WAKEUP_SOURCE_INT_GPIO (WAKEUP_SOURCE_INT_GPIO) #define PM_WAKEUP_SOURCE_INT_RTC (WAKEUP_SOURCE_INT_RTC) #define PM_WAKEUP_SOURCE_INT_TOUCHED (WAKEUP_SOURCE_INT_TOUCHED) #define PM_WAKEUP_SOURCE_INT_SYSTEM_WAKE (WAKEUP_SOURCE_INT_WIFI)//WAKEUP_SOURCE_INT_BT AND WAKEUP_SOURCE_INT_WIFI ARE THE SAME BIT #define PM_WAKEUP_SOURCE_INT_WIFI (WAKEUP_SOURCE_INT_WIFI) #define PM_WAKEUP_SOURCE_INT_BT (WAKEUP_SOURCE_INT_BT) #define PM_WAKEUP_SOURCE_INT_USBPLUG (WAKEUP_SOURCE_INT_USBPLUG) #define PM_WAKEUP_SOURCE_INT_NONE (WAKEUP_SOURCE_INT_NONE) /*--------------------------WAKEUP SOURCE DEFINE END--------------------------------*/ /*--------------------------POWER DOMAIN MODUEL DEFINE START--------------------------------*/ #define pm_power_module_name_e unsigned int /*----POWER DOMAIN DEFINE--------*/ #define PM_POWER_MODULE_NAME_MEM1 (POWER_MODULE_NAME_MEM1) //0 #define PM_POWER_MODULE_NAME_MEM2 (POWER_MODULE_NAME_MEM2) //1 #define PM_POWER_MODULE_NAME_MEM3 (POWER_MODULE_NAME_MEM3) //2 #define PM_POWER_MODULE_NAME_ENCP (POWER_MODULE_NAME_ENCP) //3 #define PM_POWER_MODULE_NAME_BAKP (POWER_MODULE_NAME_BAKP) //4 #define PM_POWER_MODULE_NAME_AHBP (POWER_MODULE_NAME_AHBP) //5 #define PM_POWER_MODULE_NAME_AUDP (POWER_MODULE_NAME_AUDP) //6 #define PM_POWER_MODULE_NAME_VIDP (POWER_MODULE_NAME_VIDP) //7 #define PM_POWER_MODULE_NAME_BTSP (POWER_MODULE_NAME_BTSP) //8 #define PM_POWER_MODULE_NAME_WIFIP_MAC (POWER_MODULE_NAME_WIFIP_MAC)//9 #define PM_POWER_MODULE_NAME_PHY (POWER_MODULE_NAME_WIFI_PHY) //10 #define PM_POWER_MODULE_NAME_MEM0 (POWER_MODULE_NAME_MEM0) //11 #define PM_POWER_MODULE_NAME_MEM4 (POWER_MODULE_NAME_MEM4) //12 #define PM_POWER_MODULE_NAME_OFDM (POWER_MODULE_NAME_OFDM) //13 #define PM_POWER_MODULE_NAME_TCM0_PGEN (POWER_MODULE_NAME_TCM0_PGEN)//14 #define PM_POWER_MODULE_NAME_ROM_PGEN (POWER_MODULE_NAME_ROM_PGEN) //15 #define PM_POWER_MODULE_NAME_TCM1_PGEN (POWER_MODULE_NAME_TCM1_PGEN)//16 #define PM_POWER_MODULE_NAME_CPU1 (POWER_MODULE_NAME_CPU1) //17 #define PM_POWER_MODULE_NAME_CPU2 (POWER_MODULE_NAME_CPU2) //18 #define PM_POWER_MODULE_NAME_APP (POWER_MODULE_NAME_APP) //19 #define PM_POWER_MODULE_NAME_NONE (POWER_MODULE_NAME_NONE) /*----SUB POWER DOMAIN AUDP--------*/ #define PM_POWER_SUB_MODULE_NAME_AUDP_FFT (POWER_SUB_MODULE_NAME_AUDP_FFT) #define PM_POWER_SUB_MODULE_NAME_AUDP_SBC (POWER_SUB_MODULE_NAME_AUDP_SBC) #define PM_POWER_SUB_MODULE_NAME_AUDP_AUDIO (POWER_SUB_MODULE_NAME_AUDP_AUDIO) #define PM_POWER_SUB_MODULE_NAME_AUDP_I2S (POWER_SUB_MODULE_NAME_AUDP_I2S) /*----SUB POWER DOMAIN VIDP--------*/ #define PM_POWER_SUB_MODULE_NAME_VIDP_DMA2D (POWER_SUB_MODULE_NAME_VIDP_DMA2D) #define PM_POWER_SUB_MODULE_NAME_VIDP_YUVBUF (POWER_SUB_MODULE_NAME_VIDP_YUVBUF) #define PM_POWER_SUB_MODULE_NAME_VIDP_JPEG_EN (POWER_SUB_MODULE_NAME_VIDP_JPEG_EN) #define PM_POWER_SUB_MODULE_NAME_VIDP_JPEG_DE (POWER_SUB_MODULE_NAME_VIDP_JPEG_DE) #define PM_POWER_SUB_MODULE_NAME_VIDP_LCD (POWER_SUB_MODULE_NAME_VIDP_LCD) #define PM_POWER_SUB_MODULE_NAME_VIDP_ROTT (POWER_SUB_MODULE_NAME_VIDP_ROTT) #define PM_POWER_SUB_MODULE_NAME_VIDP_SCAL0 (POWER_SUB_MODULE_NAME_VIDP_SCAL0) #define PM_POWER_SUB_MODULE_NAME_VIDP_SCAL1 (POWER_SUB_MODULE_NAME_VIDP_SCAL1) #define PM_POWER_SUB_MODULE_NAME_VIDP_H264 (POWER_SUB_MODULE_NAME_VIDP_H264) /*----SUB POWER DOMAIN PHY--------*/ #define PM_POWER_SUB_MODULE_NAME_PHY_BT (POWER_SUB_MODULE_NAME_PHY_BT) #define PM_POWER_SUB_MODULE_NAME_PHY_WIFI (POWER_SUB_MODULE_NAME_PHY_WIFI) #define PM_POWER_SUB_MODULE_NAME_PHY_RF (POWER_SUB_MODULE_NAME_PHY_RF) /*----SUB POWER DOMAIN AHB--------*/ #define PM_POWER_SUB_MODULE_NAME_AHBP_CAN (POWER_SUB_MODULE_NAME_AHBP_CAN) #define PM_POWER_SUB_MODULE_NAME_AHBP_QSPI (POWER_SUB_MODULE_NAME_AHBP_QSPI) #define PM_POWER_SUB_MODULE_NAME_AHBP_USB (POWER_SUB_MODULE_NAME_AHBP_USB) #define PM_POWER_SUB_MODULE_NAME_AHBP_PSRAM (POWER_SUB_MODULE_NAME_AHBP_PSRAM) #define PM_POWER_SUB_MODULE_NAME_AHBP_QSPI1 (POWER_SUB_MODULE_NAME_AHBP_QSPI1) #define PM_POWER_SUB_MODULE_NAME_AHBP_ENET (POWER_SUB_MODULE_NAME_AHBP_ENET) #define PM_POWER_SUB_MODULE_NAME_AHBP_SCR (POWER_SUB_MODULE_NAME_AHBP_SCR) #define PM_POWER_SUB_MODULE_NAME_AHBP_LIN (POWER_SUB_MODULE_NAME_AHBP_LIN) /*----SUB POWER DOMAIN BAKP--------*/ #define PM_POWER_SUB_MODULE_NAME_BAKP_TIMER1 (POWER_SUB_MODULE_NAME_BAKP_TIMER1) #define PM_POWER_SUB_MODULE_NAME_BAKP_UART1 (POWER_SUB_MODULE_NAME_BAKP_UART1) #define PM_POWER_SUB_MODULE_NAME_BAKP_UART2 (POWER_SUB_MODULE_NAME_BAKP_UART2) #define PM_POWER_SUB_MODULE_NAME_BAKP_SPI1 (POWER_SUB_MODULE_NAME_BAKP_SPI1) #define PM_POWER_SUB_MODULE_NAME_BAKP_I2C0 (POWER_SUB_MODULE_NAME_BAKP_I2C0) #define PM_POWER_SUB_MODULE_NAME_BAKP_I2C1 (POWER_SUB_MODULE_NAME_BAKP_I2C1) #define PM_POWER_SUB_MODULE_NAME_BAKP_SADC (POWER_SUB_MODULE_NAME_BAKP_SADC) #define PM_POWER_SUB_MODULE_NAME_BAKP_PWM1 (POWER_SUB_MODULE_NAME_BAKP_PWM1) #define PM_POWER_SUB_MODULE_NAME_BAKP_PWM0 (POWER_SUB_MODULE_NAME_BAKP_PWM0) #define PM_POWER_SUB_MODULE_NAME_BAKP_TRNG (POWER_SUB_MODULE_NAME_BAKP_TRNG) #define PM_POWER_SUB_MODULE_NAME_BAKP_IRDA (POWER_SUB_MODULE_NAME_BAKP_IRDA) #define PM_POWER_SUB_MODULE_NAME_BAKP_SDIO (POWER_SUB_MODULE_NAME_BAKP_SDIO) #define PM_POWER_SUB_MODULE_NAME_BAKP_COMSEG (POWER_SUB_MODULE_NAME_BAKP_COMSEG) #define PM_POWER_SUB_MODULE_NAME_BAKP_DMA0 (POWER_SUB_MODULE_NAME_BAKP_DMA0) #define PM_POWER_SUB_MODULE_NAME_BAKP_DMA1 (POWER_SUB_MODULE_NAME_BAKP_DMA1) #define PM_POWER_SUB_MODULE_NAME_BAKP_LA (POWER_SUB_MODULE_NAME_BAKP_LA) #define PM_POWER_SUB_MODULE_NAME_BAKP_PM (POWER_SUB_MODULE_NAME_BAKP_PM)// used for PM control of bakp domain power on and off /*---------------------------POWER DOMAIN MODUEL DEFINE END-------------------------------------*/ typedef enum { PM_CP1_AUTO_CTRL_DISABLE = 0, PM_CP1_AUTO_CTRL_ENABLE = 1, }pm_cp1_auto_ctrl_e; typedef enum { PM_MEM_AUTO_CTRL_DISABLE = 0, PM_MEM_AUTO_CTRL_ENABLE = 1, }pm_mem_auto_ctrl_e; typedef enum { GPIO_TRIGGER_INTERRUPE_LEVEL_LOW_ACTIVE = 0, GPIO_TRIGGER_INTERRUPE_LEVEL_HIGH_ACTIVE, GPIO_TRIGGER_INTERRUPE_EDGE_RISING, GPIO_TRIGGER_INTERRUPE_EDGE_FALLING, }gpio_trigger_interrupt_type_e; typedef struct { uint32_t gpio_id; gpio_trigger_interrupt_type_e gpio_trigger_interrupt_type; int_group_isr_t isr_callback; uint32_t gpio_valid; //PARAM_DATA_VALID }gpio_wakeup_param_t; typedef struct { uint32_t period; int_group_isr_t isr_callback; uint32_t rtc_valid; //PARAM_DATA_VALID }rtc_wakeup_param_t; typedef enum { WIFI_WAKEUP = 1, BT_WAKEUP, }wifi_bt_wakeup_type_e; typedef struct { wifi_bt_wakeup_type_e wifi_bt_wakeup; uint32_t sleep_time; int_group_isr_t isr_callback; }system_wakeup_param_t; typedef struct { int_group_isr_t isr_callback; }usbplug_wakeup_param_t; typedef struct { uint32_t touch_channel; int_group_isr_t isr_callback; }touch_wakeup_param_t; typedef enum { PM_MODE_NORMAL_SLEEP = 0, PM_MODE_LOW_VOLTAGE , PM_MODE_DEEP_SLEEP , PM_MODE_SUPER_DEEP_SLEEP , PM_MODE_DEFAULT }pm_sleep_mode_e; typedef enum { PM_SLEEP_MODULE_NAME_I2C1 = 0, // 0 PM_SLEEP_MODULE_NAME_SPI_1, // 1 PM_SLEEP_MODULE_NAME_UART1, // 2 PM_SLEEP_MODULE_NAME_PWM_1, // 3 PM_SLEEP_MODULE_NAME_TIMER_1, // 4 PM_SLEEP_MODULE_NAME_SARADC, // 5 PM_SLEEP_MODULE_NAME_AUDP, // 6 PM_SLEEP_MODULE_NAME_VIDP, // 7 PM_SLEEP_MODULE_NAME_BTSP, // 8 PM_SLEEP_MODULE_NAME_WIFIP_MAC,// 9 PM_SLEEP_MODULE_NAME_WIFI_PHY, // 10 PM_SLEEP_MODULE_NAME_TIMER_2, // 11 PM_SLEEP_MODULE_NAME_APP, // 12 //attention: the APP vote is for customer application using,other applications use the other votes PM_SLEEP_MODULE_NAME_OTP, // 13 PM_SLEEP_MODULE_NAME_I2S_1, // 14 PM_SLEEP_MODULE_NAME_USB_1, // 15 PM_SLEEP_MODULE_NAME_CAN, // 16 PM_SLEEP_MODULE_NAME_PSRAM, // 17 PM_SLEEP_MODULE_NAME_QSPI_1, // 18 PM_SLEEP_MODULE_NAME_QSPI_2, // 19 PM_SLEEP_MODULE_NAME_SDIO, // 20 PM_SLEEP_MODULE_NAME_AUXS, // 21 PM_SLEEP_MODULE_NAME_LOG, // 22 PM_SLEEP_MODULE_NAME_AT, // 23 PM_SLEEP_MODULE_NAME_I2C2, // 24 PM_SLEEP_MODULE_NAME_UART2, // 25 PM_SLEEP_MODULE_NAME_UART3, // 26 PM_SLEEP_MODULE_NAME_WDG, // 27 PM_SLEEP_MODULE_NAME_TIMER_3, // 28 PM_SLEEP_MODULE_NAME_APP1, // 29 PM_SLEEP_MODULE_NAME_CPU1, // 30 PM_SLEEP_MODULE_NAME_APP3, // 31 /*Attention: if you add vote ,the following[ #define PM_ENTER_LOW_VOL_MODULES_CONFIG] also need add the vote*/ PM_SLEEP_MODULE_NAME_MAX }pm_sleep_module_name_e; typedef enum { PM_POWER_MODULE_STATE_ON = 0, PM_POWER_MODULE_STATE_OFF, PM_POWER_MODULE_STATE_NONE }pm_power_module_state_e; typedef enum { PM_MODULE_NAME_WIFI = 0, PM_MODULE_NAME_BT, PM_MODULE_NAME_NONE }pm_module_name_e; typedef enum { PM_LPO_SRC_DIVD = 0,//32K from 26m PM_LPO_SRC_X32K, //extern 32k PM_LPO_SRC_ROSC, //32K from ROSC PM_LPO_SRC_DEFAULT //32K from ROSC }pm_lpo_src_e; typedef enum { PM_CLK_ID_I2C1 = 0, // 0 PM_CLK_ID_SPI_1, // 1 PM_CLK_ID_UART1, // 2 PM_CLK_ID_PWM_1, // 3 PM_CLK_ID_TIMER_1, // 4 PM_CLK_ID_SARADC, // 5 PM_CLK_ID_IRDA, // 6 PM_CLK_ID_EFUSE, // 7 PM_CLK_ID_I2C2, // 8 PM_CLK_ID_SPI_2, // 9 PM_CLK_ID_UART2, // 10 PM_CLK_ID_UART3, // 11 PM_CLK_ID_PWM_2, // 12 PM_CLK_ID_TIMER_2, // 13 PM_CLK_ID_TIMER_3, // 14 PM_CLK_ID_OTP, // 15 PM_CLK_ID_I2S_1, // 16 PM_CLK_ID_USB_1, // 17 PM_CLK_ID_CAN, // 18 PM_CLK_ID_PSRAM, // 19 PM_CLK_ID_QSPI_1, // 20 PM_CLK_ID_QSPI_2, // 21 PM_CLK_ID_SDIO, // 22 PM_CLK_ID_AUXS, // 23 PM_CLK_ID_BTDM, // 24 PM_CLK_ID_XVR, // 25 PM_CLK_ID_MAC, // 26 PM_CLK_ID_PHY, // 27 PM_CLK_ID_JPEG, // 28 PM_CLK_ID_DISP, // 29 PM_CLK_ID_AUDIO, // 30 PM_CLK_ID_WDG_CPU, // 31 PM_CLK_ID_NONE }pm_dev_clk_e; typedef enum { PM_CLK_CTRL_PWR_DOWN = 0, PM_CLK_CTRL_PWR_UP, }pm_dev_clk_pwr_e; typedef enum { PM_DEV_ID_I2C1 = 0, // 0 PM_DEV_ID_SPI_1, // 1 PM_DEV_ID_UART1, // 2 PM_DEV_ID_WDG, // 3 PM_DEV_ID_TIMER_1, // 4 PM_DEV_ID_SARADC, // 5 PM_DEV_ID_IRDA, // 6 PM_DEV_ID_EFUSE, // 7 PM_DEV_ID_I2C2, // 8 PM_DEV_ID_SPI_2, // 9 PM_DEV_ID_UART2, // 10 PM_DEV_ID_UART3, // 11 PM_DEV_ID_PWM_2, // 12 PM_DEV_ID_TIMER_2, // 13 PM_DEV_ID_TIMER_3, // 14 PM_DEV_ID_TOUCH, // 15 PM_DEV_ID_I2S_1, // 16 PM_DEV_ID_USB_1, // 17 PM_DEV_ID_CAN, // 18 PM_DEV_ID_PSRAM, // 19 PM_DEV_ID_QSPI_1, // 20 PM_DEV_ID_QSPI_2, // 21 PM_DEV_ID_SDIO, // 22 PM_DEV_ID_AUXS, // 23 PM_DEV_ID_BTDM, // 24 PM_DEV_ID_WPAS, // 25 PM_DEV_ID_MAC, // 26 PM_DEV_ID_PHY, // 27 PM_DEV_ID_JPEG, // 28 PM_DEV_ID_DISP, // 29 PM_DEV_ID_AUDIO, // 30 PM_DEV_ID_RTC, // 31 PM_DEV_ID_GPIO, // 32 PM_DEV_ID_DECODER, // 33 PM_DEV_ID_LIN, // 34 PM_DEV_ID_PWM_1, // 35 PM_DEV_ID_OTP_AHB, // 36 PM_DEV_ID_OTP_APB, // 37 PM_DEV_ID_SHANHAI, // 38 PM_DEV_ID_KEY, // 39 PM_DEV_ID_DEFAULT, // 40 it is used by pm module set default cpu frequency PM_DEV_ID_MAX }pm_dev_id_e; typedef enum { PM_CPU_FRQ_26M = 0, // 0:CPU:26M,BUS:26M PM_CPU_FRQ_60M, // 1:CPU:60M,BUS:60M PM_CPU_FRQ_80M, // 2:CPU:80M,BUS:80M PM_CPU_FRQ_120M, // 3:CPU:120M,BUS:120M PM_CPU_FRQ_240M, // 4:CPU:240M,BUS:120M PM_CPU_FRQ_320M, // 5:CPU:320M,BUS:160M PM_CPU_FRQ_480M, // 6:CPU:480M,BUS:240M PM_CPU_FRQ_DEFAULT // default cpu frequency which control by pm module }pm_cpu_freq_e; typedef enum { PM_ROSC_CALI_AUTO = 0, // 0:auto calibration PM_ROSC_CALI_MANUAL, // 1:manual calibration PM_ROSC_CALI_STOP, // 2:stop calibration }pm_rosc_cali_mode_e; typedef int (*pm_cb)(uint64_t sleep_time, void *args); typedef struct { pm_cb cb; void *args; } pm_cb_conf_t; typedef struct { pm_dev_id_e id; pm_cb_conf_t cfg; } pm_sleep_cb_t; typedef enum { PM_CB_PRIORITY_0 = 0, PM_CB_PRIORITY_1, PM_CB_PRIORITY_2, PM_CB_PRIORITY_3, PM_CB_PRIORITY_MAX, } pm_cb_priority_e; typedef enum { PM_32K_MODULE_BT = 0, PM_32K_MODULE_WIFI = 1, PM_32K_MODULE_MAX, }pm_cb_module_e; typedef enum { PM_32K_STEP_BEGIN = 0, PM_32K_STEP_FINISH = 1, }pm_sw_step_e; // Indicate switch status typedef int (*pm_cb_notify)(void); typedef int (*pm_cb_extern32k)(pm_sw_step_e sw_step, pm_lpo_src_e lpo_src, pm_cb_notify cb); typedef struct { pm_cb_module_e cb_module; pm_cb_extern32k cb_func; } pm_cb_extern32k_cfg_t; typedef enum { PM_LOW_VOL_VOLTAGE_0_6 = 0, // 0.6V PM_LOW_VOL_VOLTAGE_0_7, // 0.7V PM_LOW_VOL_VOLTAGE_0_8, // 0.8V PM_LOW_VOL_VOLTAGE_0_9, // 0.9V PM_LOW_VOL_VOLTAGE_1_0, // 1.0V PM_LOW_VOL_VOLTAGE_1_1, // 1.1V PM_LOW_VOL_VOLTAGE_1_2, // 1.2V PM_LOW_VOL_VOLTAGE_1_3 // 1.3V }pm_low_vol_voltage_e; /*=====================CONFIG SECTION START====================*/ /*enter low voltage ,require sleep module config*/ #define PM_ENTER_LOW_VOL_MODULES_CONFIG \ {\ PM_SLEEP_MODULE_NAME_I2C1,\ PM_SLEEP_MODULE_NAME_SPI_1,\ PM_SLEEP_MODULE_NAME_UART1,\ PM_SLEEP_MODULE_NAME_PWM_1,\ PM_SLEEP_MODULE_NAME_TIMER_1,\ PM_SLEEP_MODULE_NAME_SARADC,\ PM_SLEEP_MODULE_NAME_AUDP,\ PM_SLEEP_MODULE_NAME_VIDP,\ PM_SLEEP_MODULE_NAME_BTSP,\ PM_SLEEP_MODULE_NAME_WIFIP_MAC,\ PM_SLEEP_MODULE_NAME_WIFI_PHY,\ PM_SLEEP_MODULE_NAME_TIMER_2,\ PM_SLEEP_MODULE_NAME_APP,\ PM_SLEEP_MODULE_NAME_OTP,\ PM_SLEEP_MODULE_NAME_I2S_1,\ PM_SLEEP_MODULE_NAME_USB_1,\ PM_SLEEP_MODULE_NAME_CAN,\ PM_SLEEP_MODULE_NAME_PSRAM,\ PM_SLEEP_MODULE_NAME_QSPI_1,\ PM_SLEEP_MODULE_NAME_QSPI_2,\ PM_SLEEP_MODULE_NAME_SDIO,\ PM_SLEEP_MODULE_NAME_AUXS,\ PM_SLEEP_MODULE_NAME_LOG,\ PM_SLEEP_MODULE_NAME_AT,\ PM_SLEEP_MODULE_NAME_I2C2,\ PM_SLEEP_MODULE_NAME_UART2,\ PM_SLEEP_MODULE_NAME_UART3,\ PM_SLEEP_MODULE_NAME_WDG,\ PM_SLEEP_MODULE_NAME_TIMER_3,\ PM_SLEEP_MODULE_NAME_APP1,\ PM_SLEEP_MODULE_NAME_CPU1,\ PM_SLEEP_MODULE_NAME_APP3,\ } /*enter deep sleep ,require sleep module config*/ #define PM_ENTER_DEEP_SLEEP_MODULES_CONFIG \ {\ PM_POWER_MODULE_NAME_BTSP,\ PM_POWER_MODULE_NAME_WIFIP_MAC,\ PM_POWER_MODULE_NAME_AUDP,\ PM_POWER_MODULE_NAME_VIDP,\ } /*config the voltage at low vol*/ #define PM_VOLTAGE_OF_LOW_VOL (PM_LOW_VOL_VOLTAGE_0_6) /*config the lpo source*/ #define PM_LPO_SOURCE (PM_LPO_SRC_DIVD) /*config whether auto vote*/ #define PM_APP_AUTO_VOTE_CTRL (PM_APP_AUTO_VOTE_ENABLE) /*config cpu1 auto power down according media*/ #define PM_CP1_AUTO_POWER_DOWN_CTRL (PM_CP1_AUTO_POWER_DOWN_ENABLE) /*=====================CONFIG SECTION END=======================*/ /** * @brief clear the lv sleep state * * clear the lv sleep state * * @attention * - This API is used to clear the lv sleep state * * @param * -module:module name * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_module_lv_sleep_state_clear(pm_dev_id_e module); /** * @brief set the lv sleep state * * set the lv sleep state * * @attention * - This API is used to set the lv sleep state * * @param * -void * @return * - BK_OK: succeed * - others: other errors. */ __attribute__((section(".itcm_sec_code"))) bk_err_t bk_pm_module_lv_sleep_state_set(); /** * @brief get the lv sleep state * * get the lv sleep state * * @attention * - This API is used to get the lv sleep state * * @param * -module:module name * @return * - module_lv_sleep_state */ uint64_t bk_pm_module_lv_sleep_state_get(pm_dev_id_e module); /** * @brief get wakeup source from deepsleep * * get wakeup source from deepsleep * * @attention * - This API is used to get wakeup source from deepsleep * * @param * -void * @return * - wakeup source(0x0:WAKEUP SOURCE OF GPIO;0x1:WAKEUP SOURCE OF RTC;0x2:WAKEUP SOURCE OF WIFI OR BT;0x4:WAKEUP SOURCE OF TOUCHED;0x5:NONE WAKEUP_SOURCE) */ pm_wakeup_source_e bk_pm_deep_sleep_wakeup_source_get(); /** * @brief clear wakeup source of exiting low voltage process * * clear wakeup source of exit low voltage * * @attention * - This API is used to clear wakeup source of exiting low voltage process * * @param * -void * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_exit_low_vol_wakeup_source_clear(); /** * @brief set and save wakeup source of exiting low voltage * * set and save wakeup source of exiting low voltage * * @attention * - This API is used to set and save wakeup source of exiting low voltage * * @param * -0x0:close cp1 auto power down feature ;0x1:open cp1 auto power down feature * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_exit_low_vol_wakeup_source_set(); /** * @brief get wakeup source of exiting low voltage * * get wakeup source of exiting low voltage * * @attention * - This API is used to get wakeup source of exiting low voltage * * @param * -void * @return * - wakeup source(0x0:WAKEUP SOURCE OF GPIO;0x1:WAKEUP SOURCE OF RTC;0x2:WAKEUP SOURCE OF WIFI OR BT;0x4:WAKEUP SOURCE OF TOUCHED;0x5:NONE WAKEUP_SOURCE) */ pm_wakeup_source_e bk_pm_exit_low_vol_wakeup_source_get(); /** * @brief get memory auto power down flag * * get memory auto power down flag * * @attention * - This API is used to get memory auto power down flag * * @param * -void * @return * - memory auto power down flag(PM_MEM_AUTO_CTRL_DISABLE:disable memory auto power down feature ;PM_MEM_AUTO_CTRL_ENABLE:enable memory auto power down feature) */ pm_mem_auto_ctrl_e bk_pm_mem_auto_power_down_state_get(); /** * @brief memory auto power down flag set * * set memory auto power down flag * * @attention * - This API is used to set memory auto power down flag * * @param * -PM_MEM_AUTO_CTRL_DISABLE:disable memory auto power down feature ;PM_MEM_AUTO_CTRL_ENABLE:enable memory auto power down feature * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_mem_auto_power_down_state_set(pm_mem_auto_ctrl_e value); /** * @brief get cp1 auto power down flag * * get cp1 auto power down flag * * @attention * - This API is used to get cp1 auto power down flag * * @param * -void * @return * - cp1 auto power down flag(0x0:close cp1 auto power down feature ;0x1:open cp1 auto power down feature) */ uint32_t bk_pm_cp1_auto_power_down_state_get(); /** * @brief cp1 auto power down flag set * * set cp1 auto power down flag * * @attention * - This API is used to set cp1 auto power down flag * * @param * -0x0:close cp1 auto power down feature ;0x1:open cp1 auto power down feature * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_cp1_auto_power_down_state_set(uint32_t value); /** * @brief get cpu1 boot flag * * get cpu1 boot flag(ready or not ready) * * @attention * - This API is used to get cpu1 boot flag(ready or not ready) * * @param * -void * @return * - the flag of cpu1 boot flag (0x0:cpu1 not boot ready;0x1:cpu1 boot ready) */ uint32_t bk_pm_cp1_boot_flag_get(); /** * @brief rosc calibration * * rosc calibration * * @attention * - This API is used to calibrate rosc * * @param * -rosc_cali_mode:0x1:rosc calibrate manual; 0x0:rosc calibrate auto * -cali_interval: 0x0:0.25s;0x1:0.5s;0x2:0.75s;0x3:1.0s;0x4:1.25s;0x5:1.5s;0x6:1.75s;0x7:2s; * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_rosc_calibration(pm_rosc_cali_mode_e rosc_cali_mode, uint32_t cali_interval); /** * @brief using the gpio to control the external ldo * * control the external ldo * * @attention * - This API is used to use the specific gpio(define in GPIO_CTRL_LDO_OUTPUT_HIGH_MAP or GPIO_CTRL_LDO_OUTPUT_LOW_MAP in gpio_map.h) control the external ldo * * @param * -value:0x1:output high; 0x0:output low * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_external_ldo_ctrl(uint32_t value); /** * @brief get the state of phy calibration * * get the state of phy calibration * * @attention * - This API is used to get the state of phy calibration * * @param * -void * @return * - the state of phy calibration(0x1:have calibration;0x0:not calibration) */ uint32_t bk_pm_phy_cali_state_get(); /** * @brief get the flag of phy reinit part1 * * get the flag of phy reinit part1 * * @attention * - This API is used to get the flag of phy reinit part1 * * @param * -void * @return * - the flag of phy reinit part1 (True:have part1;false:not do it) */ bool bk_pm_phy_reinit_flag_get(); /** * @brief clear the flag of phy reinit part1 * * clear the flag of phy reinit part1 * * @attention * - This API is used to clear the flag of phy reinit part1 * * @param * -void * @return * -void */ void bk_pm_phy_reinit_flag_clear(); /** * @brief get the consume time from lowvol wakeup * * the consume time from lowvol wakeup * * @attention * - This API is used to get the consume time from lowvol wakeup * * @param * -void * @return * - the consume time of wakeup from lowvol */ uint32_t bk_pm_wakeup_from_lowvol_consume_time_get(); /** * @brief register sleep mode(low voltage and deepsleep) config * * register sleep config(include callback function and parameter) * * @attention * - This API is used to register low voltage and deepsleep config * * @param * -sleep_mode:low voltage or deepsleep mode * -dev_id:dev id * -enter_config:enter sleep config * -exit_config:exit sleep config * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_sleep_register_cb(pm_sleep_mode_e sleep_mode,pm_dev_id_e dev_id,pm_cb_conf_t *enter_config, pm_cb_conf_t *exit_config); /** * @brief unregister sleep mode(low voltage and deepsleep) config * * unregister sleep config(include callback function and parameter) * * @attention * - This API is used to unregister low voltage and deepsleep config * * @param * -sleep_mode:low voltage or deepsleep mode * -dev_id:dev id * -enter_cb:whether unregister the enter call back * -exit_cb:whether unregister the exit call back * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_sleep_unregister_cb(pm_sleep_mode_e sleep_mode,pm_dev_id_e dev_id,bool enter_cb, bool exit_cb); /** * @brief register light sleep config * * register light sleep config(include callback function and parameter) * * @attention * - This API is used to register light sleep config * * @param * -enter_config:enter light sleep config * -exit_config:exit light sleep config * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_light_sleep_register_cb(pm_cb_conf_t *enter_config, pm_cb_conf_t *exit_config); /** * @brief unregister light sleep callback * * unregister light sleep callback(enter light sleep callback and exit light sleep callback) * * @attention * - This API is used to unregister light sleep callback * * @param * -enter_cb:whether unregister the enter call back * -exit_cb:whether unregister the exit call back * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_light_sleep_unregister_cb(bool enter_cb, bool exit_cb); /** * @brief get power domain of module state * * get the power domain state * * @attention * - This API is used to get the power domain state * * @param * -module:module name * @return * -the state of power domain state * */ int32 bk_pm_module_power_state_get(pm_power_module_name_e module); /** * @brief get the cpu frequency of the module vote * * get the module voting cpu frequency * * @attention * - This API is used to get the module voting cpu frequency * * @param * -module:module id * @return * - the cpu frequency of the module vote * */ pm_cpu_freq_e bk_pm_module_current_cpu_freq_get(pm_dev_id_e module); /** * @brief get the current max and used cpu frequency * * select the cpu frequency * * @attention * - This API is used to get the current max and used cpu frequency * * @param * -void * @return * - get the current max and used cpu frequency * */ pm_cpu_freq_e bk_pm_current_max_cpu_freq_get(); /** * @brief vote cpu frequency * * select the cpu frequency * * @attention * - This API is used to vote ,then select the cpu frequency * * @param * -module:module id;cpu_freq:cpu frequency(320M,240M,120M,26M) * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_module_vote_cpu_freq(pm_dev_id_e module,pm_cpu_freq_e cpu_freq); /** * @brief clock ctrl * * enable or disable dev clock * * @attention * - This API is used to enable or disable dev clock * * @param * -module:device id;clock_state:PM_CLK_CTRL_PWR_DOWN or PM_CLK_CTRL_PWR_DOWN * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_clock_ctrl(pm_dev_clk_e module,pm_dev_clk_pwr_e clock_state); /** * @brief lp voltage set * * set the lp voltage * * @attention * - This API is used to set lp voltage when enter low voltage * * @param * -uint32_t:0x0:0.6v;0x1:0.7v;0x2:0.8v;0x3:0.9v;0x4:1.0v;0x5:1.1v;0x6:1.2v;0x7:1.3v; * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_lp_vol_set(uint32_t lp_vol); /** * @brief lp voltage get * * get the lpo voltage * * @attention * - This API is used to get lpo voltage value * * @param * -void * @return * - the lp voltage value * */ uint32_t bk_pm_lp_vol_get(); /** * @brief rf tx voltage set * * set the tx voltage of RF * * @attention * - This API is used to set tx voltage of RF * * @param * -uint32_t:0x0:1.25v;0x1:1.3v;0x2:1.35v;0x3:1.4v;0x4:1.45v;0x5:1.5v;0x6:1.55v;0x7:1.6v; * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_rf_tx_vol_set(uint32_t tx_vol); /** * @brief rf tx voltage get * * get the tx voltage of RF * * @attention * - This API is used to get tx voltage value of RF * * @param * -void * @return * - the tx voltage value * */ uint32_t bk_pm_rf_tx_vol_get(); /** * @brief rf rx voltage set * * set the rx voltage of RF * * @attention * - This API is used to set rx voltage of RF * * @param * -uint32_t:0x0:1.25v;0x1:1.3v;0x2:1.35v;0x3:1.4v;0x4:1.45v;0x5:1.5v;0x6:1.55v;0x7:1.6v; * @return * - BK_OK: succeed * - others: other errors. * */ bk_err_t bk_pm_rf_rx_vol_set(uint32_t rx_vol); /** * @brief rf rx voltage get * * get the rx voltage of RF * * @attention * - This API is used to get rx voltage value of RF * * @param * -void * @return * - the rx voltage value * */ uint32_t bk_pm_rf_rx_vol_get(); /** * @brief lpo source set * * set the lpo source * * @attention * - This API is used to select 32k source when enter low voltage and deepsleep * * @param * -lpo_src:0x0:32K from 26m;0x1:32K from 26m;0x2:32K from ROSC;0x3:32K from ROSC * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_lpo_src_set(pm_lpo_src_e lpo_src); /** * @brief lpo source get * * get the lpo source * * @attention * - This API is used to get 32k lpo source * * @param * void * @return * -lpo_src:0x0:32K from 26m;0x1:32K from 26m;0x2:32K from ROSC;0x3:32K from ROSC * */ pm_lpo_src_e bk_pm_lpo_src_get(); /** * @brief mcu pm ctrl * * enabel and disable the mcu power manage * * @attention * - This API is used to enabel and disable the mcu power manage * * @param * -power_state:0x0:enable the mcu power manage;0x1:disable the mcu power manage * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_mcu_pm_ctrl(uint32_t power_state); /** * @brief get the mcu power feature state * * get the mcu power feature state * * @attention *-This API is used to get the mcu power manage feature state(open or close) * * @param * none * @return *-mcu power manage state(0x0:enable the mcu power manage;0x1:disable the mcu power manage) * */ uint32_t bk_pm_mcu_pm_state_get(); /** * @brief set sleep mode * * set sleep mode. * * @attention * - This API set sleep mode * * @param sleep mode:0x0:NORMAL_SLEEP;0x1:LOW_VOLTAGE;0x2:DEEP_SLEEP;0x3:DEFAULT(if it meet low voltage,enter low voltage,otherwise enter normal sleep); * * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_sleep_mode_set(pm_sleep_mode_e sleep_mode); /** * @brief set wakeup source * * set wakeup source(eg.rtc,gpio) * * @attention * - This API set wakeup source,wifi and bt themselves not need set wakup source when in volatage * * @param * -wakeup_source:wake up source * -source_param: the wakeup source parameter * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_wakeup_source_set(pm_wakeup_source_e wakeup_source, void* source_param); /** * @brief module vote sleep ctrl * * other module tell pm module, they have entered sleep.(eg.wifi or bt enter sleep,then call the function ,tell pm it have entered sleep) * * @attention * - This API is used by wifi or bt... let pm module know them(wifi or bt...) enter sleep or exit sleep * - if all the specific module enter sleep, the mcu will enter low voltage * * @param * -module:module name * -sleep_state:0x1:enter sleep;0x0:exit sleep * -sleep_time: sleep time * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_module_vote_sleep_ctrl(pm_sleep_module_name_e module,uint32_t sleep_state,uint32_t sleep_time); /** * @brief pm module vote power ctrl * * ther module tell pm module, they can enter power on or power off * * @attention * - This API is used for the module power on and power off. * - if all the specific module power off, the mcu will enter deep sleep * @param * -module:module name * -power_state:0x1:power off;0x0:power on * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_module_vote_power_ctrl(pm_power_module_name_e module,pm_power_module_state_e power_state); /** * @brief pm suppress ticks and sleep * * when the rtos enter idle task and sleep time > 2*(time per tick),it will call the function enter power manager * * @attention * - This API is used for power manager. * * @param * -sleep_ticks:sleep time using tick unit * @return * - BK_OK: succeed * - others: other errors. */ bk_err_t bk_pm_suppress_ticks_and_sleep(uint32_t sleep_ticks); /** * @brief enter sleep * * the function is for adapting harmony os * * @attention * - This API is used for power manager. * * @param * - void * @return * - void * */ void bk_pm_enter_sleep(); /** * @brief sleep vote init * * the function is for init the enter low voltage sleep vote * * @attention * - This API is used for init the enter low voltage sleep vote * * @param * - void * @return * - BK_OK: succeed * - others: other errors. * */ static inline bk_err_t pm_sleep_vote_init() { uint32_t i = 0; pm_sleep_module_name_e enter_low_vol_modules[] = PM_ENTER_LOW_VOL_MODULES_CONFIG; for(i=0;i