#ifndef _SYS_PWRMAN_H_ #define _SYS_PWRMAN_H_ #include #include #include #include #define PWRMAN_PARA_REVERSED_NUM (2) #define STANDBY_EVENT_POWEROFF (1<<0) #define STANDBY_EVENT_LOWPOWER (1<<1) //define count of power mode #define PWRMAN_MODE_CFG_CNT (8) #define PWRMAN_CHECK_PRESCALE (100) #define IDLE_LOWEST_PERCENT (10) #define IDLE_HIGHEST_PERCENT (30) #define CORE_CLOCK_FREQ_PRESCALE (6 *1000*1000) #define LOWEST_CORE_CLOCK_FREQ (30*1000*1000) #define BAD_FREQUENCY_LIMIT (30*1000*1000) #define IDLE_RUN_PRESCALE (25) typedef enum __SYS_PWRMAN_DEV { PWRMAN_DEV_NONE = 0, //level1 pwm devices PWRMAN_DEV_TP = 0x100, PWRMAN_DEV_IR, PWRMAN_DEV_KEY, PWRMAN_DEV_FM, PWRMAN_DEV_POWER, PWRMAN_DEV_HDMI, PWRMAN_DEV_RTC, PWRMAN_DEV_CSI, //level2 pwm devices PWRMAN_DEV_MONITOR = 0x200, PWRMAN_DEV_USBD, PWRMAN_DEV_USBH, PWRMAN_DEV_AUDIO, PWRMAN_DEV_DISPLAY, PWRMAN_DEV_MP, PWRMAN_DEV_NAND, PWRMAN_DEV_MS, PWRMAN_DEV_SDMMC, //level3 pwm devices PWRMAN_DEV_TWI = 0x300, PWRMAN_DEV_SPI, PWRMAN_DEV_UART, PWRMAN_DEV_ } __sys_pwrman_dev_e; typedef struct __PWRMAN_MODE_CFG { __bool valid; //flag to mark that if current parameter is valid uint32_t core_pll_hi; //core pll hi的频率,必须为(6*n +30)*1000000hz uint32_t core_pll_lo; //core pll lo的频率,必须为(6*n +30)*1000000hz uint32_t dram_pll; //dram pll的频率,必须为(12*n+60)*1000000hz uint32_t vdd; //vdd的电压值,必须确保在以上参数配置下能稳定运行 } __pwrman_mode_cfg_t; typedef struct __PWRMAN_MODE_LIST { struct __PWRMAN_MODE_LIST *next; int32_t mode; } __pwrman_mode_list_t; typedef struct __PWRMAN_DEV_NODE { __sys_pwrman_dev_e devid; // power user device id __pCB_DPMCtl_t cb; // call-back function void *parg; // argument for call-back struct __PWRMAN_DEV_NODE *prev; // pointer for keep device tree list struct __PWRMAN_DEV_NODE *next; // pointer for keep device tree list } __pwrman_dev_node_t; typedef struct __SYS_PWRMAN_CFG { __hdle task_prio; //pwm main task priority uint8_t start_flag; //start flag int8_t usbd_flag; //usb device flag int8_t usbh_flag; //usb host flag __hdle lock; //lock to avoid adjust frequency conflict __hdle h_power; //power driver handle int32_t cpu_lock; //flag to mark that if need lock cpu frequency __pwrman_mode_cfg_t mode[PWRMAN_MODE_CFG_CNT]; //system define power mode __pwrman_mode_list_t *mode_list; //mode list for manage current pwm mode __pwrman_mode_cfg_t cur_para; //current pwm mode parameter void *pStandbyBin; //buffer for store standby file __pwrman_dev_node_t *pDevList; //power user device list } __sys_pwrman_cfg_t; typedef enum __SYS_PWRMAN_MODE { SYS_PWRMAN_MODE_LEVEL0 = 0x00, /* level0 power mode (full speed) */ SYS_PWRMAN_MODE_LEVEL1 = 0x01, /* level1 power mode (high speed) */ SYS_PWRMAN_MODE_LEVEL2 = 0x02, /* level2 power mode (normal speed) */ SYS_PWRMAN_MODE_LEVEL3 = 0x03, /* level3 power mode (low speed) */ SYS_PWRMAN_MODE_USBD = 0x20, /* usb device mode */ SYS_PWRMAN_MODE_USBH = 0x21, /* usb host mode */ SYS_PWRMAN_MODE_ } __sys_pwrman_mode_t; typedef enum __SYS_PWRMAN_CMD { PWRMAN_CMD_ENTER_NONE = 0, PWRMAN_CMD_ENTER_STANDBY, //request device to enter standby PWRMAN_CMD_EXIT_STANDBY, //wake up device PWRMAN_CMD_ENTER_ } __sys_pwrman_cmd_e; typedef struct __BOARD_POWER_CFG { uint32_t keyvalue : 8; uint32_t twi_controller : 4; uint32_t power_exist : 4; uint32_t reserved : 16; } __board_power_cfg_t; typedef struct __SYS_PWRMAN_PARA { int32_t PowerOffTime; //timer value when power off uint32_t CurVddVal; //current vdd value uint32_t IrMask; //ir code mask uint32_t IrPowerVal; //value of the power key of ir uint32_t HKeyMin; //min value of the hold-key uint32_t HKeyMax; //max value of the hold-key uint8_t WakeUpMode; //mode of event wake up the system uint8_t EventFlag; //event flag that need system process when exit standby uint8_t TvdFlag; //flag to mark that if current board is tvd board __board_power_cfg_t PowerCfg; //power configuration __dram_para_t dram_para; // dram para //uint8_t IrBuffer[128]; //ir data buffer uint32_t eint_no; uint32_t pio_int_trigger; /* trigger condition*/ __hdle gpio_hdl; uint32_t port; uint32_t port_num; uint32_t standby_cnt; uint32_t standby_mode; uint32_t sumin_value; uint32_t sumout_value; uint32_t power_off_flag; } __sys_pwrman_para_t; #define STANDBY_ENTRY 0xffffa000 #define STANDBY_SIZE 0x3000 extern __sys_pwrman_para_t pwrmanStandbyPar; typedef void (*standby_entry_t)(__sys_pwrman_para_t *pVar); extern int32_t initPwrmanIniCfg(__sys_pwrman_cfg_t *pSysPwrmanCfg); extern int32_t pwrman_init(__dram_para_t *para); extern int32_t pwrman_exit(void); extern int32_t pwrman_start(void); extern int32_t pwrman_stop(void); #endif //#ifndef _SYS_PWRMAN_H_