#ifndef __POWER_WAKEUP_H__
#define __POWER_WAKEUP_H__

enum WAKEUP_REASON {
    //WAKEUP
    PWR_WK_REASON_PLUSE_CNT_OVERFLOW,   	    //pcnt唤醒复位
    PWR_WK_REASON_P11,   					    //P11唤醒复位
    PWR_WK_REASON_LPCTMU,   				    //触摸唤醒复位
    PWR_WK_REASON_PORT_EDGE,				    //数字io输入边沿唤醒复位
    PWR_WK_REASON_ANA_EDGE,					    //模拟io输入边沿唤醒复位
    PWR_WK_REASON_VDDIO_LVD,				    //vddio lvd唤醒复位
    PWR_WK_REASON_EDGE_INDEX0,				    //p33 index0  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX1,				    //p33 index1  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX2,			    	//p33 index2  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX3,				    //p33 index3  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX4,     	            //p33 index4  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX5,          	    //p33 index5  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX6,          	    //p33 index6  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX7,          	    //p33 index7  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX8,          	    //p33 index8  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX9,          	    //p33 index9  io唤醒复位
    PWR_WK_REASON_EDGE_INDEX10,         	    //p33 index10 io唤醒复位
    PWR_WK_REASON_EDGE_INDEX11,         	    //p33 index11 io唤醒复位
    PWR_ANA_WK_REASON_FALLINIG_EDGE_LDOIN, 		//LDO5V上升沿唤醒复位
    PWR_ANA_WK_REASON_RISING_EDGE_LDOIN,        //LDO5V下降沿唤醒复位
    PWR_ANA_WK_REASON_FALLING_EDGE_VBATCH,      //VBATCH上升降沿唤醒复位
    PWR_ANA_WK_REASON_RISING_EDGE_VBATCH,       //VBATCH下降沿唤醒复位
    PWR_RTC_WK_REASON_ALM, 					    //RTC闹钟唤醒复位
    PWR_RTC_WK_REASON_256HZ, 					//RTC 256Hz时基唤醒复位
    PWR_RTC_WK_REASON_64HZ, 					//RTC 64Hz时基唤醒复位
    PWR_RTC_WK_REASON_2HZ, 						//RTC 2Hz时基唤醒复位
    PWR_RTC_WK_REASON_1HZ, 						//RTC 1Hz时基唤醒复位
};

//=========================唤醒参数配置==================================

struct port_wakeup {
    u8 iomap;      			  //唤醒io
    u8 pullup_down_enable;    //上下拉是否使能
    POWER_WKUP_EDGE edge;     //唤醒边沿条件
    POWER_WKUP_FLT filter;	  //滤波参数，数字io输入没有滤波可配制
};

struct wakeup_param {
    //数字io输入
    const struct port_wakeup *port[MAX_WAKEUP_PORT];
    //模拟io输入
    const struct port_wakeup *aport[MAX_WAKEUP_ANA_PORT];
};

//=========================唤醒接口==================================
void power_wakeup_index_enable(u8 index, u8 enable);
void power_wakeup_gpio_enable(u8 gpio, u8 enable);
void power_wakeup_gpio_edge(u8 gpio, POWER_WKUP_EDGE edge);

void power_awakeup_index_enable(u8 index, u8 enable);
void power_awakeup_gpio_enable(u8 gpio, u8 enable);
void power_awakeup_gpio_edge(u8 gpio, POWER_WKUP_EDGE edge);
void power_awakeup_gpio_filter(u8 gpio, POWER_WKUP_FLT filter);

void power_wakeup_set_callback(void (*wakeup_callback)(u8 index, u8 gpio));
void power_awakeup_set_callback(void (*wakeup_callback)(u8 index, u8 gpio, POWER_WKUP_EDGE edge));

void port_edge_wkup_set_callback_by_index(u8 index, void (*wakeup_callback)(u8 index, u8 gpio));
void aport_edge_wkup_set_callback_by_index(u8 index, void (*wakeup_callback)(u8 index, u8 gpio, POWER_WKUP_EDGE edge));

void power_wakeup_init(const struct wakeup_param *param);

u8 is_wakeup_source(enum WAKEUP_REASON index);

void power_wakeup_reason_dump();

u8 is_ldo5v_wakeup(void);

#endif
