/**
 *file    sys_gpio.c
 *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
 * 
 */

#include "drivers.h"
#include "libc.h"
#include "sys_gpio.h"
#include "sys_pd_hook.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口输出电流检测    
 */


void sys_gpio_init()
{
    // POWER ON PIN, high effective
    drv_gpio_val_set(DRV_GPIO_2,1);
    drv_gpio_oe_set(DRV_GPIO_2,1);
    drv_gpio_en_set(DRV_GPIO_2,1);

    // VCONN1 EN PIN, high effective
    drv_gpio_val_set(DRV_GPIO_4,0);
    drv_gpio_oe_set(DRV_GPIO_4,1);
    drv_gpio_en_set(DRV_GPIO_4,1);

    // VCONN2 EN PIN, high effective
    drv_gpio_val_set(DRV_GPIO_12,0);
    drv_gpio_oe_set(DRV_GPIO_12,1);
    drv_gpio_en_set(DRV_GPIO_12,1);

    // PSTOP PIN, low effective
    drv_gpio_val_set(DRV_GPIO_14,0);
    drv_gpio_oe_set(DRV_GPIO_14,1);
    drv_gpio_en_set(DRV_GPIO_14,1);

    // LED1 PIN, high effective
    drv_gpio_val_set(DRV_GPIO_0,0);
    drv_gpio_oe_set(DRV_GPIO_0,1);
    drv_gpio_en_set(DRV_GPIO_0,1);
    // LED2 PIN, high effective
    drv_gpio_val_set(DRV_GPIO_30,0);
    drv_gpio_oe_set(DRV_GPIO_0,1);
    drv_gpio_en_set(DRV_GPIO_30,1);
    // LED3 PIN, high effective
    drv_gpio_val_set(DRV_GPIO_28,0);
    drv_gpio_oe_set(DRV_GPIO_28,1);
    drv_gpio_en_set(DRV_GPIO_28,1);
    // LED4 PIN, high effective
    drv_gpio_val_set(DRV_GPIO_22,0);
    drv_gpio_oe_set(DRV_GPIO_22,1);
    drv_gpio_en_set(DRV_GPIO_22,1);
    // LED5 PIN, high effective
    drv_gpio_val_set(DRV_GPIO_21,0);
    drv_gpio_oe_set(DRV_GPIO_21,1);
    drv_gpio_en_set(DRV_GPIO_21,1);

    // Power check, low effective
    drv_gpio_oe_set(DRV_GPIO_15,0);
    drv_gpio_en_set(DRV_GPIO_15,1);

    // HUB control
    drv_gpio_val_set(DRV_GPIO_17,0);
    drv_gpio_oe_set(DRV_GPIO_17,1);
    drv_gpio_en_set(DRV_GPIO_17,1);

    // PWM 0 enable
    drv_gpio_en_set(DRV_GPIO_3,0);
    drv_pwm_init_set(SYS_USBA_PWM_ID,TRUE,SYS_DEF_USBA_PWM_PER);
    // enable 5V
    drv_pwm_duty_set(SYS_USBA_PWM_ID, SYS_DEF_USBA_PWM_DUTY_5V, SYS_DEF_USBA_PWM_PER);
    drv_pwm_en_set(SYS_USBA_PWM_ID, TRUE);

    // USBA1 POWER ON PIN, high effective
    drv_gpio_val_set(DRV_GPIO_1,0);
    drv_gpio_oe_set(DRV_GPIO_1,1);
    drv_gpio_en_set(DRV_GPIO_1,1);

    // USBA2 POWER ON PIN, high effective
    drv_gpio_val_set(DRV_GPIO_13,0);
    drv_gpio_oe_set(DRV_GPIO_13,1);
    drv_gpio_en_set(DRV_GPIO_13,1);

    // DM1/DP1, GPIO input for DP/DM detection
    drv_gpio_oe_set(DM1,0);
    drv_gpio_en_set(DM1,1);
    drv_gpio_oe_set(DP1,0);
    drv_gpio_en_set(DP1,1);


    drv_chip_dp0_500kohm_pull_down_set(TRUE);
    drv_chip_dp1_500kohm_pull_down_set(TRUE);
}

void sys_gpio_uart0_enable_set(bool_t en)
{
    bool_t old = drv_gpio_en_get(UART_RXD) ? FALSE : TRUE;
    if (old != en)
    {
        if (en)
        {
            drv_gpio_en_set(UART_TXD,FALSE);
            drv_gpio_pd_set(UART_TXD,FALSE);
            drv_gpio_pu_set(UART_TXD,FALSE);

            drv_gpio_en_set(UART_RXD,FALSE);
            drv_gpio_pd_set(UART_RXD,FALSE);
            drv_gpio_pu_set(UART_RXD,FALSE);

#if SYS_QUICK_CHARGE_ENABLED
            if (!usbpd_cfg_port_quick_charge_en_get())
            {
                drv_chip_dp0_dm0_short_set(FALSE);
            }
#else
            drv_chip_dp0_dm0_short_set(FALSE);
#endif /* SYS_QUICK_CHARGE_ENABLED */
        }
        else {
            drv_gpio_en_set(UART_TXD,TRUE);
            drv_gpio_oe_set(UART_TXD,FALSE);

            drv_gpio_en_set(UART_RXD,TRUE);
            drv_gpio_oe_set(UART_RXD,FALSE);

#if SYS_QUICK_CHARGE_ENABLED
            if (!usbpd_cfg_port_quick_charge_en_get())
            {
                drv_chip_dp0_dm0_short_set(TRUE);
            }
#else
            drv_chip_dp0_dm0_short_set(TRUE);
#endif /* SYS_QUICK_CHARGE_ENABLED */
        }
    }
}

void sys_gpio_uart1_enable_set(bool_t en)
{
    bool_t old = drv_gpio_en_get(SEC_UART_RXD) ? FALSE : TRUE;
    if (old != en)
    {
        if (en)
        {
            drv_gpio_en_set(SEC_UART_TXD,FALSE);
            drv_gpio_pd_set(SEC_UART_TXD,FALSE);
            drv_gpio_pu_set(SEC_UART_TXD,FALSE);

            drv_gpio_en_set(SEC_UART_RXD,FALSE);
            drv_gpio_pd_set(SEC_UART_RXD,FALSE);
            drv_gpio_pu_set(SEC_UART_RXD,FALSE);
        }
        else {
            drv_gpio_en_set(SEC_UART_TXD,TRUE);
            drv_gpio_oe_set(SEC_UART_TXD,FALSE);

            drv_gpio_en_set(SEC_UART_RXD,TRUE);
            drv_gpio_oe_set(SEC_UART_RXD,FALSE);
        }
    }
}

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

// IO map for battery capacity LEDs
const u8_t bat_cap_led_iomap[SYS_LED_NUM] = {DRV_GPIO_30,DRV_GPIO_28,DRV_GPIO_22,DRV_GPIO_21};

void sys_gpio_bat_cap_led_control(u32_t bitmap)
{
#if 1  /* modified by James Gan - 2019-07-09, for out of sequence */
    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_BAT_CAP_LED_1))
    {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_1],TRUE);
    }
    else {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_1],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_BAT_CAP_LED_2))
    {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_2],TRUE);
    }
    else {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_2],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_BAT_CAP_LED_3))
    {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_3],TRUE);
    }
    else {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_3],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_BAT_CAP_LED_4))
    {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_4],TRUE);
    }
    else {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_4],FALSE);
    }

#if (5==SYS_LED_NUM)
    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_BAT_CAP_LED_5))
    {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_5],TRUE);
    }
    else {
        drv_gpio_val_set(bat_cap_led_iomap[SYS_GPIO_BAT_CAP_LED_5],FALSE);
    }
#endif /* (5==SYS_LED_NUM) */
#else
    
#endif /* #if 1 */
}


#endif


