#ifndef __LKS32MC09X_GPIO_H__
#define __LKS32MC09X_GPIO_H__

#include "lks32mc09x_reg.h"

/**
 * @brief GPIO模式选择枚举
 */
typedef enum
{
    GPIO_Mode_IN  = 0x00, ///< 数字输入模式
    GPIO_Mode_OUT = 0x01, ///< 数字输出模式
    GPIO_Mode_ANA = 0x02, ///< 模拟输入
    GPIO_Mode_IO  = 0x03, ///< 输入输出模式，通常会同时打开开漏从而作为线与逻辑使用
} GPIO_Mode_TypeDef;

/**
 * @brief GPIO输出模式选择枚举
 */
typedef enum
{
    GPIO_PuPd_NOPULL = 0x00, ///< 高阻态
    GPIO_PuPd_UP     = 0x01, ///< 上拉
} GPIO_PuPd_TypeDef;

/**
 * @brief GPIO寄存器写入量枚举
 */
typedef enum
{
    GPIO_Bit_RESET = 0,
    GPIO_Bit_SET
} GPIO_Bit_Action;

/**
 * @brief GPIO功能配置结构体句柄
 */
typedef struct
{
    uint32_t GPIO_Pin;           ///< 要配置的引脚
    GPIO_Mode_TypeDef GPIO_Mode; ///< GPIO模式
    GPIO_PuPd_TypeDef GPIO_PuPd; ///< 上拉使能
    uint32_t GPIO_PODEna;        ///< 开漏使能
    uint32_t GPIO_PFLT;          ///< 滤波使能
} GPIO_InitTypeDef;

// GPIO复用功能选择
#define GPIO_AF_AFE          0  ///< GPIO复用 模拟
#define GPIO_AF_GPIO         0  ///< GPIO复用 GPIO
#define GPIO_AF_CMP_OUT      1  ///< GPIO复用 比较器输出
#define GPIO_AF_CLKO         1  ///< GPIO复用 时钟输出
#define GPIO_AF_HALL         2  ///< GPIO复用 霍尔信号输入
#define GPIO_AF_MCPWM        3  ///< GPIO复用 MCPWM输出
#define GPIO_AF_UART         4  ///< GPIO复用 UART
#define GPIO_AF_SPI          5  ///< GPIO复用 SPI
#define GPIO_AF_I2C          6  ///< GPIO复用 I2C
#define GPIO_AF_TIMER0       7  ///< GPIO复用 TIMER0
#define GPIO_AF_TIMER1       7  ///< GPIO复用 TIMER1
#define GPIO_AF_TIMER2       8  ///< GPIO复用 TIMER2
#define GPIO_AF_QEP0         8  ///< GPIO复用 TIMER2
#define GPIO_AF_ADC0_TRIGGER 9  ///< GPIO复用 ADC0触发信号
#define GPIO_AF_ADC1_TRIGGER 9  ///< GPIO复用 ADC1触发信号
#define GPIO_AF_CAN          10 ///< GPIO复用 CAN
#define GPIO_AF_SIF          11 ///< GPIO复用 SIF
#define GPIO_AF_CL           12 ///< GPIO复用 CL CL0可配置逻辑
#define GPIO_AF_CLU          12 ///< GPIO复用 CLU CL0可配置逻辑
// 兼容之前的写法
#define AF0_GPIO    0  ///< GPIO复用 GPIO
#define AF1_SYSAF   1  ///< GPIO复用 SYS_AF、CMP、CLOCK等数字信号输出功能
#define AF2_HALL    2  ///< GPIO复用 HALL功能
#define AF3_MCPWM   3  ///< GPIO复用 MCPWM功能
#define AF4_UART    4  ///< GPIO复用 UART功能
#define AF5_SPI     5  ///< GPIO复用 SPI功能
#define AF6_I2C     6  ///< GPIO复用 I2C功能
#define AF7_TIMER01 7  ///< GPIO复用 Timer0、Timer1功能
#define AF8_TIMER23 8  ///< GPIO复用 Timer2、Timer3、QEP0、QEP1功能
#define AF9_DEBUG   9  ///< GPIO复用 ADC trigger debug功能
#define AF10_CAN    10 ///< GPIO复用 CAN功能
#define AF11_SIF    11 ///< GPIO复用 SIF功能
#define AF12_CL     12 ///< GPIO复用 CL功能

/* GPIO引脚定义 */
#define GPIO_Pin_NONE 0                ///< GPIO pin脚定义，无pin脚
#define GPIO_Pin_0    BIT0             ///< GPIO pin脚定义，pin_0脚
#define GPIO_Pin_1    BIT1             ///< GPIO pin脚定义，pin_1脚
#define GPIO_Pin_2    BIT2             ///< GPIO pin脚定义，pin_2脚
#define GPIO_Pin_3    BIT3             ///< GPIO pin脚定义，pin_3脚
#define GPIO_Pin_4    BIT4             ///< GPIO pin脚定义，pin_4脚
#define GPIO_Pin_5    BIT5             ///< GPIO pin脚定义，pin_5脚
#define GPIO_Pin_6    BIT6             ///< GPIO pin脚定义，pin_6脚
#define GPIO_Pin_7    BIT7             ///< GPIO pin脚定义，pin_7脚
#define GPIO_Pin_8    BIT8             ///< GPIO pin脚定义，pin_8脚
#define GPIO_Pin_9    BIT9             ///< GPIO pin脚定义，pin_9脚
#define GPIO_Pin_10   BIT10            ///< GPIO pin脚定义，pin_10脚
#define GPIO_Pin_11   BIT11            ///< GPIO pin脚定义，pin_11脚
#define GPIO_Pin_12   BIT12            ///< GPIO pin脚定义，pin_12脚
#define GPIO_Pin_13   BIT13            ///< GPIO pin脚定义，pin_13脚
#define GPIO_Pin_14   BIT14            ///< GPIO pin脚定义，pin_14脚
#define GPIO_Pin_15   BIT15            ///< GPIO pin脚定义，pin_15脚
#define GPIO_Pin_ALL  (uint32_t)0xFFFF ///< GPIO pin脚定义，所有pin脚

/* GPIO引脚源定义 */
#define GPIO_PinSource_0  0  ///< GPIO pin脚定义，pin_0脚
#define GPIO_PinSource_1  1  ///< GPIO pin脚定义，pin_1脚
#define GPIO_PinSource_2  2  ///< GPIO pin脚定义，pin_2脚
#define GPIO_PinSource_3  3  ///< GPIO pin脚定义，pin_3脚
#define GPIO_PinSource_4  4  ///< GPIO pin脚定义，pin_4脚
#define GPIO_PinSource_5  5  ///< GPIO pin脚定义，pin_5脚
#define GPIO_PinSource_6  6  ///< GPIO pin脚定义，pin_6脚
#define GPIO_PinSource_7  7  ///< GPIO pin脚定义，pin_7脚
#define GPIO_PinSource_8  8  ///< GPIO pin脚定义，pin_8脚
#define GPIO_PinSource_9  9  ///< GPIO pin脚定义，pin_9脚
#define GPIO_PinSource_10 10 ///< GPIO pin脚定义，pin_10脚
#define GPIO_PinSource_11 11 ///< GPIO pin脚定义，pin_11脚
#define GPIO_PinSource_12 12 ///< GPIO pin脚定义，pin_12脚
#define GPIO_PinSource_13 13 ///< GPIO pin脚定义，pin_13脚
#define GPIO_PinSource_14 14 ///< GPIO pin脚定义，pin_14脚
#define GPIO_PinSource_15 15 ///< GPIO pin脚定义，pin_15脚

void GPIO_Enable(void);
void GPIO_Disable(void);
void GPIO_Reset(void);
/* 初始化、配置函数 */
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef *GPIO_InitStruct);
void GPIO_LockRegister(GPIO_TypeDef *GPIOx);
void GPIO_UnlockRegister(GPIO_TypeDef *GPIOx);

/* GPIO读写函数 */
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint32_t GPIO_ReadInputData(GPIO_TypeDef *GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
uint32_t GPIO_ReadOutputData(GPIO_TypeDef *GPIOx);
void GPIO_SetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
void GPIO_Write(GPIO_TypeDef *GPIOx, uint32_t Val);
void GPIO_WriteBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_Bit_Action BitVal);
void GPIO_ToggleBits(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
/* GPIO功能选择函数 */
void GPIO_PinAFConfig(GPIO_TypeDef *GPIOx, uint32_t GPIO_PinSource, uint32_t GPIO_AF);
/**
 * @brief  GPIO配置函数
 * @param  GPIOx: GPIO端口
 * @param  GPIO_PinSource: GPIO引脚
 * @param  mode: GPIO模式
 * @param  GPIO_AF_x: GPIO复用功能选择
 */
void GPIO_Config(GPIO_TypeDef *GPIOx, uint32_t GPIO_PinSource, GPIO_Mode_TypeDef mode, uint32_t GPIO_AF_x);

#endif
