Add mbtk/liblynq_lib_v2/ mbtk/libql_lib_v2/

Change-Id: Idbb802cd805b34603ccf65bff9818725a6955e51
diff --git a/mbtk/libql_lib_v2/src/ql_gpio.c b/mbtk/libql_lib_v2/src/ql_gpio.c
new file mode 100755
index 0000000..9be2026
--- /dev/null
+++ b/mbtk/libql_lib_v2/src/ql_gpio.c
@@ -0,0 +1,741 @@
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <fcntl.h>
+
+#include "mbtk_log.h"
+#include "mbtk_utils.h"
+#include "ql/ql_gpio.h"
+
+typedef struct {
+    int pin;
+    int gpio;
+} pin_gpio_mmap_s;
+
+#ifdef MBTK_PROJECT_L508
+static pin_gpio_mmap_s pin_gpio_mmap[] = {
+    {PINNAME_GPIO1, -1},            /*PIN-1*/
+    {PINNAME_GPIO2, -1},             /*PIN-2*/
+    {PINNAME_GPIO3, -1},             /*PIN-3*/
+    {PINNAME_GPIO4, -1},             /*PIN-4*/
+    {PINNAME_GPIO5, -1},             /*PIN-5*/
+    {PINNAME_NET_STATUS, -1},        /*PIN-6*/
+    {PINNAME_DBG_RXD, -1},          /*PIN-11*/
+    {PINNAME_DBG_TXD, -1},          /*PIN-12*/
+    {PINNAME_USIM_PRESENCE, 19},    /*PIN-13*/
+    {PINNAME_SD_INT_DET, -1},       /*PIN-23*/
+    {PINNAME_PCM_IN, 28},           /*PIN-24*/
+    {PINNAME_PCM_OUT, 27},          /*PIN-25*/
+    {PINNAME_PCM_SYNC, -1},         /*PIN-26*/
+    {PINNAME_PCM_CLK, -1},          /*PIN-27*/
+    {PINNAME_SDC2_DATA3, 21},       /*PIN-28*/
+    {PINNAME_SDC2_DATA2, -1},       /*PIN-29*/
+    {PINNAME_SDC2_DATA1, 4},       /*PIN-30*/
+    {PINNAME_SDC2_DATA0, -1},       /*PIN-31*/
+    {PINNAME_SDC2_CLK, -1},         /*PIN-32*/
+    {PINNAME_SDC2_CMD, -1},         /*PIN-33*/
+    {PINNAME_SPI_CS_N, -1},         /*PIN-37*/
+    {PINNAME_SPI_MOSI, -1},         /*PIN-38*/
+    {PINNAME_SPI_MISO, -1},         /*PIN-39*/
+    {PINNAME_SPI_CLK, -1},          /*PIN-40*/
+    {PINNAME_I2C_SCL, -1},          /*PIN-41*/
+    {PINNAME_I2C_SDA, -1},          /*PIN-42*/
+    {PINNAME_GPIO20, 20},           /*PIN-45*/
+    {PINNAME_STATUS, 13},           /*PIN-49*/
+    {PINNAME_NETLIGHT, 14},         /*PIN-51*/
+    {PINNAME_GPIO6, -1},            /*PIN-62*/
+    {PINNAME_DCD, -1},              /*PIN-63*/
+    {PINNAME_DTR, -1},              /*PIN-66*/
+    {PINNAME_MAIN_CTS, -1},         /*PIN-64*/
+    {PINNAME_MAIN_RTS, -1},         /*PIN-65*/
+    {PINNAME_MAIN_TXD, -1},         /*PIN-67*/
+    {PINNAME_MAIN_RXD, -1},         /*PIN-68*/
+    {PINNAME_RMII_RXD1, -1},        /*PIN-73*/
+    {PINNAME_RMII_RXCL, -1},        /*PIN-74*/
+    {PINNAME_RMII_CLK, 3},         /*PIN-75*/
+    {PINNAME_RMII_RXD0, 1},        /*PIN-76*/
+    {PINNAME_RMII_TXD0, -1},        /*PIN-77*/
+    {PINNAME_RMII_TXD1, -1},        /*PIN-78*/
+    {PINNAME_RMII_RXD2, -1},        /*PIN-79*/
+    {PINNAME_RMII_TXD2, -1},        /*PIN-80*/
+    {PINNAME_RMII_TX_CTRL, -1},     /*PIN-81*/
+    {PINNAME_RMII_RXD3, -1},        /*PIN-82*/
+    {PINNAME_RMII_TXCL, -1},        /*PIN-83*/
+    {PINNAME_RMII_TXD3, 5},        /*PIN-84*/
+    {PINNAME_WLAN_SLP_CLK, -1},    /*PIN-118*/
+    {PINNAME_RMII_RST, 20},        /*PIN-119*/
+    {PINNAME_RMII_INT, -1},        /*PIN-120*/
+    {PINNAME_RMII_MDIO, 17},       /*PIN-121*/
+    {PINNAME_RMII_MDC, 16},        /*PIN-122*/
+    {PINNAME_PRI_TDI, 117},        /*PIN-123*/
+    {PINNAME_WLAN_PER_EN, 24},     /*PIN-127*/
+    {PINNAME_WLAN_WAKE, 21},       /*PIN-135*/
+    {PINNAME_WLAN_EN, 22},         /*PIN-136*/
+    {PINNAME_GPIO8, -1},            /*PIN-139*/
+};
+#else
+static pin_gpio_mmap_s pin_gpio_mmap[] = {
+    {PINNAME_GPIO1, -1},            /*PIN-1*/
+    {PINNAME_GPIO2, -1},             /*PIN-2*/
+    {PINNAME_GPIO3, -1},             /*PIN-3*/
+    {PINNAME_GPIO4, -1},             /*PIN-4*/
+    {PINNAME_GPIO5, -1},             /*PIN-5*/
+    {PINNAME_NET_STATUS, -1},        /*PIN-6*/
+    {PINNAME_DBG_RXD, -1},          /*PIN-11*/
+    {PINNAME_DBG_TXD, -1},          /*PIN-12*/
+    {PINNAME_USIM_PRESENCE, 19},    /*PIN-13*/
+    {PINNAME_SD_INT_DET, -1},       /*PIN-23*/
+    {PINNAME_PCM_IN, 28},           /*PIN-24*/
+    {PINNAME_PCM_OUT, 27},          /*PIN-25*/
+    {PINNAME_PCM_SYNC, -1},         /*PIN-26*/
+    {PINNAME_PCM_CLK, -1},          /*PIN-27*/
+    {PINNAME_SDC2_DATA3, 21},       /*PIN-28*/
+    {PINNAME_SDC2_DATA2, -1},       /*PIN-29*/
+    {PINNAME_SDC2_DATA1, 4},       /*PIN-30*/
+    {PINNAME_SDC2_DATA0, -1},       /*PIN-31*/
+    {PINNAME_SDC2_CLK, -1},         /*PIN-32*/
+    {PINNAME_SDC2_CMD, -1},         /*PIN-33*/
+    {PINNAME_SPI_CS_N, -1},         /*PIN-37*/
+    {PINNAME_SPI_MOSI, -1},         /*PIN-38*/
+    {PINNAME_SPI_MISO, -1},         /*PIN-39*/
+    {PINNAME_SPI_CLK, -1},          /*PIN-40*/
+    {PINNAME_I2C_SCL, -1},          /*PIN-41*/
+    {PINNAME_I2C_SDA, -1},          /*PIN-42*/
+    {PINNAME_GPIO20, 20},           /*PIN-45*/
+    {PINNAME_STATUS, 13},           /*PIN-49*/
+    {PINNAME_NETLIGHT, 14},         /*PIN-51*/
+    {PINNAME_GPIO6, -1},            /*PIN-62*/
+    {PINNAME_DCD, -1},              /*PIN-63*/
+    {PINNAME_DTR, -1},              /*PIN-66*/
+    {PINNAME_MAIN_CTS, -1},         /*PIN-64*/
+    {PINNAME_MAIN_RTS, -1},         /*PIN-65*/
+    {PINNAME_MAIN_TXD, -1},         /*PIN-67*/
+    {PINNAME_MAIN_RXD, -1},         /*PIN-68*/
+    {PINNAME_RMII_RXD1, -1},        /*PIN-73*/
+    {PINNAME_RMII_RXCL, -1},        /*PIN-74*/
+    {PINNAME_RMII_CLK, 3},         /*PIN-75*/
+    {PINNAME_RMII_RXD0, 1},        /*PIN-76*/
+    {PINNAME_RMII_TXD0, -1},        /*PIN-77*/
+    {PINNAME_RMII_TXD1, -1},        /*PIN-78*/
+    {PINNAME_RMII_RXD2, -1},        /*PIN-79*/
+    {PINNAME_RMII_TXD2, -1},        /*PIN-80*/
+    {PINNAME_RMII_TX_CTRL, -1},     /*PIN-81*/
+    {PINNAME_RMII_RXD3, -1},        /*PIN-82*/
+    {PINNAME_RMII_TXCL, -1},        /*PIN-83*/
+    {PINNAME_RMII_TXD3, 5},        /*PIN-84*/
+    {PINNAME_WLAN_SLP_CLK, -1},    /*PIN-118*/
+    {PINNAME_RMII_RST, 20},        /*PIN-119*/
+    {PINNAME_RMII_INT, -1},        /*PIN-120*/
+    {PINNAME_RMII_MDIO, 17},       /*PIN-121*/
+    {PINNAME_RMII_MDC, 16},        /*PIN-122*/
+    {PINNAME_PRI_TDI, 117},        /*PIN-123*/
+    {PINNAME_WLAN_PER_EN, 24},     /*PIN-127*/
+    {PINNAME_WLAN_WAKE, 21},       /*PIN-135*/
+    {PINNAME_WLAN_EN, 22},         /*PIN-136*/
+    {PINNAME_GPIO8, -1},            /*PIN-139*/
+};
+
+#endif
+
+static int gpio_export(int gpio)
+{
+    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+
+    char buffer[50];
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK) == 0)
+    {
+        LOGD("%d has export.", gpio);
+        return 0;
+    }
+
+    file = open("/sys/class/gpio/export",O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio export file fail.");
+        return -1;
+    }
+
+    memset(pin_index_buffer,0,5);
+    sprintf(pin_index_buffer,"%d", gpio);
+    result = write(file,pin_index_buffer,strlen(pin_index_buffer));
+    if(result < 0)
+    {
+        LOGE("Gpio[%d] export fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_unexport(int gpio)
+{
+    int index=0;
+    int file=-1;
+    int result =-1;
+    char pin_index_buffer[5]= {0};
+    char buffer[50];
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK) == -1)
+    {
+        LOGD("%d not export.", gpio);
+        return 0;
+    }
+
+    file = open("/sys/class/gpio/unexport",O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio unexport file fail.");
+        return -1;
+    }
+
+    memset(pin_index_buffer,0,5);
+    sprintf(pin_index_buffer,"%d", gpio);
+    result=write(file,pin_index_buffer,strlen(pin_index_buffer));
+    if(result < 0)
+    {
+        close(file);
+        LOGE("Gpio[%d] unexport fail.", gpio);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_direct_get(int gpio, char *value, int value_size)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_RDONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    memset(value, 0x0, value_size);
+    result = read(file,value,value_size);
+    if(result <= 0)
+    {
+        LOGE("Get gpio[%d] direct fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+
+static int gpio_direct_set(int gpio, char *value)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    file = open(buffer, O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    result = write(file,value,strlen(value));
+    if(result != strlen(value))
+    {
+        LOGE("Set gpio[%d] direct fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int gpio_value_get(int gpio)
+{
+    char buffer[50];
+    char path[10];
+    int file =-1;
+    int result =-1;
+    int value;
+
+    memset(path,0,50);
+    memset(buffer,0,10);
+    sprintf(path,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(path,O_RDONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] fail.", gpio);
+        return -1;
+    }
+    result = read(file,buffer,5);
+    if(result <= 0)
+    {
+        LOGE("Get gpio[%d] value fail", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+    value = atoi(buffer);
+    return value;
+}
+
+static int gpio_value_set(int gpio, int value)
+{
+    char buffer[50]= {0};
+    int file =-1;
+    int result =-1;
+
+    memset(buffer,0,50);
+    sprintf(buffer,"/sys/class/gpio/gpio%d/value", gpio);
+    file = open(buffer,O_WRONLY);
+    if(file == -1)
+    {
+        LOGE("Open gpio[%d] value fail.", gpio);
+        return -1;
+    }
+    if(value == 0) {
+        result = write(file,"0",1);
+    } else {
+        result = write(file,"1",1);
+    }
+    if(result != 1)
+    {
+        LOGE("Set gpio[%d] value fail.", gpio);
+        close(file);
+        return -1;
+    }
+    close(file);
+
+    return 0;
+}
+
+static int pin_2_gpio(Enum_PinName       pin_name)
+{
+#if 0
+    switch(pin_name){
+        case PINNAME_USIM_PRESENCE:    /*PIN-13*/
+            return 19;
+        case PINNAME_PCM_IN:           /*PIN-24*/
+            return 28;
+        case PINNAME_PCM_OUT:          /*PIN-25*/
+            return 27;
+        case PINNAME_RMII_CLK:         /*PIN-75*/
+            return 3;
+        case PINNAME_RMII_RXD0:        /*PIN-76*/
+            return 1;
+        case PINNAME_RMII_RST:          /*PIN-119*/
+            return 20;
+        case PINNAME_RMII_MDIO:         /*PIN-121*/
+            return 17;
+        case PINNAME_RMII_MDC:          /*PIN-122*/
+            return 16;
+        case PINNAME_WLAN_PER_EN:       /*PIN-127*/
+            return 24;
+        case PINNAME_WLAN_WAKE:         /*PIN-135*/
+            return 21;
+        case PINNAME_WLAN_EN:           /*PIN-136*/
+            return 22;
+
+        // Unknown PIN.
+        case PINNAME_GPIO1:             /*PIN-1*/
+        case PINNAME_GPIO2:             /*PIN-2*/
+        case PINNAME_GPIO3:             /*PIN-3*/
+        case PINNAME_GPIO4:             /*PIN-4*/
+        case PINNAME_GPIO5:             /*PIN-5*/
+        case PINNAME_NET_STATUS:        /*PIN-6*/
+        case PINNAME_DBG_RXD:           /*PIN-11*/
+        case PINNAME_DBG_TXD:          /*PIN-12*/
+        case PINNAME_SD_INT_DET:       /*PIN-23*/
+        case PINNAME_PCM_SYNC:         /*PIN-26*/
+        case PINNAME_PCM_CLK:          /*PIN-27*/
+        case PINNAME_SDC2_DATA3:       /*PIN-28*/
+        case PINNAME_SDC2_DATA2:       /*PIN-29*/
+        case PINNAME_SDC2_DATA1:       /*PIN-30*/
+        case PINNAME_SDC2_DATA0:       /*PIN-31*/
+        case PINNAME_SDC2_CLK:         /*PIN-32*/
+        case PINNAME_SDC2_CMD:         /*PIN-33*/
+        case PINNAME_SPI_CS_N:         /*PIN-37*/
+        case PINNAME_SPI_MOSI:         /*PIN-38*/
+        case PINNAME_SPI_MISO:         /*PIN-39*/
+        case PINNAME_SPI_CLK:          /*PIN-40*/
+        case PINNAME_I2C_SCL:          /*PIN-41*/
+        case PINNAME_I2C_SDA:          /*PIN-42*/
+        case PINNAME_GPIO6:            /*PIN-62*/
+        case PINNAME_DCD:              /*PIN-63*/
+        case PINNAME_DTR:              /*PIN-66*/
+        case PINNAME_MAIN_CTS:         /*PIN-64*/
+        case PINNAME_MAIN_RTS:         /*PIN-65*/
+        case PINNAME_MAIN_TXD:         /*PIN-67*/
+        case PINNAME_MAIN_RXD:         /*PIN-68*/
+        case PINNAME_RMII_RXD1:        /*PIN-73*/
+        case PINNAME_RMII_RXCL:        /*PIN-74*/
+        case PINNAME_RMII_TXD0:        /*PIN-77*/
+        case PINNAME_RMII_TXD1:        /*PIN-78*/
+        case PINNAME_RMII_RXD2:        /*PIN-79*/
+        case PINNAME_RMII_TXD2:        /*PIN-80*/
+        case PINNAME_RMII_TX_CTRL:     /*PIN-81*/
+        case PINNAME_RMII_RXD3:        /*PIN-82*/
+        case PINNAME_RMII_TXCL:        /*PIN-83*/
+        case PINNAME_RMII_TXD3:        /*PIN-84*/
+        case PINNAME_WLAN_SLP_CLK:      /*PIN-118*/
+        case PINNAME_RMII_INT:          /*PIN-120*/
+        case PINNAME_GPIO8:             /*PIN-139*/
+        default:
+            LOGE("Unknown PIN : %d", pin_name);
+            return -1;
+    }
+#else
+    int i = 0;
+    while(i < ARRAY_SIZE(pin_gpio_mmap)) {
+        if(pin_name == pin_gpio_mmap[i].pin) {
+            return pin_gpio_mmap[i].gpio;
+        }
+        i++;
+    }
+
+    LOGE("No found PIN : %d", pin_name);
+    return -1;
+#endif
+}
+
+
+/*****************************************************************
+* Function:     Ql_GPIO_Init
+*
+* Description:
+*               This function enables the GPIO function of the specified pin,
+*               and initialize the configurations, including direction,
+*               level and pull selection.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+*               dir:
+*                   The initial direction of GPIO, one value of Enum_PinDirection.
+*               level:
+*                   The initial level of GPIO, one value of Enum_PinLevel.
+*               pull_sel:
+*                   Pull selection, one value of Enum_PinPullSel.
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_Init(Enum_PinName       pin_name,
+                 Enum_PinDirection  dir,
+                 Enum_PinLevel      level,
+                 Enum_PinPullSel    pull_sel
+                 )
+{
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    if(gpio_export(gpio))
+    {
+        LOGE("gpio_export() fail.");
+        return RES_IO_ERROR;
+    }
+
+    if(gpio_direct_set(gpio, dir == PINDIRECTION_IN ? "in" : "out"))
+    {
+        LOGE("gpio_direct_set() fail.");
+        return RES_IO_ERROR;
+    }
+
+    if(dir == PINDIRECTION_OUT){
+        if(gpio_value_set(gpio, level))
+        {
+            LOGE("gpio_value_set() fail.");
+            return RES_IO_ERROR;
+        }
+    }
+    // No support pull mode now.
+
+    return RES_OK;
+}
+
+/*****************************************************************
+* Function:     Ql_GPIO_Base_Init
+*
+* Description:
+*               This function enables the GPIO function of the specified pin.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+*
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*****************************************************************/
+int Ql_GPIO_Base_Init(Enum_PinName pin_name );
+
+/*****************************************************************
+* Function:     Ql_GPIO_SetLevel
+*
+* Description:
+*               This function sets the level of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+*               level:
+*                   The initial level of GPIO, one value of Enum_PinLevel.
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_SetLevel(Enum_PinName pin_name, Enum_PinLevel level)
+{
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    if(gpio_value_set(gpio, level)) {
+        LOGE("gpio_value_set() fail.");
+        return RES_IO_ERROR;
+    } else {
+        return RES_OK;
+    }
+}
+
+/*****************************************************************
+* Function:     Ql_GPIO_GetLevel
+*
+* Description:
+*               This function gets the level of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+* Return:
+*               The level value of the specified GPIO, which is
+*               nonnegative integer.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*****************************************************************/
+int Ql_GPIO_GetLevel(Enum_PinName pin_name)
+{
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    return gpio_value_get(gpio);
+}
+
+/*****************************************************************
+* Function:     Ql_GPIO_SetDirection
+*
+* Description:
+*               This function sets the direction of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+*               dir:
+*                   The initial direction of GPIO, one value of Enum_PinDirection.
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_SetDirection(Enum_PinName pin_name, Enum_PinDirection dir)
+{
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    if(gpio_direct_set(gpio, dir == PINDIRECTION_IN ? "in" : "out")) {
+        LOGE("gpio_direct_set() fail.");
+        return RES_IO_ERROR;
+    } else {
+        return RES_OK;
+    }
+}
+
+/*****************************************************************
+* Function:     Ql_GPIO_GetDirection
+*
+* Description:
+*               This function gets the direction of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+* Return:
+*               0  INPUT
+*               1  OUTPUT
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_GetDirection(Enum_PinName pin_name)
+{
+    char buff[10];
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    if(gpio_direct_get(gpio, buff, 10)) {
+        LOGE("gpio_direct_get() fail.");
+        return RES_IO_NOT_SUPPORT;
+    } else {
+        if(strncmp(buff, "in",2) == 0) {
+            return PINDIRECTION_IN;
+        } else if(strncmp(buff, "out",3) == 0) {
+            return PINDIRECTION_OUT;
+        } else {
+            return RES_IO_NOT_SUPPORT;
+        }
+    }
+}
+
+/*****************************************************************
+* Function:     Ql_GPIO_SetPullSelection
+*
+* Description:
+*               This function sets the pull selection of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+*               Enum_PinPullSel:
+*                   Pull selection, one value of Enum_PinPullSel.
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_SetPullSelection(Enum_PinName pin_name, Enum_PinPullSel pull_sel);
+
+/*****************************************************************
+* Function:     ql_gpio_get_pull_selection
+*
+* Description:
+*               This function gets the pull selection of the specified GPIO.
+*
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+* Return:
+*               0<<13   no pull
+*               5<<13   pull down
+*               6<<13   pull up
+*****************************************************************/
+int Ql_GPIO_GetPullSelection(Enum_PinName pin_name);
+
+
+/*****************************************************************
+* Function:     Ql_GPIO_Uninit
+*
+* Description:
+*               This function releases the specified GPIO that was
+*               initialized by calling Ql_GPIO_Init() previously.
+*               After releasing, the GPIO can be used for other purpose.
+* Parameters:
+*               pin_name:
+*                   Pin name, one value of Enum_PinName.
+* Return:
+*               RES_OK, this function succeeds.
+*               RES_IO_NOT_SUPPORT, the input GPIO is invalid.
+*               RES_IO_ERR, the function failed
+*               other place. For example this GPIO has been using as EINT.
+*****************************************************************/
+int Ql_GPIO_Uninit(Enum_PinName pin_name)
+{
+    int gpio = pin_2_gpio(pin_name);
+    if(gpio == -1) {
+        return RES_IO_ERROR;
+    }
+    LOGD("PIN-%d => GPIO-%d", pin_name, gpio);
+
+    if(gpio_unexport(gpio))
+    {
+        LOGE("gpio_unexport() fail.");
+        return RES_IO_ERROR;
+    }
+
+    return RES_OK;
+}
+
+//------------------------------------------------------------------------------
+/*
+* Function:     Ql_EINT_Enable
+*
+* Description:
+*               Set the interrupt sense mode, and enable interrupt.
+*
+* Parameters:
+*               eint_pin_name:
+*                   EINT pin name, one value of Enum_PinName that has
+*                   the interrupt function.
+*
+*               eint_type:
+*                   Interrupt type, level-triggered or edge-triggered.
+*                   Now, only edge-triggered interrupt is supported.
+*
+*               eint_callback:
+*                   call back function
+*
+* Return:
+*               RES_OK, this function succeeds.
+*               else failed to execute the function.
+*/
+//------------------------------------------------------------------------------
+int Ql_EINT_Enable(Enum_PinName eint_pin_name, Enum_EintType eint_type, Ql_EINT_Callback eint_callback);
+
+
+//------------------------------------------------------------------------------
+/*
+* Function:     Ql_EINT_Disable
+*
+* Description:
+*               Disable the interrupt sense.
+*
+* Parameters:
+*               eint_pin_name:
+*                   EINT pin name, one value of Enum_PinName that has
+*                   the interrupt function.
+*
+* Return:
+*               RES_OK, this function succeeds.
+*               else failed to execute the function.
+*/
+//------------------------------------------------------------------------------
+int Ql_EINT_Disable(Enum_PinName eint_pin_name);
+