#ifndef __GPIO_H
#define __GPIO_H

void    GPIO_SetPinMFType(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nMFType);
void    GPIO_SetPinMode(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nPINMODE);

void    GPIO_EnableINT(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nINTMODE);

void    GPIO_EnablePinINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nPinSel);
void    GPIO_DisablePinINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nPinSel);
void    GPIO_SetINTDebounce(OB_GPIO_Type* pGPIO, uint32_t nDebounce);

uint32_t GPIO_GetINTStatus(OB_GPIO_Type* pGPIO, uint32_t nPinSel);
void    GPIO_ClearINTStatus(OB_GPIO_Type* pGPIO, uint32_t nPinSel);

void    GPIO_SetTADC0(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nTADCMode);
void    GPIO_SetFunMode(OB_GPIO_Type* pGPIO, uint32_t nPinSel, uint32_t nFuSel);

// Pin Mode
#define GPIO_PINMODE_PULL_UP        0
#define GPIO_PINMODE_OPEN_DRAIN     1
#define GPIO_PINMODE_PUSH_PULL      2
#define GPIO_PINMODE_INPUT          3

// Interrupt Mode
#define GPIO_INTMODE_DISABLE         0
#define GPIO_INTMODE_FALLING_EDGE    1
#define GPIO_INTMODE_RISING_EDGE     2
#define GPIO_INTMODE_BOTH_EDGE       3
#define GPIO_INTMODE_LOW_LEVEL       4
#define GPIO_INTMODE_HIGH_LEVEL      5

// PinSel
#define GPIO_PIN0      0x00000001
#define GPIO_PIN1      0x00000002
#define GPIO_PIN2      0x00000004
#define GPIO_PIN3      0x00000008
#define GPIO_PIN4      0x00000010
#define GPIO_PIN5      0x00000020
#define GPIO_PIN6      0x00000040
#define GPIO_PIN7      0x00000080
#define GPIO_PIN8      0x00000100
#define GPIO_PIN9      0x00000200
#define GPIO_PIN10     0x00000400
#define GPIO_PIN11     0x00000800
#define GPIO_PIN12     0x00001000
#define GPIO_PIN13     0x00002000
#define GPIO_PIN14     0x00004000
#define GPIO_PIN15     0x00008000

// Trigger ADC Type
#define GPIO_TADC_DISABLE       0
#define GPIO_TADC_FALLING_EDGE  1
#define GPIO_TADC_RISING_EDGE   2
#define GPIO_TADC_BOTH_EDGE     3

// Multiple Function Type
#define GPIO_MF_TYPE_GPIO        0
#define GPIO_MF_TIMER16_CAP      1
#define GPIO_MF_TIMER16_MAT      2
#define GPIO_MF_TIMER32_CAP      3
#define GPIO_MF_TIMER32_MAT      4
#define GPIO_MF_FAULT            5
#define GPIO_MF_UART_RX          6
#define GPIO_MF_UART_TX          7
#define GPIO_MF_SPI_MASTER_SS    8
#define GPIO_MF_SPI_MASTER_CLK   9
#define GPIO_MF_SPI_MASTER_MOSI  10
#define GPIO_MF_SPI_MASTER_MISO  11
#define GPIO_MF_SPI_SLAVE_SS     12
#define GPIO_MF_SPI_SLAVE_CLK    13
#define GPIO_MF_SPI_SLAVE_MOSI   14
#define GPIO_MF_SPI_SLAVE_MISO   15
#define GPIO_MF_I2C_SCL          16
#define GPIO_MF_I2C_SDA          17
#define GPIO_MF_I2S_MCLK         18
#define GPIO_MF_I2S_WS           19
#define GPIO_MF_I2S_CLK          20
#define GPIO_MF_I2S_DI           21
#define GPIO_MF_I2S_DO           22

#define GPIO_MF_PWM              31
#define GPIO_MF_PWMTM            32
#define GPIO_MF_ADC              33
#define GPIO_MF_RTC_INPUT        34
#define GPIO_MF_RTC_OUTPUT       35

#define GPIO_MF_XTAL             36
#define GPIO_MF_SWD              37
#define GPIO_MF_RESET            38
#define GPIO_MF_SYSTEM           39


#endif
