/**
 * \file    sys_gpio.h
 * \brief   
 * 
 * \par     Copyright (c) 2022 Unicmicro Corp., Ltd. All Rights Reserved.
 * \author  James
 * \date    2022-09-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 
 *
 *  UPD350 C1口             
 *               
 *  引脚    I/O 名称            描述                            有效电平
 *  GPIO0   O   VCONN2_EN                                           1
 *  GPIO1   O   VCONN1_EN                                           1
 *  GPIO2   O   USBC_ON         C口mos开关使能（单PMOS）              1
 *  GPIO3   O   8014_EN         SC8014芯片使能                       1                            
 *  GPIO4   I   NA
 *  GPIO5   O   VBAT_DIS        VBUS泄放控制                          1  
 *  GPIO6   I   VBUSC_DEF       VBUS电压监测  分压1M/100K 
 *  GPIO7       DMC             QC，FCP等功能管脚DM/UART0_TX，C口   
 *  GPIO8       DPC             QC，FCP等功能管脚DP/UART0_RX，C口   
 *  GPIO9       I2C0_SCL        控制8815A 
 *  GPIO10      I2C0_SDA        控制8815A 
 *  GPIO12      NA        	
 *  GPIO13      NA       	       
 *  GPIO21  O   8014_PSTO                                             1              
 *  CSN/CSP                       
 *                  
 *  SC8014             
 *  引脚        名称            描述  
 *
 */
void sys_gpio_init(void);




#define SYS_IO_VCONN1_EN     DRV_GPIO_9
#define SYS_IO_VCONN2_EN     DRV_GPIO_10



//#define SYS_IO_VCONN1_EN    DRV_GPIO_1
//#define SYS_IO_VCONN2_EN    DRV_GPIO_0
#define SYS_IO_POWER_ON     //DRV_GPIO_2
#define SYS_IO_DMC            DRV_GPIO_7
#define SYS_IO_DPC            DRV_GPIO_8
//#define SYS_IO_I2C0_SCL     DRV_GPIO_9
//#define SYS_IO_I2C0_SDA     DRV_GPIO_10
#define SYS_IO_UART_RXD     
#define SYS_IO_UART_TXD

#define SYS_IO_VBUSC_DIS     DRV_GPIO_3

#define SYS_IO_VBUSC_DEF      DRV_GPIO_16


#define SYS_IO_VBAT_DEF     //DRV_GPIO_5

#define SYS_IO_I2C1_SCL       DRV_GPIO_18
#define SYS_IO_I2C1_SDA       DRV_GPIO_19

#define SYS_IO_LED1         //DRV_GPIO_21
#define SYS_IO_LED2         //DRV_GPIO_20
#define SYS_IO_LED3         //DRV_GPIO_22
#define SYS_IO_LED4         //DRV_GPIO_17
#define SYS_IO_LED5         //DRV_GPIO_16

#define SYS_IO_INTn         //DRV_GPIO_30
#define SYS_IO_PMIC_PSOTP   //DRV_GPIO_21
#define SYS_IO_PMIC_EN     // DRV_GPIO_3
#define SYS_IO_KEY          //DRV_GPIO_28
#define SYS_IO_USBC_ON      DRV_GPIO_21

#define SYS_USBC_VBUS_ADC_ID                DRV_ADC_CHN_12


#define SYS_USBC_VBAT_ADC_ID               // DRV_ADC_CHN_12  //
/** VBUS ADC reference voltage constant = 1/(Rdown/(Rdown+Rup))
 *  Rdown = 100KOhm, Rup = 1000KOhm
 *  Constant = 1 / (100/(100+1000)) = 11
 */
#define SYS_USBC_VBUS_ADC_CONSTANT          (11U)

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

#define sys_gpio_power_down_detect()        sys_gpio_power_check_detect()

#define sys_gpio_vbus_en_get()              drv_gpio_val_get(SYS_IO_USBC_ON)
#define sys_gpio_vbus_en_set(flg)           drv_gpio_val_set(SYS_IO_USBC_ON,flg)

#define sys_gpio_vbus_discharge_en_get()              drv_gpio_val_get(SYS_IO_VBUSC_DIS)
#define sys_gpio_vbus_discharge_en_set(flg)           drv_gpio_val_set(SYS_IO_VBUSC_DIS,flg)

#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)
#else
#define sys_gpio_vconn1_set(en)             
#define sys_gpio_vconn2_set(en)             
#define sys_gpio_vconn1_get()               0
#define sys_gpio_vconn2_get()               0
#endif
#define sys_gpio_pmic_pstop_set(en)
#define sys_gpio_pmic_pstop_get()             0

#define sys_gpio_pmic_ce_set(en)            drv_gpio_val_set(SYS_IO_PMIC_EN,en)
#define sys_gpio_pmic_ce_get()              drv_gpio_val_get(SYS_IO_PMIC_EN)


#define sys_gpio_mcu_i2c_int                //SYS_IO_INTn

#if SYS_HUB_ENABLED  /* modified by James Gan - 2019-11-22 */
#define sys_hub_ctrl_set(en)
#define sys_hub_ctrl_get()                  (0)
#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_gpio_pd_qc_led_on()             drv_gpio_val_set(DRV_GPIO_5,1)
#define sys_gpio_pd_qc_led_off()            drv_gpio_val_set(DRV_GPIO_5,0)
#define sys_gpio_pd_qc_led_get()            drv_gpio_val_get(DRV_GPIO_5)

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

#if SYS_USBA_ENABLED
#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      (6)



#define SYS_USBA_PWM_ID                 (DRV_PWM_CHN_3)

// USB-A1 should be always on
#define sys_gpio_usba1_power_on_set(en)         //drv_gpio_val_set(DRV_GPIO_3,en)
#define sys_gpio_usba1_power_on_get()           0//drv_gpio_val_get(DRV_GPIO_3)

#define sys_gpio_usba1_volt_check_en(en)        //drv_gpio_oe_set(DRV_GPIO_12,!(en));

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

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

#define sys_gpio_usba2_volt_check_en(en)        //drv_gpio_oe_set(DRV_GPIO_5,!(en));

#define sys_gpio_usba2_insert_detect_get()      SAL_FIELD_GET(sys_bat_status_reg_get(),STATUS_REG,NDET)
#define sys_gpio_usba2_insert_detect_clear()    SAL_FIELD_CLEAR(sys_bat_status_reg_get(),STATUS_REG,NDET)

#define sys_gpio_usba_dc_enble_set(flg)         // drv_gpio_val_set(DRV_GPIO_6,flg)
#define sys_gpio_usba_dc_enble_get()            0// drv_gpio_val_get(DRV_GPIO_6)

#define sys_gpio_usba2_qc_enble_set(flg)        //drv_gpio_val_set(DRV_GPIO_5,flg) 
#define sys_gpio_usba2_qc_enble_get()          0 //drv_gpio_val_get(DRV_GPIO_5)

#define sys_gpio_usba_c2_enble_set(flg)          //drv_gpio_val_set(DRV_GPIO_1,flg)
#define sys_gpio_usba_c2_enble_get()             0//drv_gpio_val_get(DRV_GPIO_1)
#else
#define SYS_USBA1_VBUS_ADC_ID           
#define SYS_USBA2_VBUS_ADC_ID           

/** VBUS ADC reference voltage constant = 1/(Rdown/(Rdown+Rup))
 *  Rdown = 6.8KOhm, Rup = 100KOhm
 *  Constant = 1 / (6.8/(6.8+100)) = 15.7
 */
#define SYS_USBA_VBUS_ADC_CONSTANT      (15.7)



#define SYS_USBA_PWM_ID                 

// USB-A1 should be always on
#define sys_gpio_usba1_power_on_set(en)         
#define sys_gpio_usba1_power_on_get()           0           

#define sys_gpio_usba1_volt_check_en(en)        

#define sys_gpio_usba1_insert_detect_get()      0      
#define sys_gpio_usba1_insert_detect_clear()    

#define sys_gpio_usba2_power_on_set(en)         
#define sys_gpio_usba2_power_on_get()           0           
#define sys_gpio_usba2_volt_check_en(en)        
#define sys_gpio_usba2_insert_detect_get()      0
#define sys_gpio_usba2_insert_detect_clear()    

#define sys_gpio_usba_dc_enble_set(flg)         
#define sys_gpio_usba_dc_enble_get()            0

#define sys_gpio_usba2_qc_enble_set(flg)       
#define sys_gpio_usba2_qc_enble_get()           0

#define sys_gpio_usba_c2_enble_set(flg)          
#define sys_gpio_usba_c2_enble_get()            0



#endif
void sys_gpio_uart0_disable(void);
void sys_gpio_uart0_enable(void);

#endif /* #ifndef __SYS_GPIO_H_ */




