/**
 *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"
#include "sys_config.h"

/** GPIO definitions for function 
 *  引脚  名称              描述                                      有效电平
 *  GPIO0   LED8            输出，1有效
 *  GPIO1   LED9            输出，1有效
 *  GPIO2   LED10           输出，1有效
 *  GPIO3   NA              外部直接接地，初始化不可输出1
 *  GPIO4   NA              外部直接接地，初始化不可输出1
 *  GPIO5   NA              外部直接接地，初始化不可输出1
 *  GPIO6   VBUSC_DET       C口电压检测，分压电阻100M/6.8K
 *  GPIO7   UART0           UART0_TX   
 *  GPIO8   UART0           UART0_RX   
 *  GPIO9   LED6            PPS1电压指示
 *  GPIO10  LED7            PD 20V电压指示
 *  GPIO12  NA              外部直接接地，初始化不可输出1
 *  GPIO13  NA              外部直接接地，初始化不可输出1
 *  GPIO14  NA              外部直接接地，初始化不可输出1
 *  GPIO15  NA              外部直接接地，初始化不可输出1
 *  GPIO16  LED11           PD 5V电压指示
 *  GPIO17  NA
 *  GPIO18  LED1            输出，1有效
 *  GPIO19  LED2            输出，1有效
 *  GPIO20  LED3            输出，1有效
 *  GPIO21  LED5            输出，1有效
 *  GPIO22  LED4            输出，1有效
 *  GPIO28  NA     
 *  GPIO30  SNK_REQUEST     按键检测，用来切换电压
 * 
 *  CSN/CSP                 电流检测    
 */

void sys_gpio_init()
{
    // clean default pull-down PINs
    DRV_REG_SET(GPIO_PD_REG, 0);
    // configure all pin to input mode
    DRV_REG_SET(GPIO_DDR_REG, 0);
    // enable uart
    DRV_REG_SET(GPIO_EN_REG, 0xFFFFFE7F);
    // No need to configure UART0, TXD/RXD, GPIO7/8

    // VBUS DET 
    drv_gpio_oe_set(DRV_GPIO_6,0);
    drv_gpio_en_set(DRV_GPIO_6,1);

#if SYS_GPIO_ENABLED
    // LED8
    drv_gpio_val_set(DRV_GPIO_0,0);
    drv_gpio_oe_set(DRV_GPIO_0,1);
    drv_gpio_en_set(DRV_GPIO_0,1);

    // LED9
    drv_gpio_val_set(DRV_GPIO_1,0);
    drv_gpio_oe_set(DRV_GPIO_1,1);
    drv_gpio_en_set(DRV_GPIO_1,1);

    // LED10
    drv_gpio_val_set(DRV_GPIO_2,0);
    drv_gpio_oe_set(DRV_GPIO_2,1);
    drv_gpio_en_set(DRV_GPIO_2,1);

    // LED6
    drv_gpio_val_set(DRV_GPIO_9,0);
    drv_gpio_oe_set(DRV_GPIO_9,1);
    drv_gpio_en_set(DRV_GPIO_9,1);

    // LED7
    drv_gpio_val_set(DRV_GPIO_10,0);
    drv_gpio_oe_set(DRV_GPIO_10,1);
    drv_gpio_en_set(DRV_GPIO_10,1);

    // LED11
    drv_gpio_val_set(DRV_GPIO_16,0);
    drv_gpio_oe_set(DRV_GPIO_16,1);
    drv_gpio_en_set(DRV_GPIO_16,1);

#if (!I2C_MODULE_ENABLED)
    // LED1
    drv_gpio_val_set(DRV_GPIO_18,0);
    drv_gpio_oe_set(DRV_GPIO_18,1);
    drv_gpio_en_set(DRV_GPIO_18,1);

    // LED 2
    drv_gpio_val_set(DRV_GPIO_19,0);
    drv_gpio_oe_set(DRV_GPIO_19,1);
    drv_gpio_en_set(DRV_GPIO_19,1);
#endif

    // LED 3
    drv_gpio_val_set(DRV_GPIO_20,0);
    drv_gpio_oe_set(DRV_GPIO_20,1);
    drv_gpio_en_set(DRV_GPIO_20,1);

    // LED 5
    drv_gpio_val_set(DRV_GPIO_21,0);
    drv_gpio_oe_set(DRV_GPIO_21,1);
    drv_gpio_en_set(DRV_GPIO_21,1);

    // LED 4
    drv_gpio_val_set(DRV_GPIO_22,0);
    drv_gpio_oe_set(DRV_GPIO_22,1);
    drv_gpio_en_set(DRV_GPIO_22,1);

    // SNK_REQUEST
    drv_gpio_oe_set(DRV_GPIO_30,0);
    drv_gpio_en_set(DRV_GPIO_30,1);
#endif

    //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)
            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)
            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 source capacity LEDs
const u8_t src_cap_led_iomap[SYS_LED_NUM] = {
    DRV_GPIO_16,
    DRV_GPIO_2,
    DRV_GPIO_1,
    DRV_GPIO_0,
    DRV_GPIO_10,
    DRV_GPIO_9,
    DRV_GPIO_21,
    DRV_GPIO_22,
    DRV_GPIO_20,
    DRV_GPIO_19,
    DRV_GPIO_18
};

void sys_gpio_src_cap_led_control(u32_t bitmap)
{
    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_1))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_1],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_1],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_2))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_2],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_2],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_3))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_3],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_3],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_4))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_4],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_4],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_5))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_5],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_5],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_6))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_6],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_6],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_7))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_7],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_7],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_8))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_8],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_8],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_9))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_9],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_9],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_10))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_10],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_10],FALSE);
    }

    if (SAL_IS_BIT_SET(bitmap,SYS_GPIO_SRC_CAP_LED_11))
    {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_11],TRUE);
    }
    else {
        drv_gpio_val_set(src_cap_led_iomap[SYS_GPIO_SRC_CAP_LED_11],FALSE);
    }
}


#endif


