Files
gk-sdk/source/gmp/drv/pm/drv_pmc.h
T

162 lines
4.7 KiB
C
Raw 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 __DRV_PM_PMC_H__
#define __DRV_PM_PMC_H__
#include "xmedia_type.h"
//#define PM_WAKEUP1_SUPPORT
#define WAKEUP_EXT_GPIO_NUM 1
#define PWR_BASE_ADDR 0x120f0000
#define PMR_STATUS_OFFSET 0x4
#define PWR_STATUS_WAKEUP_SOURCE GENMASK(6, 2)
#define PWR_PD_SEL_OFFSET 0x8
#define PWR_CTRL0_OFFSET 0x10
#define PWR_POWER_UNMASK (BIT(1) | BIT(0))
#define PWR_WAKEUP_POLARITY (BIT(3) | BIT(4))
#define PWR_RTC_MASK BIT(5)
#define PWR_WAKEUP_MASK BIT(6)
#define PWR_STARTUP_MASK BIT(16)
#define PWR_BUTTON_ADJ_MASK BIT(28)
#define PWR_BUTTON_ADJ_MASK_SHIFT 28
#define PWR_BUTTON_ADJ_TIME_MASK GENMASK(27,20)
#define PWR_BUTTON_ADJ_TIME_SHIFT 20
#define PWR_CTRL1_OFFSET 0x14
#define PWM_BUTTON_CTRL_OFFSET 0x18
#define PWR_STARTUP_CRTL_OFFSET 0x20
#define PWR_RSTN_CRTL_OFFSET 0x24
#define PWR_SEQ_CRTL_OFFSET 0x28
#define PWR_WAKEUP_CRTL_OFFSET 0x30
#define PWR_WAKEUPN_IOSHARE BIT(8)
#define PWR_WAKEUP_PD BIT(3)
#define PWR_WAKEUP_PU BIT(2)
#define PWR_WAKEUP_DS_MASK (0x3)
#define PWR_WAKEUP_DS_1 0x0
#define PWR_WAKEUP_DS_2 0x1
#define PWR_WAKEUP_DS_3 0x2
#define PWR_WAKEUP_DS_4 0x3
#define PWR_EN_CRTL_OFFSET 0x34
#define PWR_WAKEUP1_CRTL_OFFSET 0x38
#define PWR_BUTTON_ADJ_TIME_MAX 255 //<=25.5s
/*
* 0x120f0050 在待机的时候保存linux唤醒入口地址,
* 跳转内核之前保存唤醒状态,
* 刚进入aux读取PMR_STATUS_OFFSET到aux的中保存
*/
#define PWR_STATUS_BACKUP_OFFSET 0x50
#define WAKEUP_STATUS_GPIO0_MASK 0x100
#define WAKEUP_STATUS_GPIO1_MASK 0x400
typedef enum {
PMC_SRC_WAKEUP = 0,
PMC_SRC_STARTUP,
PMC_SRC_BUTTON,
PMC_SRC_RTC,
PMC_SRC_MAX,
} lotus_pmc_wakeup_type;
#ifdef PM_WAKEUP1_SUPPORT
/*
* 当type为PM_WKMODE_WAKEUPgpio唤醒时),detail为唤醒gpio号,唤醒gpio号与xmedia_pm_attr中的唤醒gpio号对应
* 当type为PM_WKMODE_STARTUP detail无意义
* 当type为PM_WKMODE_BUTTONdetail无意义
* 当type为PM_WKMODE_RTCdetail无意义
*/
typedef struct {
lotus_pmc_wakeup_type type;
xmedia_u32 detail;
} lotus_pm_wakeup_info;
#endif
typedef enum {
PMC_PWR_RISING_EDGE = 0,
PMC_PWR_FALLING_EDGE,
PMC_PWR_HIGH_LEVEL,
PMC_PWR_LOW_LEVEL,
PMC_PWR_MAX,
} lotus_pmc_wakeup_polarity;
typedef struct {
xmedia_bool rtc_enable; // 1:表示使能
xmedia_u32 rtc_timeout; // 单位为10ms
} lotus_pmc_rtc_attr;
typedef struct {
xmedia_bool wakeup_enable; // 1:表示使能
lotus_pmc_wakeup_polarity wakeup_polarity; //上升沿、下降沿、高电平和低电平触发
} lotus_pmc_wakeup_attr;
typedef struct {
xmedia_bool button_adj_enable; //1:表示使能
xmedia_u32 button_adj_time; //button触发时间,精度100ms
}lotus_pmc_button_attr;
/*
* wakeup_attr: 对应唤醒gpio0的配置
* wakeup_ext_attr_arry[0] 对应唤醒gpio1开始的其他唤醒gpio的配置
* 如果唤醒gpio0和唤醒gpio1同时使用,只支持高电平唤醒,同时高电平持续时间必须大于xxms
*/
typedef struct {
lotus_pmc_wakeup_attr wakeup_attr;
xmedia_bool startup_enable;
xmedia_bool button_enable;
lotus_pmc_button_attr button_attr;
lotus_pmc_rtc_attr rtc_attr;
#ifdef PM_WAKEUP1_SUPPORT
lotus_pmc_wakeup_attr wakeup_ext_attr_arry[WAKEUP_EXT_GPIO_NUM];
#endif
} lotus_pmc_all_attr;
typedef struct {
xmedia_u64 rtc_delta_time; // 单位为1ms
xmedia_u64 rtc_current_time;
xmedia_u64 rtc_last_suspend_time;
} lotus_pm_rtc_info;
typedef enum {
CMD_PM_INIT = 0,
CMD_PM_DEINIT,
CMD_PM_SET_ALL_ATTR,
CMD_PM_GET_ALL_ATTR,
CMD_PM_GET_RTC_ATTR,
CMD_PM_SET_RTC_ATTR,
CMD_PM_GET_WK_ATTR,
CMD_PM_SET_WK_ATTR,
CMD_PM_GET_WK_SOURCE,
CMD_PM_SET_AUX,
CMD_PM_GET_DDR_PARAM,
CMD_PM_GET_RTC_INFO,
#ifdef PM_WAKEUP1_SUPPORT
CMD_PM_GET_WK_INFO,
#endif
CMD_PM_GET_RTC_TIMER,
CMD_PM_END = 0xFFFF,
} pm_ioctl_cmd;
struct aux_mem {
xmedia_u64 phy_addr;
xmedia_u32 size;
};
xmedia_s32 lotus_pmc_init(xmedia_void);
xmedia_void lotus_pmc_deinit(xmedia_void);
xmedia_s32 lotus_get_wakeup_type(lotus_pmc_wakeup_type *type);
#ifdef PM_WAKEUP1_SUPPORT
xmedia_s32 lotus_pm_get_wakeup_info(lotus_pm_wakeup_info *info);
#endif
xmedia_s32 lotus_set_all_attr(lotus_pmc_all_attr *attr);
xmedia_s32 lotus_get_all_attr(lotus_pmc_all_attr *attr);
xmedia_s32 lotus_set_wakeup_attr(lotus_pmc_wakeup_attr *attr);
xmedia_s32 lotus_get_wakeup_attr(lotus_pmc_wakeup_attr *attr);
xmedia_s32 lotus_set_button_attr(lotus_pmc_button_attr *attr);
xmedia_s32 lotus_get_button_attr(lotus_pmc_button_attr *attr);
xmedia_s32 lotus_set_rtc_attr(lotus_pmc_rtc_attr *attr);
xmedia_s32 lotus_get_rtc_attr(lotus_pmc_rtc_attr *attr);
xmedia_void lotus_get_rtc_timer(xmedia_void);
xmedia_s32 lotus_pmc_set_aux(struct aux_mem *aux);
xmedia_s32 lotus_pm_get_rtc_info(lotus_pm_rtc_info *info);
#endif