#ifndef _BSP_GPIO_H
#define _BSP_GPIO_H
#include "sr_config.h"

// n32头文件
#include "n32l40x_conf.h"

#define BSP_GPIO_LOW         Bit_RESET
#define BSP_GPIO_HIGH        Bit_SET
#define BSP_GPIO_TOGGLE      2 // 自定义，和nation枚举不冲突即可
 
#define BSP_GPIO_OUTPUT      GPIO_Mode_Out_PP
#define BSP_GPIO_OD          GPIO_Mode_Out_OD
#define BSP_GPIO_AF_OUTPUT   GPIO_Mode_AF_PP
#define BSP_GPIO_AF_OD       GPIO_Mode_AF_OD
#define BSP_GPIO_INPUT       GPIO_Mode_Input
#define BSP_GPIO_ANALOG      GPIO_Mode_Analog
#define BSP_GPIO_IRQ         0xFE // 自定义，和nation枚举不冲突即可


 
#define BSP_GPIO_NP          GPIO_No_Pull
#define BSP_GPIO_PU          GPIO_Pull_Up
#define BSP_GPIO_PD          GPIO_Pull_Down

#define BSP_GPIO_IRQ_RISING  GPIO_Mode_IT_Rising
#define BSP_GPIO_IRQ_FALLING GPIO_Mode_IT_Falling
#define BSP_GPIO_IRQ_DOUBLE  GPIO_Mode_IT_Rising_Falling
#define BSP_GPIO_IRQ_HIGH    SR_INVALID // 无效值
#define BSP_GPIO_IRQ_LOW     SR_INVALID  // 无效值




#define BSP_GPIO_AF0          ((uint8_t)0x00)
#define BSP_GPIO_AF1          ((uint8_t)0x01)
#define BSP_GPIO_AF2          ((uint8_t)0x02)
#define BSP_GPIO_AF3          ((uint8_t)0x03)
#define BSP_GPIO_AF4          ((uint8_t)0x04)
#define BSP_GPIO_AF5          ((uint8_t)0x05)
#define BSP_GPIO_AF6          ((uint8_t)0x06)
#define BSP_GPIO_AF7          ((uint8_t)0x07)
#define BSP_GPIO_AF8          ((uint8_t)0x08)
#define BSP_GPIO_AF9          ((uint8_t)0x09)
#define BSP_GPIO_AF10         ((uint8_t)0x0A)
#define BSP_GPIO_AF11         ((uint8_t)0x0B)    
#define BSP_GPIO_AF12         SR_INVALID    //平台无该参数，无效值
#define BSP_GPIO_AF13         SR_INVALID    //平台无该参数，无效值
#define BSP_GPIO_AF14         SR_INVALID    //平台无该参数，无效值
#define BSP_GPIO_AF15         ((uint8_t)0x0F)
#define BSP_GPIO_NOAF         ((uint8_t)0x0F)



// 引脚端口索引定义
typedef enum GPIO_PORT
{
    PNULL = -1,
#ifdef GPIOA
    PA,
#endif
#ifdef GPIOB
    PB,
#endif
#ifdef GPIOC
    PC,
#endif
#ifdef GPIOD
    PD,
#endif
#ifdef GPIOE
    PE,
#endif
#ifdef GPIOF
    PF,
#endif
#ifdef GPIOG
    PG,
#endif

    ST_PORT_MAX
} GPIO_PORT_E;

#define ST_PIN_MAX 16

// GPIO ID定义.高16位为port(端口索引)，低16位为index(pin索引).例如PB10，高16位=PB=1，index为10
#define _GPIO_ID(port, index) (((((port) & 0xFFFFu) << 16) | ((index) & 0xFFFFu)))
#define _GPIO_PORT(id) ((uint16_t)(((id) >> 16) & 0xFFFFu))
#define _GPIO_INDEX(id) ((uint16_t)((id) & 0xFFFFu))
#define SR_GET_GPIO_ID(port, index) _GPIO_ID(port, index) /*!<开放给用户使用，获取GPIO ID*/

/*!<开放给用户使用，获取GPIO ID*/
typedef enum
{
#ifdef GPIOA
    SR_GPIO0 = _GPIO_ID(PA, 0),
    SR_GPIO1 = _GPIO_ID(PA, 1),
    SR_GPIO2 = _GPIO_ID(PA, 2),
    SR_GPIO3 = _GPIO_ID(PA, 3),
    SR_GPIO4 = _GPIO_ID(PA, 4),
    SR_GPIO5 = _GPIO_ID(PA, 5),
    SR_GPIO6 = _GPIO_ID(PA, 6),
    SR_GPIO7 = _GPIO_ID(PA, 7),
    SR_GPIO8 = _GPIO_ID(PA, 8),
    SR_GPIO9 = _GPIO_ID(PA, 9),
    SR_GPIO10 = _GPIO_ID(PA, 10),
    SR_GPIO11 = _GPIO_ID(PA, 11),
    SR_GPIO12 = _GPIO_ID(PA, 12),
    SR_GPIO13 = _GPIO_ID(PA, 13),
    SR_GPIO14 = _GPIO_ID(PA, 14),
    SR_GPIO15 = _GPIO_ID(PA, 15),
#endif

#ifdef GPIOB
    SR_GPIO20 = _GPIO_ID(PB, 0),
    SR_GPIO21 = _GPIO_ID(PB, 1),
    SR_GPIO22 = _GPIO_ID(PB, 2),
    SR_GPIO23 = _GPIO_ID(PB, 3),
    SR_GPIO24 = _GPIO_ID(PB, 4),
    SR_GPIO25 = _GPIO_ID(PB, 5),
    SR_GPIO26 = _GPIO_ID(PB, 6),
    SR_GPIO27 = _GPIO_ID(PB, 7),
    SR_GPIO28 = _GPIO_ID(PB, 8),
    SR_GPIO29 = _GPIO_ID(PB, 9),
    SR_GPIO30 = _GPIO_ID(PB, 10),
    SR_GPIO31 = _GPIO_ID(PB, 11),
    SR_GPIO32 = _GPIO_ID(PB, 12),
    SR_GPIO33 = _GPIO_ID(PB, 13),
    SR_GPIO34 = _GPIO_ID(PB, 14),
    SR_GPIO35 = _GPIO_ID(PB, 15),
#endif

#ifdef GPIOC
    SR_GPIO40 = _GPIO_ID(PC, 0),
    SR_GPIO41 = _GPIO_ID(PC, 1),
    SR_GPIO42 = _GPIO_ID(PC, 2),
    SR_GPIO43 = _GPIO_ID(PC, 3),
    SR_GPIO44 = _GPIO_ID(PC, 4),
    SR_GPIO45 = _GPIO_ID(PC, 5),
    SR_GPIO46 = _GPIO_ID(PC, 6),
    SR_GPIO47 = _GPIO_ID(PC, 7),
    SR_GPIO48 = _GPIO_ID(PC, 8),
    SR_GPIO49 = _GPIO_ID(PC, 9),
    SR_GPIO50 = _GPIO_ID(PC, 10),
    SR_GPIO51 = _GPIO_ID(PC, 11),
    SR_GPIO52 = _GPIO_ID(PC, 12),
    SR_GPIO53 = _GPIO_ID(PC, 13),
    SR_GPIO54 = _GPIO_ID(PC, 14),
    SR_GPIO55 = _GPIO_ID(PC, 15),
#endif

#ifdef GPIOD
    SR_GPIO60 = _GPIO_ID(PD, 0),
    SR_GPIO61 = _GPIO_ID(PD, 1),
    SR_GPIO62 = _GPIO_ID(PD, 2),
    SR_GPIO63 = _GPIO_ID(PD, 3),
    SR_GPIO64 = _GPIO_ID(PD, 4),
    SR_GPIO65 = _GPIO_ID(PD, 5),
    SR_GPIO66 = _GPIO_ID(PD, 6),
    SR_GPIO67 = _GPIO_ID(PD, 7),
    SR_GPIO68 = _GPIO_ID(PD, 8),
    SR_GPIO69 = _GPIO_ID(PD, 9),
    SR_GPIO70 = _GPIO_ID(PD, 10),
    SR_GPIO71 = _GPIO_ID(PD, 11),
    SR_GPIO72 = _GPIO_ID(PD, 12),
    SR_GPIO73 = _GPIO_ID(PD, 13),
    SR_GPIO74 = _GPIO_ID(PD, 14),
    SR_GPIO75 = _GPIO_ID(PD, 15),
#endif

#ifdef GPIOE
    SR_GPIO80 = _GPIO_ID(PE, 0),
    SR_GPIO81 = _GPIO_ID(PE, 1),
    SR_GPIO82 = _GPIO_ID(PE, 2),
    SR_GPIO83 = _GPIO_ID(PE, 3),
    SR_GPIO84 = _GPIO_ID(PE, 4),
    SR_GPIO85 = _GPIO_ID(PE, 5),
    SR_GPIO86 = _GPIO_ID(PE, 6),
    SR_GPIO87 = _GPIO_ID(PE, 7),
    SR_GPIO88 = _GPIO_ID(PE, 8),
    SR_GPIO89 = _GPIO_ID(PE, 9),
    SR_GPIO90 = _GPIO_ID(PE, 10),
    SR_GPIO91 = _GPIO_ID(PE, 11),
    SR_GPIO92 = _GPIO_ID(PE, 12),
    SR_GPIO93 = _GPIO_ID(PE, 13),
    SR_GPIO94 = _GPIO_ID(PE, 14),
    SR_GPIO95 = _GPIO_ID(PE, 15),
#endif

#ifdef GPIOF
    SR_GPIO100 = _GPIO_ID(PF, 0),
    SR_GPIO101 = _GPIO_ID(PF, 1),
    SR_GPIO102 = _GPIO_ID(PF, 2),
    SR_GPIO103 = _GPIO_ID(PF, 3),
    SR_GPIO104 = _GPIO_ID(PF, 4),
    SR_GPIO105 = _GPIO_ID(PF, 5),
    SR_GPIO106 = _GPIO_ID(PF, 6),
    SR_GPIO107 = _GPIO_ID(PF, 7),
    SR_GPIO108 = _GPIO_ID(PF, 8),
    SR_GPIO109 = _GPIO_ID(PF, 9),
    SR_GPIO110 = _GPIO_ID(PF, 10),
    SR_GPIO111 = _GPIO_ID(PF, 11),
    SR_GPIO112 = _GPIO_ID(PF, 12),
    SR_GPIO113 = _GPIO_ID(PF, 13),
    SR_GPIO114 = _GPIO_ID(PF, 14),
    SR_GPIO115 = _GPIO_ID(PF, 15),
#endif

#ifdef GPIOG
    SR_GPIO120 = _GPIO_ID(PG, 0),
    SR_GPIO121 = _GPIO_ID(PG, 1),
    SR_GPIO122 = _GPIO_ID(PG, 2),
    SR_GPIO123 = _GPIO_ID(PG, 3),
    SR_GPIO124 = _GPIO_ID(PG, 4),
    SR_GPIO125 = _GPIO_ID(PG, 5),
    SR_GPIO126 = _GPIO_ID(PG, 6),
    SR_GPIO127 = _GPIO_ID(PG, 7),
    SR_GPIO128 = _GPIO_ID(PG, 8),
    SR_GPIO129 = _GPIO_ID(PG, 9),
    SR_GPIO130 = _GPIO_ID(PG, 10),
    SR_GPIO131 = _GPIO_ID(PG, 11),
    SR_GPIO132 = _GPIO_ID(PG, 12),
    SR_GPIO133 = _GPIO_ID(PG, 13),
    SR_GPIO134 = _GPIO_ID(PG, 14),
    SR_GPIO135 = _GPIO_ID(PG, 15),
#endif


} 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
