#ifndef _BSP_GPIO_H
#define _BSP_GPIO_H

#include "luat_gpio.h"

#include "pwrkey.h"
#include "platform_define.h"
#include "sr_config.h"

#define BSP_GPIO_LOW    LUAT_GPIO_LOW
#define BSP_GPIO_HIGH   LUAT_GPIO_HIGH
#define BSP_GPIO_TOGGLE 0x02
#define IS_GPIO_LVL(x) ((x) == BSP_GPIO_HIGH || (x) == BSP_GPIO_LOW || (x) == BSP_GPIO_TOGGLE)
#define IS_GPIO_INIT_LVL(x) ((x) == BSP_GPIO_HIGH || (x) == BSP_GPIO_LOW)

#define BSP_GPIO_OUTPUT LUAT_GPIO_OUTPUT
#define BSP_GPIO_INPUT  LUAT_GPIO_INPUT
#define BSP_GPIO_IRQ    LUAT_GPIO_IRQ
#define BSP_GPIO_OD     SR_INVALID      //无效
#define IS_GPIO_MODE(x) ((x) == BSP_GPIO_OUTPUT || (x) == BSP_GPIO_INPUT || (x) == BSP_GPIO_IRQ)

#define BSP_GPIO_NP     LUAT_GPIO_DEFAULT
#define BSP_GPIO_PU     LUAT_GPIO_PULLUP
#define BSP_GPIO_PD     LUAT_GPIO_PULLDOWN
#define IS_GPIO_PULL(x) ((x) == BSP_GPIO_NP || (x) == BSP_GPIO_PU || (x) == BSP_GPIO_PD)

#define BSP_GPIO_IRQ_RISING  LUAT_GPIO_RISING_IRQ
#define BSP_GPIO_IRQ_FALLING LUAT_GPIO_FALLING_IRQ
#define BSP_GPIO_IRQ_DOUBLE  LUAT_GPIO_BOTH_IRQ
//#define BSP_GPIO_IRQ_HIGH    LUAT_GPIO_HIGH_IRQ
//#define BSP_GPIO_IRQ_LOW     LUAT_GPIO_LOW_IRQ
#define IS_GPIO_IRQ_MODE(x) ((x) == BSP_GPIO_IRQ_RISING || (x) == BSP_GPIO_IRQ_FALLING || (x) == BSP_GPIO_IRQ_DOUBLE)

#define IS_GPIO_ID(x) (((uint32_t)(x))< HAL_GPIO_QTY)

#define GPIO_ALT_MAX (4)

struct pin_irq_hdr
{
    //uint8_t pull_mode;
    uint8_t irqMode;
    void    *irqCb;
};

typedef struct
{
    uint8_t pin;
    uint8_t alt;
} luat_gpio_alt_table_t;

//GPIO_INDEX(port,index)

typedef enum
{
    SR_GPIO0 = HAL_GPIO_0,
    SR_GPIO1,
    SR_GPIO2,
    SR_GPIO3,
    SR_GPIO4,
    SR_GPIO5,
    SR_GPIO6,
    SR_GPIO7,
    SR_GPIO8,
    SR_GPIO9,
    SR_GPIO10,
    SR_GPIO11,
    SR_GPIO12,
    SR_GPIO13,
    SR_GPIO14,
    SR_GPIO15,
    SR_GPIO16,
    SR_GPIO17,
    SR_GPIO18,
    SR_GPIO19,
    SR_GPIO20 = HAL_GPIO_20,
#if defined BSP_CHIP_EC716S
#else
    SR_GPIO21,
    SR_GPIO22,
    SR_GPIO23,
    SR_GPIO24,
    SR_GPIO25,
    SR_GPIO26,
    SR_GPIO27,
    SR_GPIO28,
    SR_GPIO29,
    SR_GPIO30,
    SR_GPIO31,
    SR_GPIO32,
    SR_GPIO33,
    SR_GPIO34,
    SR_GPIO35,
    SR_GPIO36,
    SR_GPIO37,
    SR_GPIO38,
#endif
    SR_GPIO_MAX,
    SR_GPIO_NONE = HAL_GPIO_NONE, /*!<大于等于HAL_GPIO_NONE，说明不存在*/
    SR_WAKE0 = HAL_WAKEUP_0,      /*!<EC718特殊的几个输入IO，WAKEUPPAD0~5,Charge,PWRKEY*/         //21
    SR_WAKE1 = HAL_WAKEUP_1,    //22
#ifdef BSP_CHIP_EC716S
#else
    SR_WAKE2 = HAL_WAKEUP_2, /*!<EC716S没有*/
#endif
    SR_WAKE3 = HAL_WAKEUP_3, /*!<和GPIO10同一个PIN*/      //24
    SR_WAKE4 = HAL_WAKEUP_4, /*!<和GPIO11同一个PIN*/      //25
    SR_WAKE5 = HAL_WAKEUP_5, /*!<和GPIO12同一个PIN*/      //26
    SR_WAKE_CHARGE = HAL_WAKEUP_CHARGE,               //27
    SR_WAKE_PWRKEY = HAL_WAKEUP_PWRKEY,               //28
} SR_GPIO_ID_E;

int BspGpioInit(int gpioId, SR_GPIO_CFG_T *gpioCfg);
int BspGpioDeinit(int gpioId);
int BspGpioWrite(int gpioId, uint8_t value);
int BspGpioRead(int gpioId);
int BspGpioEnableIrq(int gpioId);
int BspGpioDisableIrq(int gpioId);
int BspGpioSetCb(int gpioId, SR_GPIO_IRQ_MODE_E irqMode, SR_GPIO_IRQ_CB_T *gpioIrqCb);
int BspGpioUnsetCb(int gpioId);

#endif
