doubao_chat/include_lib/driver/cpu/wl82/asm/power_interface.h

311 lines
7.6 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef POWER_INTERFACE_H
#define POWER_INTERFACE_H
#include "generic/typedef.h"
#define NEW_BASEBAND_COMPENSATION 0
#define AT_VOLATILE_RAM AT(.volatile_ram)
#define AT_VOLATILE_RAM_CODE AT(.volatile_ram_code)
#define AT_NON_VOLATILE_RAM //AT(.non_volatile_ram)
#define AT_NON_VOLATILE_RAM_CODE //AT(.non_volatile_ram_code)
extern u32 nvbss_begin;
extern u32 nvbss_length;
extern u32 nvdata_begin;
extern u32 nvdata_size;
extern u32 nvdata_addr;
#define NV_RAM_START &nvbss_begin
#define NV_RAM_SIZE &nvbss_length
#define NV_RAM_END (NV_RAM_START + NV_RAM_SIZE)
enum {
MAGIC_ADDR = 2,
ENTRY_ADDR = 3,
};
#define RAM1_MAGIC_ADDR (NV_RAM_END - MAGIC_ADDR*4)
#define RAM1_ENTRY_ADDR (NV_RAM_END - ENTRY_ADDR*4)
#define SYS_SLEEP_EN BIT(1)
#define SYS_SLEEP_BY_IDLE BIT(2)
#define RF_SLEEP_EN BIT(3)
#define RF_FORCE_SYS_SLEEP_EN BIT(4)
#define SLEEP_SAVE_TIME_US 1L
enum {
BT_OSC = 0,
RTC_OSCL,
LRC_32K,
LRC_16M,
};
enum {
OSC_TYPE_BT_OSC = 0,
OSC_TYPE_RTC,
OSC_TYPE_LRC,
};
enum {
PWR_NO_CHANGE = 0,
PWR_LDO33,
PWR_LDO15,
PWR_DCDC15,
};
enum {
LONG_4S_RESET = 0,
LONG_8S_RESET,
};
//Macro for VDDIOM_VOL_SEL
//如果使用内封sdram封装的芯片,并且VDDIO由芯片内部供电, 需要保证大于等于3.3V
enum {
VDDIOM_VOL_28V = 0,
VDDIOM_VOL_29V,
VDDIOM_VOL_30V,
VDDIOM_VOL_31V,
VDDIOM_VOL_32V,
VDDIOM_VOL_33V,
VDDIOM_VOL_34V,
VDDIOM_VOL_35V,
VDDIOM_VOL_MAX,
};
//Macro for VDDIOW_VOL_SEL
enum {
VDDIOW_VOL_21V = 0,
VDDIOW_VOL_24V,
VDDIOW_VOL_28V,
VDDIOW_VOL_32V,
VDDIOW_VOL_MAX,
};
struct low_power_param {
u8 osc_type;
u32 osc_hz;
u16 delay_us;
u8 config;
u8 btosc_disable;
u8 vddiom_lev;
u8 vddiow_lev;
u8 vdc14_lev;
u8 vdc14_dcdc;
u8 sysvdd_lev;
u8 pd_wdvdd_lev;
u8 vlvd_value;
u8 vlvd_enable;
};
#define BLUETOOTH_RESUME BIT(1)//保留参数
#define POWER_SLEEP_WAKEUP BIT(2)//休眠唤醒支持
#define POWER_OFF_WAKEUP BIT(3)//关机唤醒支持
#define RISING_EDGE 0 //上升沿
#define FALLING_EDGE BIT(0) //下降沿
#define AUTO_PUPD BIT(1) //IO边缘自动配置内部上下拉(IO外部不能接高于VDDIO电压,否则电流倒灌)
#define POWER_KEEP_DACVDD BIT(0) //休眠:DACVDD保持工作
#define POWER_KEEP_RTC BIT(1) //休眠:RTC保持工作
#define POWER_KEEP_RESET BIT(2) //休眠:VCM复位保持工作
#define POWER_KEEP_PWM_LED BIT(3) //休眠:PWM_LED复位保持工作
#define POWER_KEEP_SYSPLL BIT(4) //休眠前系统使用SYS_PLL,不切BTOSC_24M时钟
#define POWER_KEEP_FLASH BIT(5) //休眠不关闭flash电源
#define POWER_KEEP_WDT BIT(6) //休眠不关闭看门狗
struct port_wakeup {
u8 edge; //[0]: Rising / [1]: Falling
u8 attribute; //Relate operation bitmap OS_RESUME | BLUETOOTH_RESUME
u8 iomap; //Port Group-Port Index
u8 low_power;
};
struct long_press {
u8 enable;
u8 use_sec4; //1:sec 4 , 0:sec8
u8 edge; //rising --> hight reset , falling --> low reset
u8 iomap; //Port Group-Port Index
};
struct charge_wakeup {
u8 attribute; //Relate operation bitmap OS_RESUME | BLUETOOTH_RESUME
};
struct alarm_wakeup {
u8 attribute; //Relate operation bitmap OS_RESUME | BLUETOOTH_RESUME
};
struct lvd_wakeup {
u8 attribute; //Relate operation bitmap OS_RESUME | BLUETOOTH_RESUME
};
struct sub_wakeup {
u8 attribute; //Relate operation bitmap OS_RESUME | BLUETOOTH_RESUME
};
//<Max hardware wakeup port
#define MAX_WAKEUP_PORT 8
struct wakeup_param {
const struct port_wakeup *port[MAX_WAKEUP_PORT];
const struct charge_wakeup *charge;
const struct alarm_wakeup *alram;
const struct lvd_wakeup *lvd;
const struct sub_wakeup *sub;
const struct long_press *lpres;;
};
struct reset_param {
u8 en;
u8 mode;
u8 level;
u8 iomap; //Port Group, Port Index
};
struct low_power_operation {
const char *name;
u32(*get_timeout)(void *priv);
void (*set_timeout)(void *priv, u32 usec);
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);
void (*off_probe)(void *priv);
void (*off_post)(void *priv, u32 usec);
void (*on)(void *priv);
};
void power_init(const struct low_power_param *param);
void power_set_soft_poweroff(u32 ms); //if 0 power off dis 0 xms will power on
void set_softoff_wakeup_time_ms(u32 us);
void power_set_proweroff(void);
void power_set_mode(u8 mode);
void power_keep_state(u8 data);
u8 get_power_keep_state(void);
u8 hw_low_power_idle_check(void);
void power_set_callback(u8 mode, void (*powerdown_enter)(u8 step), void (*powerdown_exit)(u32), void (*soft_poweroff_enter)(void));
void power_set_sys_sleep_max_duration_us(u32 sys_sleep_max_duration_us);
void power_set_sys_sleep_duration_us(u32 sys_sleep_duration_us);
void power_set_rf_sleep_compensate_us(int rf_sleep_compensate_us);
void power_set_sys_sleep_compensate_us(int sys_sleep_compensate_us);
/*-----------------------------------------------------------*/
void low_power_request(char *name);
void low_power_exit_request(void);
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 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_hw_unsleep_lock(void);
void low_power_hw_unsleep_unlock(void);
void low_power_sys_unsleep_lock(void);
void low_power_sys_unsleep_unlock(void);
u8 low_power_get_config(void);
void low_power_check_bt_exist(u8 *edr_exist, u8 *ble_exist);
u8 low_power_all_group_force_sleep(u32 us);
void low_power_hardware_group_force_sleep(u32 us, char *name);
/*-----------------------------------------------------------*/
void power_wakeup_init(const struct wakeup_param *param);
void power_wakeup_index_enable(u8 index);
void power_wakeup_index_disable(u8 index);
u8 get_wakeup_source(void);
u8 is_ldo5v_wakeup(void);
void p33_soft_reset(void);
void power_reset_init(const struct reset_param *rs_param);
/*-----------------------------------------------------------*/
void lrc_debug(u8 a, u8 b);
void sdpg_config(int enable);
/*-----------------------------------------------------------*/
typedef u8(*idle_handler_t)(void);
struct lp_target {
char *name;
idle_handler_t is_idle;
};
#define REGISTER_LP_TARGET(target) \
const struct lp_target target SEC_USED(.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 deepsleep_target {
char *name;
void (*enter)(void);
void (*exit)(void);
};
#define DEEPSLEEP_TARGET_REGISTER(target) \
const struct deepsleep_target target SEC_USED(.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++)
/*-----------------------------------------------------------*/
#endif