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);
+