/*******************************************************************************
*
*
* File:          hal_gpio.h
* Description： gpio HAL层头文件
* Version：      V0.1
* Date：         2021-03-17
* Author：       wuc
 *******************************************************************************/
#ifndef __HAL_GPIO_H__
#define __HAL_GPIO_H__

/*******************************************************************************
* 1.Included files
*******************************************************************************/
#include "tau_device_datatype.h"
#include "tau_common.h"

/*******************************************************************************
* 2.Global constant and macro definitions using #define
*******************************************************************************/
/**
* @brief  GPIO pin
*/
typedef enum
{
    /*以GPIO命名PIN*/
    IO_PAD_GPIO0 = 0,
    IO_PAD_GPIO1,
    IO_PAD_GPIO2,
    IO_PAD_GPIO3,
    IO_PAD_GPIO4,
    IO_PAD_GPIO5,
    IO_PAD_GPIO6,
    IO_PAD_RESV,
    IO_PAD_GPIO8,
    IO_PAD_GPIO9,
    IO_PAD_GPIO10,
    IO_PAD_GPIO11,
    IO_PAD_GPIO12,
    IO_PAD_GPIO13,
    IO_PAD_GPIO14,
    IO_PAD_RESV1,
    IO_PAD_RESV2,
    IO_PAD_GPIO17,
    IO_PAD_GPIO18,
    IO_PAD_GPIO19,
    IO_PAD_GPIO20,
    IO_PAD_GPIO21,

    /*以实际PAD NAME命名PIN*/
    IO_PAD_AP_SPIS_MISO = IO_PAD_GPIO0,
    IO_PAD_AP_SPIS_MOSI = IO_PAD_GPIO1,
    IO_PAD_AP_INT       = IO_PAD_GPIO2,
    IO_PAD_AP_TE        = IO_PAD_GPIO3,
    IO_PAD_AP_SWIRE     = IO_PAD_GPIO4,
    IO_PAD_TD_SPIM_MISO = IO_PAD_GPIO5,
    IO_PAD_TD_SPIM_MOSI = IO_PAD_GPIO6,
    IO_PAD_TD_RSTN      = IO_PAD_RESV,
    IO_PAD_TD_TPRSTN    = IO_PAD_GPIO8,
    IO_PAD_TD_INT       = IO_PAD_GPIO9,
    IO_PAD_TD_LEDPWM    = IO_PAD_GPIO10,
    IO_PAD_TD_FC_CLK    = IO_PAD_GPIO11,
    IO_PAD_TD_FC_CSN    = IO_PAD_GPIO12,
    IO_PAD_TD_FC_MISO   = IO_PAD_GPIO13,
    IO_PAD_TD_FC_MOSI   = IO_PAD_GPIO14,
    IO_PAD_UART_RX      = IO_PAD_GPIO17,
    IO_PAD_UART_TX      = IO_PAD_GPIO18,
    IO_PAD_PWMEN        = IO_PAD_GPIO19,
    IO_PAD_ADCIN        = IO_PAD_GPIO20,
    IO_PAD_AP_TPRSTN    = IO_PAD_GPIO21,

    IO_PAD_AP_SPIS_CLK,
    IO_PAD_AP_SPIS_CSN,
    IO_PAD_TD_SPIM_CLK,
    IO_PAD_TD_SPIM_CSN,
    IO_PAD_SFC_CLK,
    IO_PAD_SFC_CSN,
    IO_PAD_SFC_IO0,
    IO_PAD_SFC_IO1,

    IO_PAD_MAX,

    /*以实际BALL编号命名PIN*/
    IO_PIN_A1           = IO_PAD_TD_TPRSTN,
    IO_PIN_A2           = IO_PAD_TD_FC_CSN,
    IO_PIN_A3           = IO_PAD_TD_SPIM_MISO,
    IO_PIN_A4           = IO_PAD_TD_SPIM_CLK,
    IO_PIN_A5           = IO_PAD_PWMEN,
    IO_PIN_A6           = IO_PAD_ADCIN,
    IO_PIN_A7           = IO_PAD_AP_INT,
    IO_PIN_A8           = IO_PAD_AP_SPIS_MOSI,
    IO_PIN_B1           = IO_PAD_TD_FC_CLK,
    IO_PIN_B2           = IO_PAD_TD_FC_MISO,
    IO_PIN_B3           = IO_PAD_TD_SPIM_MOSI,
    IO_PIN_B4           = IO_PAD_TD_SPIM_CSN,
    IO_PIN_B5           = IO_PAD_AP_SWIRE,
    IO_PIN_B7           = IO_PAD_AP_SPIS_MISO,
    IO_PIN_B8           = IO_PAD_AP_SPIS_CSN,
    IO_PIN_C1           = IO_PAD_TD_FC_MOSI,
    IO_PIN_C2           = IO_PAD_TD_LEDPWM,
    IO_PIN_C4           = IO_PAD_UART_TX,
    IO_PIN_C5           = IO_PAD_UART_RX,
    IO_PIN_C6           = IO_PAD_AP_TE,
    IO_PIN_D1           = IO_PAD_TD_RSTN,
    IO_PIN_D2           = IO_PAD_TD_INT,
    IO_PIN_D7           = IO_PAD_AP_TPRSTN,
    IO_PIN_D8           = IO_PAD_AP_SPIS_CLK,
} io_pad_e;

/**
* @brief  PAD_AP_SPIS_CLK可选的mode
*/
typedef enum
{
    IO_MODE_JTAG_TCK   = 0,
    IO_MODE_SPIS_SCLK  = 1,
    IO_MODE_I2C0_SCL   = 3,
} pad_ap_spis_clk_mode_e;

/**
* @brief  PAD_AP_SPIS_CSN可选的mode
*/
typedef enum
{
    IO_MODE_JTAG_TRSTN = 0,
    IO_MODE_SPIS_CSN   = 1,
    IO_MODE_I2C0_SDA   = 3,
} pad_ap_spis_csn_mode_e;

/**
* @brief  PAD_AP_SPIS_MISO可选的mode
*/
typedef enum
{
    IO_MODE_JTAG_TDO     = 0,
    IO_MODE_SPIS_MISO    = 1,
    IO_MODE_GPIO0        = 2,
    IO_MODE_UART_RX_AP   = 3,
    IO_MODE_SPIM_MISO_AP = 4,
} pad_ap_spis_miso_mode_e;

/**
* @brief  PAD_AP_SPIS_MOSI可选的mode
*/
typedef enum
{
    IO_MODE_JTAG_TMS     = 0,
    IO_MODE_SPIS_MOSI    = 1,
    IO_MODE_GPIO1        = 2,
    IO_MODE_UART_TX_AP   = 3,
    IO_MODE_SPIM_MOSI_AP = 4,
} pad_ap_spis_mosi_mode_e;

/**
* @brief  PAD_AP_TPRSTN可选的mode
*/
typedef enum
{
    IO_MODE_JTAG_TDI = 0,
    IO_MODE_GPIO21   = 2,
} pad_ap_tprstn_mode_e;

/**
* @brief  PAD_AP_INT可选的mode
*/
typedef enum
{
    IO_MODE_GPIO2       = 2,
} pad_ap_int_mode_e;

/**
* @brief  PAD_AP_TE可选的mode
*/
typedef enum
{
    IO_MODE_TEAR  = 0,
    IO_MODE_GPIO3 = 2,
} pad_ap_te_mode_e;

/**
* @brief  PAD_AP_SWIRE可选的mode
*/
typedef enum
{
    IO_MODE_SWIRE = 0,
    IO_MODE_PWMO  = 1,
    IO_MODE_GPIO4 = 2,
} pad_ap_swire_mode_e;

/**
* @brief  PAD_TD_SPIM_CLK可选的mode
*/
typedef enum
{
    IO_MODE_SPIM_SCLK  = 0,
    IO_MODE_I2C1_SCL   = 1,
} pad_td_spim_clk_mode_e;

/**
* @brief  PAD_TD_SPIM_CSN可选的mode
*/
typedef enum
{
    IO_MODE_SPIM_CSN   = 0,
    IO_MODE_I2C1_SDA   = 1,
} pad_td_spim_csn_mode_e;

/**
* @brief  PAD_TD_SPIM_MISO可选的mode
*/
typedef enum
{
    IO_MODE_SPIM_MISO = 0,
#if defined(ISP_568) || defined(ISP_368)
    IO_MODE_PWMO1     = 1,
#endif
    IO_MODE_GPIO5     = 2,
} pad_td_spim_miso_mode_e;

/**
* @brief  PAD_TD_SPIM_MOSI可选的mode
*/
typedef enum
{
    IO_MODE_SPIM_MOSI = 0,
    IO_MODE_GPIO6     = 2,
} pad_td_spim_mosi_mode_e;

/**
* @brief  PAD_TD_TPRSTN可选的mode
*/
typedef enum
{
    IO_MODE_GPIO8      = 2,
} pad_td_tprstn_mode_e;

/**
* @brief  PAD_TD_INT可选的mode
*/
typedef enum
{
    IO_MODE_GPIO9_FUNC = 0,
    IO_MODE_GPIO9      = 2,
} pad_td_int_mode_e;

/**
* @brief  PAD_TD_LEDPWM可选的mode
*/
typedef enum
{
    IO_MODE_PWMI       = 0,
#if defined(ISP_568) || defined(ISP_368)
    IO_MODE_PWMO2      = 1,
#endif
    IO_MODE_GPIO10     = 2,
} pad_td_ledpwm_mode_e;

/**
* @brief  PAD_TD_FC_CLK可选的mode
*/
typedef enum
{
    IO_MODE_TSPIS_CLK    = 0,
    IO_MODE_GPIO11       = 2,
} pad_td_fc_clk_mode_e;

/**
* @brief  PAD_TD_FC_CSN可选的mode
*/
typedef enum
{
    IO_MODE_TSPIS_CSN    = 0,
    IO_MODE_GPIO12       = 2,
} pad_td_fc_csn_mode_e;

/**
* @brief  PAD_TD_FC_MISO可选的mode
*/
typedef enum
{
    IO_MODE_TSPIS_MISO = 0,
    IO_MODE_GPIO13     = 2,
} pad_td_fc_miso_mode_e;

/**
* @brief  PAD_TD_FC_MOSI可选的mode
*/
typedef enum
{
    IO_MODE_TSPIS_MOSI = 0,
    IO_MODE_GPIO14     = 2,
} pad_td_fc_mosi_mode_e;

/**
* @brief  PAD_UART_RX可选的mode
*/
typedef enum
{
    IO_MODE_UART_RX = 0,
    IO_MODE_GPIO17  = 2,
} pad_uart_rx_mode_e;

/**
* @brief  PAD_UART_TX可选的mode
*/
typedef enum
{
    IO_MODE_UART_TX = 0,
    IO_MODE_GPIO18  = 2,
} pad_uart_tx_mode_e;

/**
* @brief  PAD_PWMEN可选的mode
*/
typedef enum
{
    IO_MODE_GPIO19     = 2,
} pad_pwmen_mode_e;

/**
* @brief  PAD_ADCIN可选的mode
*/
typedef enum
{
    IO_MODE_GPIO20      = 2,
} pad_adcin_mode_e;

/**
* @brief  PAD_SFC_CLK可选的mode
*/
typedef enum
{
    IO_MODE_INTER_FLS_CLK = 0,
    IO_MODE_EXT_FLS_CLK   = 1,
} pad_sfc_clk_mode_e;

/**
* @brief  PAD_SFC_CSN可选的mode
*/
typedef enum
{
    IO_MODE_INTER_FLS_CSN = 0,
    IO_MODE_EXT_FLS_CSN   = 1,
} pad_sfc_csn_mode_e;

/**
* @brief  PAD_SFC_IO0可选的mode
*/
typedef enum
{
    IO_MODE_INTER_FLS_IO0 = 0,
    IO_MODE_EXT_FLS_MISO  = 1,
} pad_sfc_io0_mode_e;

/**
* @brief  PAD_SFC_IO1可选的mode
*/
typedef enum
{
    IO_MODE_INTER_FLS_IO1 = 0,
    IO_MODE_EXT_FLS_MOSI  = 1,
} pad_sfc_io1_mode_e;

/**
* @brief  PAD电压转换速率
*/
typedef enum
{
    IO_SLEW_RATE_SLOW = 0,
    IO_SLEW_RATE_FAST = 1,
} pad_slew_rate_e;

/*******************************************************************************
* IOE
*******************************************************************************/
/**
* @brief  GPIO io方向
*/
typedef enum
{
    IO_IOE_INPUT = 0,
    IO_IOE_OUTPUT
} gpio_ioe_direct_e;

/**
* @brief  GPIO level
*/
typedef enum
{
    IO_LVL_LOW = 0,
    IO_LVL_HIGH
} gpio_level_e;

/*******************************************************************************
* 3.Global structures, unions and enumerations using typedef
*******************************************************************************/

/*******************************************************************************
* 4.Global variable extern declarations
*******************************************************************************/

/*******************************************************************************
* 5.Global function prototypes
*******************************************************************************/
/**
* @brief  配置指定PAD为GPIO mode，方向为input，指定中断触发方式
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  trig：4种中断触发方式，参考枚举类型sys_cfg_trigger_e
* @retval 无
*/
void hal_gpio_init_eint(io_pad_e pad, sys_cfg_trigger_e trig);

/**
* @brief  注册GPIO中断回调函数
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  cb_func：回调函数地址
* @param  data：回调函数参数地址
* @retval 无
*/
void hal_gpio_reg_eint_cb(io_pad_e pad, fcb_type cb_func);

/**
* @brief  开关GPIO中断
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  state：开关控制
* @retval 无
*/
void hal_gpio_ctrl_eint(io_pad_e pad, function_state_e state);

/**
* @brief  获取GPIO中断类型
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @retval 无
*/
gpio_int_e hal_gpio_get_int_type(io_pad_e pad);

/**
* @brief  配置指定PAD为GPIO mode，方向为output，指定初始电平
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  lvl：初始电平，参考枚举类型gpio_level_e
* @retval 无
*/
void hal_gpio_init_output(io_pad_e pad, gpio_level_e lvl);

/**
* @brief  封装设置输出接口
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  lvl：初始电平，参考枚举类型gpio_level_e
* @retval 无
*/
void hal_gpio_set_output_data(io_pad_e pad, gpio_level_e lvl);

/**
* @brief  封装设置输出接口扩展，支持同时通知两个IO输出电平
* @param  pad1：GPIO序号，参考枚举类型gpio_pad_e
* @param  pad1_lvl：配置电平，参考枚举类型gpio_level_e
* @param  pad2：GPIO序号，参考枚举类型gpio_pad_e
* @param  pad2_lvl：配置电平，参考枚举类型gpio_level_e
* @retval 无
*/
void hal_gpio_set_output_data_ex(io_pad_e pad1, gpio_level_e pad1_lvl, io_pad_e pad2, gpio_level_e pad2_lvl);

/**
* @brief  配置指定PAD为GPIO mode，方向为input
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @retval 无
*/
void hal_gpio_init_input(io_pad_e pad);

/**
* @brief  读取输入电平
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @retval 无
*/
gpio_level_e hal_gpio_get_input_data(io_pad_e pad);

/**
* @brief  设置io mode
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  mode：工作模式，参考各PAD对应的mode枚举类型
* @retval 无
*/
void hal_gpio_set_mode(io_pad_e pad, uint8_t mode);

/**
* @brief  获取指定PAD的默认上拉、下拉状态
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  up_enable：默认上拉状态
* @param  down_enable：默认下拉状态
* @retval 无
*/
void hal_gpio_get_pull_state(io_pad_e pad, function_state_e *up_enable, function_state_e *down_enable);

/**
* @brief  配置指定PAD的默认上拉、下拉状态
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  up_enable：默认上拉状态
* @param  down_enable：默认下拉状态
* @retval 无
*/
void hal_gpio_set_pull_state(io_pad_e pad, function_state_e up_enable, function_state_e down_enable);

/**
* @brief  配置指定PAD是否为施密特触发
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  st_enable：1为施密特触发，0为正常触发
* @retval 无
*/
void hal_gpio_set_schmitt_trigger(io_pad_e pad, function_state_e st_enable);

/**
* @brief  配置指定PAD的驱动能力
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  strength：驱动强度，取值为0~3
* @retval 无
*/
void hal_gpio_set_driving_strength(io_pad_e pad, uint8_t strength);

/**
* @brief  配置指定PAD的电压转换速率
* @param  pad：GPIO序号，参考枚举类型gpio_pad_e
* @param  rate：驱动强度，取值为0~3
* @retval 无
*/
void hal_gpio_set_slew_rate(io_pad_e pad, pad_slew_rate_e rate);

/**
* @brief  配置AP_RSTN引脚中断
* @param  enable: 中断开关
* @param  cb_func：回调函数
* @param  trig：触发模式
* @retval 无
*/
void hal_gpio_set_ap_reset_int(bool enable, fcb_type cb_func, sys_cfg_trigger_e trig);

#endif /* __HAL_GPIO_H__ */
