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