/**
 * \file    sys_gpio.h
 * \brief   
 * 
 * \par     Copyright (c) 2018 UWE Technologies Corp., Ltd. All Rights Reserved.
 * \author  James
 * \date    2018-03-20
 * \version 
 * 
 * \history 
 *  Date        Note
 *  2018-03-20  Original Creation
 * 
 */
 
#ifndef __SYS_GPIO_H_
#define __SYS_GPIO_H_

#include "drv_gpio.h"
#include "sys_defs.h"
#include "sys_bat_intf.h"

/** GPIO definitions for function 
 *  引脚  名称              描述                                      有效电平
 *  GPIO0   VCONN1_EN       VCONN1输出使能                              1     
 *  GPIO1   VCONN2_EN       VCONN2输出使能                              1
 *  GPIO2   NA         
 *  GPIO3   MUX_SEL1         MUX1 DP LENE 选择
 *  GPIO4   MUX_XSD1         MUX1 使能管脚                              0     
 *  GPIO5   HPD_OUT_3506     HPD 信号输出，表示有DP设备连接，然后才开始进行DP部分的协商，DP协商完成再打开DP_S1/DP_S2
 *  GPIO6   MUX_SEL2         MUX2 DP LENE 选择
 *  GPIO7   QC_DM0           c1 QC，FCP等功能管脚DM/UART0_TX   
 *  GPIO8   QC_DP0           c1 QC，FCP等功能管脚DP/UART0_RX   
 *  GPIO9   I2C0_SCL         控制8014
 *  GPIO10  I2C0_SDA         控制8014
 *  GPIO12  DP_S2            SBU控制                 
 *  GPIO13  DP_S1            SBU控制                             
 *  GPIO14  MUX_XSD2         MUX2 使能管脚   
 *  GPIO15  USB_SW           USB2.0 EN                                  1
 *  GPIO16  SBUon            SBU开关                                    1
 *  GPIO17  SBUsw            SBU切换,根据CC方向确认切换方向          
 *  GPIO18  I2C1_SCL         通信接口时钟，连子卡
 *  GPIO19  I2C1_SDA         通信接口数据，连子卡   
 *  GPIO20  INT              子卡到主机的中断                 
 *  GPIO21  SC8014_PSTOP     8014升压降压控制                           0                             
 *  GPIO22  SC8014_EN        8014 使能                                  1                          
 *  GPIO28  LED              电源指示灯                                 1                           
 *  GPIO30  USBC_ON          C口输出控制                                1                                             
 *  CSN/CSP                     
 */
/*
 *  SC8014            
 *  引脚        名称            描述    
 *  
 */


#define SYS_IO_POWER_ON         
#define SYS_IO_CHIP_EN          DRV_GPIO_22
#define SYS_IO_PSTOP_EN         DRV_GPIO_21
#define SYS_IO_POWER_CHECK

#define SYS_IO_USBC_ON          DRV_GPIO_30
#define SYS_IO_DCDC_STAT_DET    
#define SYS_IO_HPD_OUT          DRV_GPIO_5

#define SYS_IO_SBU_ON           DRV_GPIO_16
#define SYS_IO_SBU_SW           DRV_GPIO_17

#define SYS_IO_DP_S2            DRV_GPIO_12
#define SYS_IO_DP_S1            DRV_GPIO_13

#define SYS_IO_USBSW            DRV_GPIO_15

#define SYS_IO_INT              DRV_GPIO_20

#define SYS_IO_POWER_LED        DRV_GPIO_28

#define SYS_IO_I2C_SCL_SEC      DRV_GPIO_18
#define SYS_IO_I2C_SDA_SEC      DRV_GPIO_19

#define SYS_IO_MUX_SEL1         DRV_GPIO_3

#define SYS_IO_MUX_SEL2         DRV_GPIO_6

#define SYS_IO_MUX_XSD1         DRV_GPIO_4

#define SYS_IO_MUX_XSD2         DRV_GPIO_14

#define SYS_IO_SKA2P1_RET       

#define SYS_IO_QI_INT           
#define SYS_IO_UART1_TX         
#define SYS_IO_UART1_RX        
#define SYS_IO_UART1_INT       


#define SYS_IO_VCONN1_EN        DRV_GPIO_0
#define SYS_IO_VCONN2_EN        DRV_GPIO_1



#define SYS_IO_HUB_ON           
#define SYS_IO_HUB_LED          

#define SYS_IO_LED1             
#define SYS_IO_LED2             
#define SYS_IO_LED3            
#define SYS_IO_LED4            
#define SYS_IO_LED5            

#define SYS_IO_QC_PD_LED

#define SYS_IO_USBA_DC_EN      
#define SYS_IO_USBA_QC_ON       
#define SYS_IO_USB_A1_ON        
#define SYS_IO_USB_A2_ON        
#define SYS_IO_USB_A1_VBUS_ADC_ID   
#define SYS_IO_USB_A2_VBUS_ADC_ID  


#define SYS_USBA_PWM_ID
#define SYS_USBA1_VBUS_ADC_ID        //DRV_ADC_CHN_12
#define SYS_USBA2_VBUS_ADC_ID        //DRV_ADC_CHN_12

/** VBUS ADC reference voltage constant = 1/(Rdown/(Rdown+Rup))
 *  Rdown = 200KOhm, Rup = 1000KOhm
 *  Constant = 1 / (200/(200+1000)) = 6
 */
#define SYS_USBA_VBUS_ADC_CONSTANT      (6U)


#define SYS_NTC_ADC_ID                   DRV_ADC_CHN_11


/** \brief System GPIO initialization
 *
 */
void sys_gpio_init(void);

void sys_gpio_uart0_enable_set(bool_t en);
void sys_gpio_uart1_enable_set(bool_t en);

#define sys_gpio_power_on_set(en)           //drv_gpio_val_set(SYS_IO_POWER_ON,en)

#define sys_gpio_power_check_detect()       0//(!drv_gpio_val_get(SYS_IO_POWER_CHECK))

#define sys_gpio_power_down_detect()        sys_gpio_power_check_detect()

#define sys_gpio_chip_en_get()              (1)
#if 0  /* modified by James Gan - 2020-01-16 */
void sys_gpio_chip_en_set(bool_t flg);
#else
#define sys_gpio_chip_en_set(flg)
#endif /* #if 1 */

#define sys_gpio_hpd_out_detect()            (drv_gpio_val_get(SYS_IO_HPD_OUT))

#define sys_gpio_sbusw_set(flg)              drv_gpio_val_set(SYS_IO_SBU_SW,(flg))
#define sys_gpio_sbusw_get()                 (drv_gpio_val_get(SYS_IO_SBU_SW))

#define sys_gpio_sbuon_set(flg)              drv_gpio_val_set(SYS_IO_SBU_ON,(!flg))
#define sys_gpio_sbuon_get()                 (!drv_gpio_val_get(SYS_IO_SBU_ON))

#define sys_gpio_dps2_set(flg)              drv_gpio_val_set(SYS_IO_DP_S2,(!flg))
#define sys_gpio_dps2_get()                 (!drv_gpio_val_get(SYS_IO_DP_S2))

#define sys_gpio_dps1_set(flg)              drv_gpio_val_set(SYS_IO_DP_S1,(flg))
#define sys_gpio_dps1_get()                 (drv_gpio_val_get(SYS_IO_DP_S1))

#define sys_gpio_mux1_sel_set(flg)          drv_gpio_val_set(SYS_IO_MUX_SEL1,(flg))
#define sys_gpio_mux1_sel_get()             (drv_gpio_val_get(SYS_IO_MUX_SEL1))

#define sys_gpio_mux2_sel_set(flg)          drv_gpio_val_set(SYS_IO_MUX_SEL2,(flg))
#define sys_gpio_mux2_sel_get()             (drv_gpio_val_get(SYS_IO_MUX_SEL2))

#define sys_gpio_xsd1_set(flg)              drv_gpio_val_set(SYS_IO_MUX_XSD1,(!flg))
#define sys_gpio_xsd1_get()                 (!drv_gpio_val_get(SYS_IO_MUX_XSD1))

#define sys_gpio_xsd2_set(flg)              drv_gpio_val_set(SYS_IO_MUX_XSD2,(!flg))
#define sys_gpio_xsd2_get()                 (!drv_gpio_val_get(SYS_IO_MUX_XSD2))

#define sys_gpio_usb2p0_en_set(flg)          drv_gpio_val_set(SYS_IO_USBSW,(flg))
#define sys_gpio_usb2p0_en_get()             (drv_gpio_val_get(SYS_IO_USBSW))

#define sys_gpio_led_power_set(flg)          drv_gpio_val_set(SYS_IO_POWER_LED,(flg))
#define sys_gpio_led_power_get()             (drv_gpio_val_get(SYS_IO_POWER_LED))

#define sys_gpio_pstop_get()                 (!drv_gpio_val_get(SYS_IO_PSTOP_EN))
#define sys_gpio_pstop_set(flg)              drv_gpio_val_set(SYS_IO_PSTOP_EN,(!flg))

#define sys_gpio_8815_ce_get()               (drv_gpio_val_get(SYS_IO_CHIP_EN))
#define sys_gpio_8815_ce_set(flg)             drv_gpio_val_set(SYS_IO_CHIP_EN,(flg))

#define sys_gpio_vbus_en_get()              (drv_gpio_val_get(SYS_IO_USBC_ON))
#if 1  /* modified by James Gan - 2020-01-16 */
#define sys_gpio_vbus_en_set(flg)           drv_gpio_val_set(SYS_IO_USBC_ON,(flg))
#else
#define sys_gpio_vbus_en_set(flg)
#endif /* #if 1 */

         



#define sys_gpio_vconn1_set(en)             drv_gpio_val_set(SYS_IO_VCONN1_EN,(en))
#define sys_gpio_vconn2_set(en)             drv_gpio_val_set(SYS_IO_VCONN2_EN,(en))
#define sys_gpio_vconn1_get()               (drv_gpio_val_get(SYS_IO_VCONN1_EN))
#define sys_gpio_vconn2_get()               (drv_gpio_val_get(SYS_IO_VCONN2_EN))


#if SYS_HUB_ENABLED
#define sys_hub_ctrl_set(en)                drv_gpio_val_set(SYS_IO_HUB_ON,(en))
#define sys_hub_ctrl_get()                  drv_gpio_val_get(SYS_IO_HUB_ON)
#else
#define sys_hub_ctrl_set(en)
#define sys_hub_ctrl_get()                  (0)
#endif /* #if SYS_HUB_ENABLED */


#if ((SYS_LED_ENABLED)&&(!SYS_SMG_DISPLAY_ENABLED))

#define SYS_LED_IO_HIGH_EFFECTIVE           (1)
#define SYS_LED_IO_LOW_EFFECTIVE            (0)

#define sys_gpio_pd_qc_led_on()
#define sys_gpio_pd_qc_led_off()
#define sys_gpio_pd_qc_led_get()            (0)

typedef enum SYS_GPIO_BAT_CAP_LED_INDEX_e
{
    SYS_GPIO_BAT_CAP_LED_1,  // Control by C1
    SYS_GPIO_BAT_CAP_LED_2,  // Control by C1
    SYS_GPIO_BAT_CAP_LED_3,  // Control by C1
    SYS_GPIO_BAT_CAP_LED_4,  // Control by C1
    SYS_GPIO_BAT_CAP_LED_5,  // Control by C1
    SYS_GPIO_BAT_CAP_LED_INVALID
} SYS_GPIO_BAT_CAP_LED_INDEX_t;

void sys_gpio_bat_cap_led_control(u32_t bitmap);

#define sys_gpio_bat_cap_led_bitmap(led_id)  (((1 << ((led_id)+1)) - 1) & ((1 << SYS_LED_NUM) - 1))
#if SYS_LED_IO_HIGH_EFFECTIVE
#define sys_gpio_bat_cap_led_off() \
    do { \
        sys_gpio_bat_cap_led_control(0); \
    } while(0)
#else
#define sys_gpio_bat_cap_led_off() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_LED_NUM-1)); \
    } while(0)
#endif

#define sys_gpio_bat_cap_1st_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_1)); \
    } while(0)

#define sys_gpio_bat_cap_2nd_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_2)); \
    } while(0)

#define sys_gpio_bat_cap_3rd_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_3)); \
    } while(0)

#if (5==SYS_LED_NUM)
#define sys_gpio_bat_cap_4th_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_4)); \
    } while(0)

#define sys_gpio_bat_cap_full_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_5)); \
    } while(0)
#else
#define sys_gpio_bat_cap_full_led_on() \
    do { \
        sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap(SYS_GPIO_BAT_CAP_LED_4)); \
    } while(0)

#endif /* #if (5==SYS_LED_NUM) */

#if SYS_HUB_LED_ENABLED
#define sys_gpio_hub_led_off()      drv_gpio_val_set(SYS_IO_HUB_LED,SYS_LED_IO_LOW_EFFECTIVE)
#define sys_gpio_hub_led_on()       drv_gpio_val_set(SYS_IO_HUB_LED,SYS_LED_IO_HIGH_EFFECTIVE)
#else
#define sys_gpio_hub_led_off()
#define sys_gpio_hub_led_on()
#endif

/*0: off; 1: first; 2: first+second ... */
#define sys_gpio_bat_cap_led_step_on(num) \
    do { \
        if (0 < (num)) \
        { \
            sys_gpio_bat_cap_led_control(sys_gpio_bat_cap_led_bitmap((num) - 1)); \
        } else \
        { \
            sys_gpio_bat_cap_led_off(); \
        } \
    } while(0)

#else
#define sys_gpio_bat_cap_led_off()
#define sys_gpio_bat_cap_2nd_led_on()
#define sys_gpio_bat_cap_3rd_led_on()
#define sys_gpio_bat_cap_4th_led_on()
#define sys_gpio_bat_cap_full_led_on()
#define sys_gpio_bat_cap_led_step_on(num)
#define sys_gpio_hub_led_off()
#define sys_gpio_hub_led_on()
#define sys_gpio_pd_qc_led_on()
#define sys_gpio_pd_qc_led_off()
#define sys_gpio_pd_qc_led_get()            (0)
#endif

#if SYS_USBA_ENABLED

#define sys_gpio_usba_dc_on_set(en)             drv_gpio_val_set(SYS_IO_USBA_DC_EN,en)
#define sys_gpio_usba_dc_on_get()               drv_gpio_val_get(SYS_IO_USBA_DC_EN)

#define sys_gpio_usba_qc_on_set(en)             drv_gpio_val_set(SYS_IO_USBA_QC_ON,en)
#define sys_gpio_usba_qc_on_get()               drv_gpio_val_get(SYS_IO_USBA_QC_ON)

#define sys_gpio_usba1_power_on_set(en)         drv_gpio_val_set(SYS_IO_USB_A1_ON,en)
#define sys_gpio_usba1_power_on_get()           drv_gpio_val_get(SYS_IO_USB_A1_ON)

#define sys_gpio_usba1_insert_detect_get()      SAL_FIELD_GET(sys_bat_status_reg_get(),STATUS_REG,INDET2)
#define sys_gpio_usba1_insert_detect_clear()    SAL_FIELD_CLEAR(sys_bat_status_reg_get(),STATUS_REG,INDET2)

#define sys_gpio_usba1_insert_detect_pin_set() \
    do { \
        drv_gpio_oe_set(SYS_IO_USB_A1_VBUS_ADC_ID,1); \
        drv_gpio_val_set(SYS_IO_USB_A1_VBUS_ADC_ID,1); \
    } while(0)
#define sys_gpio_usba1_insert_detect_pin_clear() \
    do { \
        drv_gpio_oe_set(SYS_IO_USB_A1_VBUS_ADC_ID,0); \
    } while(0)

#define sys_gpio_usba2_power_on_set(en)         //drv_gpio_val_set(SYS_IO_USB_A2_ON,en)
#define sys_gpio_usba2_power_on_get()           0//drv_gpio_val_get(SYS_IO_USB_A2_ON)

#define sys_gpio_usba2_insert_detect_get()      SAL_FIELD_GET(sys_bat_status_reg_get(),STATUS_REG,INDET1)
#define sys_gpio_usba2_insert_detect_clear()    SAL_FIELD_CLEAR(sys_bat_status_reg_get(),STATUS_REG,INDET1)
#if 0
#define sys_gpio_usba2_insert_detect_pin_set() \
    do { \
        drv_gpio_oe_set(SYS_IO_USB_A2_VBUS_ADC_ID,1); \
        drv_gpio_val_set(SYS_IO_USB_A2_VBUS_ADC_ID,1); \
    } while(0)
#define sys_gpio_usba2_insert_detect_pin_clear() \
    do { \
        drv_gpio_oe_set(SYS_IO_USB_A2_VBUS_ADC_ID,0); \
    } while(0)
#endif
#else

#define sys_gpio_usba_dc_on_set(en)
#define sys_gpio_usba_dc_on_get()               (0)

#define sys_gpio_usba_qc_on_set(en)
#define sys_gpio_usba_qc_on_get()               (0)

#define sys_gpio_usba1_power_on_set(en)
#define sys_gpio_usba1_power_on_get()           (0)

#define sys_gpio_usba1_insert_detect_get()      (0)
#define sys_gpio_usba1_insert_detect_clear()

#define sys_gpio_usba1_insert_detect_pin_set()
#define sys_gpio_usba1_insert_detect_pin_clear()

#define sys_gpio_usba2_power_on_set(en)
#define sys_gpio_usba2_power_on_get()           (0)

#define sys_gpio_usba2_insert_detect_get()      (0)
#define sys_gpio_usba2_insert_detect_clear()

#define sys_gpio_usba2_insert_detect_pin_set()
#define sys_gpio_usba2_insert_detect_pin_clear()

#endif /* #if SYS_USBA_ENABLED */




void sys_gpio_uart0_disable();
void sys_gpio_uart0_enable(void);


#endif /* #ifndef __SYS_GPIO_H_ */




