#ifndef __POWER_API_H__ #define __POWER_API_H__ #define PMU_NEW_FLOW 0 #define TRIM_WVDD BIT(0) #define TRIM_PVDD BIT(1) #define TRIM_IOVDD BIT(2) //=========================电源参数配置================================== struct low_power_param { u8 config; //低功耗使能,蓝牙&&系统空闲可进入低功耗 u8 osc_type; //低功耗晶振类型,btosc/lrc u32 btosc_hz; //蓝牙晶振频率 //vddiow_lev不需要配置,sleep、softoff模式会保持电压,除非配置使用nkeep_vddio(功耗相差不大) u8 vddiom_lev; //vddiom u8 vddiow_lev; //vddiow u8 nkeep_vddio; //softoff模式下不保持vddio u32 osc_delay_us; //低功耗晶振起振延时,为预留配置。 u8 rtc_clk; //rtc时钟源,softoff模式根据此配置是否保持住相应时钟 u8 lpctmu_en; //低功耗触摸,softoff模式根据此配置是否保持住该模块 u8 mem_init_con; //初始化ram电源 u8 mem_lowpower_con; //低功耗ram电源 u8 rvdd2pvdd; //低功耗外接dcdc u8 pvdd_dcdc_port; u8 lptmr_flow; //低功耗参数由用户配置 u32 t1; u32 t2; u32 t3_lrc; u32 t4_lrc; u32 t3_btosc; u32 t4_btosc; u8 flash_pg; //iomc: 外置flash power gate u8 btosc_disable; u8 delay_us; u8 vddio_keep_type_pd; //sleep keep vddio使用类型 u8 vddio_keep_type_sf; //soff keep vddio使用类型 }; //config #define SLEEP_EN BIT(0) #define DEEP_SLEEP_EN BIT(1) enum { VDDIO_KEEP_TYPE_TRIM = 0,//vddio keep使用trim值:默认 VDDIO_KEEP_TYPE_PG, //vddio keep使用 mvvdio:功耗代价100ua }; //osc_type enum { OSC_TYPE_LRC = 0, OSC_TYPE_BT_OSC, }; //DCVDD电源模式 enum { PWR_LDO15, PWR_DCDC15, }; //PVDD电源模式 enum PVDD_MODE { PWR_PVDD_LDO, PWR_PVDD_DCDC, }; //==============================软关机参数配置============================ //软关机会复位寄存器,该参数为传给rom配置的参数。 struct soft_flag0_t { u8 wdt_dis: 1; u8 poweroff: 1; u8 is_port_b: 1; u8 lvd_en: 1; u8 pmu_en: 1; u8 iov2_ldomode: 1; u8 res: 2; }; struct soft_flag1_t { u8 usbdp: 2; u8 usbdm: 2; u8 uart_key_port: 1; u8 ldoin: 3; }; struct soft_flag2_t { u8 pg2: 4; u8 pg3: 4; }; struct soft_flag3_t { u8 pg4: 4; u8 res: 4; }; struct soft_flag4_t { u8 fast_boot: 1; u8 flash_stable_delay_sel: 2; u8 res: 5; }; struct soft_flag5_t { u8 mvddio: 3; u8 wvbg: 4; u8 res: 1; }; struct boot_soft_flag_t { union { struct soft_flag0_t boot_ctrl; u8 value; } flag0; union { struct soft_flag1_t misc; u8 value; } flag1; union { struct soft_flag2_t pg2_pg3; u8 value; } flag2; union { struct soft_flag3_t pg4_res; u8 value; } flag3; union { struct soft_flag4_t fast_boot_ctrl; u8 value; } flag4; union { struct soft_flag5_t level; u8 value; } flag5; }; enum soft_flag_io_stage { SOFTFLAG_HIGH_RESISTANCE, SOFTFLAG_PU, SOFTFLAG_PD, SOFTFLAG_OUT0, SOFTFLAG_OUT0_HD0, SOFTFLAG_OUT0_HD, SOFTFLAG_OUT0_HD0_HD, SOFTFLAG_OUT1, SOFTFLAG_OUT1_HD0, SOFTFLAG_OUT1_HD, SOFTFLAG_OUT1_HD0_HD, }; //==============================电源接口============================ #define AT_VOLATILE_RAM_CODE_POWER AT(.power_driver.text.cache.L1) #define AT_VOLATILE_CACHE_CODE_POWER AT(.power_driver.text.cache.L2) void power_set_mode(u8 mode); void power_set_pvdd_mode(enum PVDD_MODE mode); u8 get_pvdd_dcdc_cfg(); void power_init(const struct low_power_param *param); void power_keep_dacvdd_en(u8 en); void sdpg_config(int enable); void p11_init(void); u8 get_wvdd_trim_level(); u8 get_pvdd_level(); u8 get_pvdd_trim_level(); u8 get_miovdd_trim_level(); u8 get_wiovdd_trim_level(); void store_pmu_trim_value_to_vm(u8 wvdd_level, u8 pvdd_level, u8 miovdd_lev, u8 wiovdd_lev); u8 load_pmu_trim_value_from_vm(); void volatage_trim_init(); //==============================sleep接口============================ //注意:所有接口在临界区被调用,请勿使用阻塞操作 //sleep模式介绍 //1.所有数字模块停止,包括cpu、periph、audio、rf等 //2.所有模拟模块停止,包括pll、btosc、rc等 //3.只保留pmu模块 //light_sleep: 不切电源域 //normal_sleep: dvdd低电 //deepsleep:dvdd掉电 //----------------低功耗线程查询是否满足低功耗状态, 被动等待------------ struct low_power_operation { const char *name; u32(*get_timeout)(void *priv); void (*suspend_probe)(void *priv); void (*suspend_post)(void *priv, u32 usec); void (*resume)(void *priv, u32 usec); void (*resume_post)(void *priv, u32 usec); }; enum LOW_POWER_LEVEL { LOW_POWER_MODE_LIGHT_SLEEP = 1, LOW_POWER_MODE_SLEEP, LOW_POWER_MODE_DEEP_SLEEP, }; typedef u8(*idle_handler_t)(void); typedef enum LOW_POWER_LEVEL(*level_handler_t)(void); typedef u8(*idle_handler_t)(void); struct lp_target { char *name; level_handler_t level; idle_handler_t is_idle; }; #define REGISTER_LP_TARGET(target) \ const struct lp_target target sec(.lp_target) extern const struct lp_target lp_target_begin[]; extern const struct lp_target lp_target_end[]; #define list_for_each_lp_target(p) \ for (p = lp_target_begin; p < lp_target_end; p++) //--------------低功耗线程请求进入低功耗, 主动发出------------ struct lp_request { char *name; u8(*request_enter)(u32 timeout); u8(*request_exit)(u32 timeout); }; #define REGISTER_LP_REQUEST(target) \ const struct lp_request target sec(.lp_request) extern const struct lp_request lp_request_begin[]; extern const struct lp_request lp_request_end[]; #define list_for_each_lp_request(p) \ for (p = lp_request_begin; p < lp_request_end; p++) //-----------------------深度睡眠处理-------------------------- struct deepsleep_target { char *name; u8(*enter)(void); u8(*exit)(void); }; #define DEEPSLEEP_TARGET_REGISTER(target) \ const struct deepsleep_target target sec(.deepsleep_target) extern const struct deepsleep_target deepsleep_target_begin[]; extern const struct deepsleep_target deepsleep_target_end[]; #define list_for_each_deepsleep_target(p) \ for (p = deepsleep_target_begin; p < deepsleep_target_end; p++) #define NEW_BASEBAND_COMPENSATION 0 u32 __tus_carry(u32 x); #define power_is_poweroff_post() 0 void *low_power_get(void *priv, const struct low_power_operation *ops); void low_power_put(void *priv); void low_power_sys_request(void *priv); void *low_power_sys_get(void *priv, const struct low_power_operation *ops); void low_power_sys_put(void *priv); u8 is_low_power_mode(enum LOW_POWER_LEVEL level); u8 low_power_sys_is_idle(void); s32 low_power_trace_drift(u32 usec); void low_power_reset_osc_type(u8 type); u8 low_power_get_default_osc_type(void); u8 low_power_get_osc_type(void); void low_power_on(void); void low_power_request(void); u8 low_power_sys_request_enter(u32 timeout); u8 low_power_sys_request_exit(u32 timeout); u32 get_rch_hz(); void cap_rch_enable(); void cap_rch_disable(); //==============================soft接口============================ void power_set_soft_poweroff(); void power_set_soft_poweroff_advance(); void mask_softflag_config(const struct boot_soft_flag_t *softflag); void power_set_callback(u8 mode, void (*powerdown_enter)(u8 step), void (*powerdown_exit)(u32), void (*soft_poweroff_enter)(void)); #endif