/******************************************************************************
 *                  Shanghai ChipON Micro-Electronic Co.,Ltd                  *
 ******************************************************************************
 *  $File Name$       : KF32A156_gpio.h                                	      *
 *  $Author$          : ChipON AE/FAE Group                                   *
 *  $Data$            : 2021-07-08                                            *
 *  $AutoSAR Version  : V1.0                                          	      *
 *  $Description$     : This file contains the headers of the GPIO 			  *
 *						peripherals.										  *
 ******************************************************************************
 *  Copyright (C) by Shanghai ChipON Micro-Electronic Co.,Ltd                 *
 *  All rights reserved.                                                      *
 *                                                                            *
 *  This software is copyrght protected and proprietary to                    *
 *  Shanghai ChipON Micro-Electronic Co.,Ltd.                                 *
 ******************************************************************************
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *                     		REVISON HISTORY                               	  *
 *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *  Data       Version  Author        Description                             *
 *  ~~~~~~~~~~ ~~~~~~~~ ~~~~~~~~~~~~  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
 *  										                                  *
 *                                                                            *
 *                                                                            *
 *****************************************************************************/

#ifndef KF32A156_GPIO_H_
#define KF32A156_GPIO_H_

#include "KF32A156.h"


/**
 *	GPIO内存指针
 **/
#define CHECK_GPIO_ALL_PERIPH(PERIPH)	(((PERIPH) == GPIOA_SFR) \
									  || ((PERIPH) == GPIOB_SFR) \
									  || ((PERIPH) == GPIOC_SFR) \
									  || ((PERIPH) == GPIOD_SFR) \
									  || ((PERIPH) == GPIOE_SFR) \
									  || ((PERIPH) == GPIOF_SFR) \
									  || ((PERIPH) == GPIOG_SFR) \
									  || ((PERIPH) == GPIOH_SFR))

/**
  * GPIO上拉/下拉
  */
typedef enum
{
    GPIO_NOPULL = 0x00,
    GPIO_PULLUP = 0x01
}GPIOPU_TypeDef, GPIOPD_TypeDef;

#define CHECK_GPIO_PU(PU)               (((PU) == GPIO_NOPULL) \
                                      || ((PU) == GPIO_PULLUP))
#define GPIO_PULLDOWN	GPIO_PULLUP
#define CHECK_GPIO_PD(PD)               (((PD) == GPIO_NOPULL) \
                                      || ((PD) == GPIO_PULLDOWN))

/**
  * GPIO开漏输出类型
  */
typedef enum
{
    GPIO_POD_PP = 0x00,
    GPIO_POD_OD = 0x01
}GPIOPOD_TypeDef;
#define CHECK_GPIO_POD(OTYPE)           (((OTYPE) == GPIO_POD_PP) \
                                      || ((OTYPE) == GPIO_POD_OD))

/**
  * GPIO输出模式控制
  */
typedef enum
{
    GPIO_MODE_IN   = 0x00,              /* 通用IO口输入模式 */
    GPIO_MODE_OUT  = 0x01,              /* 通用IO口输出模式 */
    GPIO_MODE_RMP  = 0x02,              /* 重映射IO口功能模式 */
    GPIO_MODE_AN   = 0x03               /* 模拟模式 */
}GPIOMode_TypeDef;
#define CHECK_GPIO_MODE(MODE)           (((MODE) == GPIO_MODE_IN) \
                                      || ((MODE) == GPIO_MODE_OUT) \
                                      || ((MODE) == GPIO_MODE_RMP) \
                                      || ((MODE) == GPIO_MODE_AN))

/**
  * GPIO端口输出速度控制
  */
typedef enum
{
    GPIO_LOW_SPEED  = 0,
    GPIO_HIGH_SPEED = 1
}GPIOSpeed_TypeDef;
#define CHECK_GPIO_SPEED(SPEED)         (((SPEED) == GPIO_LOW_SPEED) \
                                      || ((SPEED) == GPIO_HIGH_SPEED))

/**
  * 描述  GPIO配置信息结构体
  */
typedef struct
{
    uint32_t m_Pin;                     /* GPIO端口掩码，
                                           取值为宏“GPIO端口掩码”中的一个或多个组合 */

    GPIOMode_TypeDef m_Mode;            /* GPIO输出模式，
                                           取值为枚举类型GPIOMode_TypeDef中的一个 */

    GPIOSpeed_TypeDef m_Speed;          /* GPIO输出速度。
                                           取值为枚举类型GPIOSpeed_TypeDef中的一个 */

    GPIOPOD_TypeDef m_OpenDrain;        /* GPIO开漏控制，
                                           取值为枚举类型GPIOPOD_TypeDef中的一个 */

    GPIOPU_TypeDef m_PullUp;            /* GPIO上拉配置，
                                           取值为枚举类型GPIOPU_TypeDef中的一个 */

    GPIOPD_TypeDef m_PullDown;          /* GPIO下拉配置，
                                           取值为枚举类型GPIOPU_TypeDef中的一个 */
}GPIO_InitTypeDef;

/**
  * GPIO端口配置
  */
typedef enum
{
    Bit_RESET = 0,
    Bit_SET = !Bit_RESET
}BitAction;
#define CHECK_GPIO_BIT_ACTION(ACTION)   (((ACTION) == Bit_RESET) \
                                      || ((ACTION) == Bit_SET))

/**
  * GPIO端口编号
  */
#define GPIO_Pin_Num_0                  ((uint32_t)0x0)
#define GPIO_Pin_Num_1                  ((uint32_t)0x1)
#define GPIO_Pin_Num_2                  ((uint32_t)0x2)
#define GPIO_Pin_Num_3                  ((uint32_t)0x3)
#define GPIO_Pin_Num_4                  ((uint32_t)0x4)
#define GPIO_Pin_Num_5                  ((uint32_t)0x5)
#define GPIO_Pin_Num_6                  ((uint32_t)0x6)
#define GPIO_Pin_Num_7                  ((uint32_t)0x7)
#define GPIO_Pin_Num_8                  ((uint32_t)0x8)
#define GPIO_Pin_Num_9                  ((uint32_t)0x9)
#define GPIO_Pin_Num_10                 ((uint32_t)0xA)
#define GPIO_Pin_Num_11                 ((uint32_t)0xB)
#define GPIO_Pin_Num_12                 ((uint32_t)0xC)
#define GPIO_Pin_Num_13                 ((uint32_t)0xD)
#define GPIO_Pin_Num_14                 ((uint32_t)0xE)
#define GPIO_Pin_Num_15                 ((uint32_t)0xF)
#define CHECK_GPIO_PIN_NUM(PIN)         ((PIN) <= GPIO_Pin_Num_15)

/**
  * GPIO端口掩码
  */
#define GPIO_PIN_MASK_0                  ((uint16_t)0x0001)
#define GPIO_PIN_MASK_1                  ((uint16_t)0x0002)
#define GPIO_PIN_MASK_2                  ((uint16_t)0x0004)
#define GPIO_PIN_MASK_3                  ((uint16_t)0x0008)
#define GPIO_PIN_MASK_4                  ((uint16_t)0x0010)
#define GPIO_PIN_MASK_5                  ((uint16_t)0x0020)
#define GPIO_PIN_MASK_6                  ((uint16_t)0x0040)
#define GPIO_PIN_MASK_7                  ((uint16_t)0x0080)
#define GPIO_PIN_MASK_8                  ((uint16_t)0x0100)
#define GPIO_PIN_MASK_9                  ((uint16_t)0x0200)
#define GPIO_PIN_MASK_10                 ((uint16_t)0x0400)
#define GPIO_PIN_MASK_11                 ((uint16_t)0x0800)
#define GPIO_PIN_MASK_12                 ((uint16_t)0x1000)
#define GPIO_PIN_MASK_13                 ((uint16_t)0x2000)
#define GPIO_PIN_MASK_14                 ((uint16_t)0x4000)
#define GPIO_PIN_MASK_15                 ((uint16_t)0x8000)
#define GPIO_PIN_MASK_All                ((uint16_t)0xFFFF)
#define CHECK_GPIO_PIN_MASK(PIN)         (((PIN) >> 16 ) == (uint32_t)0x00)

/**
  * GPIO引脚重映射
  */
#define	GPIO_RMP_AF0			     ((uint32_t)0x0300)
#define	GPIO_RMP_AF1			     ((uint32_t)0x0301)
#define	GPIO_RMP_AF2			     ((uint32_t)0x0302)
#define	GPIO_RMP_AF3			     ((uint32_t)0x0303)
#define	GPIO_RMP_AF4			     ((uint32_t)0x0304)
#define	GPIO_RMP_AF5			     ((uint32_t)0x0305)
#define	GPIO_RMP_AF6			     ((uint32_t)0x0306)
#define	GPIO_RMP_AF7			     ((uint32_t)0x0307)
#define	GPIO_RMP_AF8			     ((uint32_t)0x0308)
#define	GPIO_RMP_AF9			     ((uint32_t)0x0309)
#define	GPIO_RMP_AF10			     ((uint32_t)0x030A)
#define	GPIO_RMP_AF11			     ((uint32_t)0x030B)
#define	GPIO_RMP_AF12			     ((uint32_t)0x030C)
#define	GPIO_RMP_AF13			     ((uint32_t)0x030D)
#define	GPIO_RMP_AF14			     ((uint32_t)0x030E)
#define CHECK_GPIO_REMAP(RMP)		 (((RMP) <= GPIO_RMP_AF14) && ((RMP) >= GPIO_RMP_AF0))


/**
 * 	CHx输入输出选择
 * */
#define FlexRM_ONLY_INPUT								((uint32_t)0)
#define FlexRM_AUTO										((uint32_t)1)
#define CHECK_FlexRM_CHX_DIRECTION(SELECT)				((SELECT) <= FlexRM_AUTO)

/**
 * Groupx 功能选择位
 * */
#define FlexRM_GROUPX_PORT0								((uint32_t)0)
#define FlexRM_GROUPX_PORT1								((uint32_t)1)
#define FlexRM_GROUPX_PORT2								((uint32_t)2)
#define FlexRM_GROUPX_PORT3								((uint32_t)3)
#define FlexRM_GROUPX_PORT4								((uint32_t)4)
#define FlexRM_GROUPX_PORT5								((uint32_t)5)
#define FlexRM_GROUPX_PORT6								((uint32_t)6)
#define FlexRM_GROUPX_PORT7								((uint32_t)7)
#define FlexRM_GROUPX_PORT8								((uint32_t)8)
#define FlexRM_GROUPX_PORT9								((uint32_t)9)
#define FlexRM_GROUPX_PORT10							((uint32_t)10)
#define FlexRM_GROUPX_PORT11							((uint32_t)11)
#define FlexRM_GROUPX_PORT12							((uint32_t)12)
#define FlexRM_GROUPX_PORT13							((uint32_t)13)
#define FlexRM_GROUPX_PORT14							((uint32_t)14)
#define FlexRM_GROUPX_PORT15							((uint32_t)15)
#define CHECK_FlexRM_GROUPX_PORT(PORT)					((PORT) <= FlexRM_GROUPX_PORT15)

/**
 * 	Groupx
 * */
#define FlexRM_GROUP_0									((uint32_t)0)
#define FlexRM_GROUP_1									((uint32_t)1)
#define FlexRM_GROUP_2									((uint32_t)2)
#define FlexRM_GROUP_3									((uint32_t)3)
#define FlexRM_GROUP_4									((uint32_t)4)
#define FlexRM_GROUP_5									((uint32_t)5)
#define FlexRM_GROUP_6									((uint32_t)6)
#define FlexRM_GROUP_7									((uint32_t)7)
#define FlexRM_GROUP_8									((uint32_t)8)
#define FlexRM_GROUP_9									((uint32_t)9)
#define FlexRM_GROUP_10									((uint32_t)10)
#define FlexRM_GROUP_11									((uint32_t)11)
#define CHECK_FlexRM_GROUP_NUM(NUM)						((NUM) <= FlexRM_GROUP_11)

/**
 * 	CHANNELx
 * */
#define FlexRM_CHANNEL_0									((uint32_t)0)
#define FlexRM_CHANNEL_1									((uint32_t)1)
#define FlexRM_CHANNEL_2									((uint32_t)2)
#define FlexRM_CHANNEL_3									((uint32_t)3)
#define FlexRM_CHANNEL_4									((uint32_t)4)
#define FlexRM_CHANNEL_5									((uint32_t)5)
#define FlexRM_CHANNEL_6									((uint32_t)6)
#define FlexRM_CHANNEL_7									((uint32_t)7)
#define FlexRM_CHANNEL_8									((uint32_t)8)
#define FlexRM_CHANNEL_9									((uint32_t)9)
#define FlexRM_CHANNEL_10									((uint32_t)10)
#define FlexRM_CHANNEL_11									((uint32_t)11)
#define CHECK_FlexRM_CHANNEL_NUM(NUM)						((NUM) <= FlexRM_CHANNEL_11)


/* 通用输入输出端口(GPIO)初始化及配置函数定义*******************************/
void GPIO_Reset (GPIO_SFRmap* GPIOx);
void GPIO_Configuration (GPIO_SFRmap* GPIOx, GPIO_InitTypeDef* gpioInitStruct);
void GPIO_Struct_Init (GPIO_InitTypeDef* gpioInitStruct);
void GPIO_Pin_Lock_Config (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, FunctionalState NewState);
void GPIO_Pull_Up_Enable (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, FunctionalState NewState);
void GPIO_Toggle_Pull_Up_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPin);
void GPIO_Pull_Down_Enable (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, FunctionalState NewState);
void GPIO_Toggle_Pull_Down_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPin);
void GPIO_Open_Drain_Enable (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, GPIOPOD_TypeDef NewState);
void GPIO_Toggle_Open_Drain_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPin);
void GPIO_Write_Mode_Bits (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, GPIOMode_TypeDef NewState);
void GPIO_Speed_Config (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, GPIOSpeed_TypeDef NewState);
void GPIO_Toggle_Speed_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPin);

/* 通用输入输出端口(GPIO)读写函数定义***************************************/
BitAction GPIO_Read_Input_Data_Bit (GPIO_SFRmap* GPIOx, uint16_t GpioPin);
uint16_t GPIO_Read_Input_Data (GPIO_SFRmap* GPIOx);
BitAction GPIO_Read_Output_Data_Bit (GPIO_SFRmap* GPIOx, uint16_t GpioPin);
uint16_t GPIO_Read_Output_Data (GPIO_SFRmap* GPIOx);
void GPIO_Set_Output_Data_Bits (GPIO_SFRmap* GPIOx,
                    uint16_t GpioPin, BitAction BitsValue);
void GPIO_Toggle_Output_Data_Config (GPIO_SFRmap* GPIOx, uint16_t GpioPin);

/* 通用输入输出端口(GPIO)重映射配置函数定义*********************************/
void
GPIO_Pin_RMP_Config(GPIO_SFRmap* GPIOx, uint16_t GpioPinNum, uint32_t PinRemap);


/* 接口映射管理(FlexRM)配置函数定义***************************************/
void FlexRM_Reset(void);
void FlexRM_Channel_Direction_Select(uint32_t Channel, FunctionalState NewState);
void FlexRM_Group_Enable(uint32_t Channel, FunctionalState NewState);
void FlexRM_Group_Function_Select(uint32_t Group, uint32_t Port);
void FlexRM_Group_Output_Select(uint32_t Group, uint32_t Channel);
void FlexRM_Group_Input_Select(uint32_t Group, uint32_t Channel);


#endif /* KF32A156_GPIO_H_ */
