/**
 * \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   LED1            HUB指示LED                                1
 *  GPIO1   USBA_A_ON       A1口使能                                  1
 *  GPIO2   POWER ON        UPD350启动时优先将此GPIO拉高              1
 *  GPIO3   PWM_8102        PWM输出，A口电压调节    
 *  GPIO4   VCONN1_EN       Emark供电输出使能CH1                      1
 *  GPIO5   QC_DM1          A1 QC，FCP等功能管脚DM    
 *  GPIO6   QC_DP1          A1 QC，FCP等功能管脚DP    
 *  GPIO7   QC_DM0          A2 QC，FCP等功能管脚DM/UART0_TX   
 *  GPIO8   QC_DP0          A2 QC，FCP等功能管脚DP/UART0_RX   
 *  GPIO9   I2C0_SCL        控制8812A 
 *  GPIO10  I2C0_SDA        控制8812A 
 *  GPIO12  VCONN2_EN       Emark供电输出使能CH2                      1
 *  GPIO13  USBA_B_ON       A2口使能                                  1
 *  GPIO14  VBUS_SOURCE_EN  SC8812A PSTOP控制                         0
 *  GPIO15  PWR_CHK         按键检测                                  0
 *  GPIO16  OCP_A           A口过流检测功能，电压低于4V进入过流，Va=ADC*3.3*6/4096   
 *  GPIO17  HUB_CTL         HUB使能                                   1
 *  GPIO18  I2C1_SCL        子卡控制I2C,SCL 
 *  GPIO19  I2C1_SDA        子卡控制I2C,SDA 
 *  GPIO20  I2C1_INT        子卡控制I2C,中断                          0
 *  GPIO21  LED5            电量LED，75-100%                          1
 *  GPIO22  LED4            电量LED，50-75%                           1
 *  GPIO28  LED3            电量LED，25-50%                           1
 *  GPIO30  LED2            电量LED，0-25%                            1
 * 
 *  CSN/CSP                 A口输出电流检测    
 */

/** \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(DRV_GPIO_2,en)

#define sys_gpio_power_check_detect()       (!drv_gpio_val_get(DRV_GPIO_15))

#define sys_gpio_power_down_detect()        sys_gpio_power_check_detect()

#define sys_gpio_vbus_source_en_get()       (0)
#define sys_gpio_vbus_source_en_set(flg)

#define sys_gpio_vbus_en_get()              drv_gpio_val_get(DRV_GPIO_14)
#if 0  /* modified by James Gan - 2019-07-09 */
#define sys_gpio_vbus_en_set(flg)           drv_gpio_val_set(DRV_GPIO_14,!(flg))
#else
#define sys_gpio_vbus_en_set(flg)
#endif /* #if 0 */

#define sys_gpio_vconn1_set(en)             drv_gpio_val_set(DRV_GPIO_4,en)
#define sys_gpio_vconn2_set(en)             drv_gpio_val_set(DRV_GPIO_12,en)
#define sys_gpio_vconn1_get()               drv_gpio_val_get(DRV_GPIO_4)
#define sys_gpio_vconn2_get()               drv_gpio_val_get(DRV_GPIO_12)


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


#if ((SYS_LED_ENABLED)&&(!SYS_SMG_DISPLAY_ENABLED))
#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;

/** LEDs field sets 0x50600000, field mask 0xAF9FFFFF */
void sys_gpio_bat_cap_led_control(u32_t bitmap);

#if 0  /* modified by James Gan - 2019-07-08, disabled Low effective */
#define sys_gpio_bat_cap_led_bitmap(led_id)  ((~((1 << ((led_id)+1)) - 1)) & ((1 << SYS_LED_NUM) - 1))
#if (5==SYS_LED_NUM)
#define sys_gpio_bat_cap_led_off() \
    do { \
        sys_gpio_bat_cap_led_control(0x1F); \
    } while(0)
#else
#define sys_gpio_bat_cap_led_off() \
    do { \
        sys_gpio_bat_cap_led_control(0xF); \
    } while(0)
#endif
#else
#define sys_gpio_bat_cap_led_bitmap(led_id)  (((1 << ((led_id)+1)) - 1) & ((1 << SYS_LED_NUM) - 1))
#define sys_gpio_bat_cap_led_off() \
    do { \
        sys_gpio_bat_cap_led_control(0); \
    } while(0)
#endif /* #if 0 */


#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(DRV_GPIO_0,FALSE)
#define sys_gpio_hub_led_on()       drv_gpio_val_set(DRV_GPIO_0,TRUE)
#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

#define SYS_USBA_VBUS_ADC_ID            (12U)

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


#define SYS_USBA_PWM_ID             (0)


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

#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_usba2_power_on_set(en)         drv_gpio_val_set(DRV_GPIO_13,en)
#define sys_gpio_usba2_power_on_get()           drv_gpio_val_get(DRV_GPIO_13)

#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)


#endif /* #ifndef __SYS_GPIO_H_ */




