Fix mbtk from v1265 GSW

Change-Id: I5d8d395616f284bc74c8b9448cfa347164b5a668
diff --git a/mbtk/libgsw_lib/gsw_gpio.c b/mbtk/libgsw_lib/gsw_gpio.c
new file mode 100755
index 0000000..9bd8a79
--- /dev/null
+++ b/mbtk/libgsw_lib/gsw_gpio.c
@@ -0,0 +1,379 @@
+#include <stdio.h>

+#include <stdlib.h>

+#include <unistd.h>

+#include <fcntl.h>

+#include <errno.h>

+#include <stdint.h>

+#include <string.h>

+#include <dlfcn.h>

+

+#include "gsw_gpio.h"

+

+#ifndef LOG_ERR_LEVEL

+#define LOG_ERR_LEVEL  3      /* error conditions */

+#endif

+#ifndef LOG_WARN_LEVEL

+#define LOG_WARN_LEVEL 4   /* warning conditions */

+#endif

+#ifndef LOG_INFO_LEVEL

+#define LOG_INFO_LEVEL 6      /* informational */

+#endif

+#ifndef LOG_DEBUG_LEVEL

+#define LOG_DEBUG_LEVEL 7     /* debug-level messages */

+#endif

+#ifndef LOG_VERBOSE_LEVEL

+#define LOG_VERBOSE_LEVEL 8

+#endif

+

+#define LOGV(fmt, args ...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGI(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGD(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGW(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+

+#define LOGE(fmt, args...) \

+    do{ \

+        char *file_ptr_1001 = __FILE__; \

+        char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1;   \

+        char line_1001[10] = {0}; \

+        sprintf(line_1001, "%d", __LINE__); \

+        while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \

+            if(*ptr_1001 == '/') \

+                 break; \

+            ptr_1001--; \

+        } \

+        fun_ptr_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \

+    } while(0)

+    

+

+#define GSW_HAL_SUCCESS 0

+#define GSW_HAL_FAIL -1	//表示失败(通用性)

+#define GSW_HAL_MEM_INVAILD -2 //表示入参地址为NULL

+

+#define wakeout 117

+

+typedef void (*mbtk_log)(int level, const char *format,...);

+static mbtk_log fun_ptr_log = NULL;

+void *dlHandle_gpio = NULL;

+char *lynqLib_gpio = "/lib/libmbtk_lib.so";

+

+int gpio_check(int gpio)

+{

+    char buffer[128];

+    memset(buffer,0,128);

+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);

+    return access(buffer , F_OK);

+}

+

+static int handle()

+{

+    if(dlHandle_gpio == NULL || fun_ptr_log == NULL)

+    {

+        dlHandle_gpio = dlopen(lynqLib_gpio, RTLD_NOW);

+        fun_ptr_log = (mbtk_log)dlsym(dlHandle_gpio, "mbtk_log");

+        if(fun_ptr_log == NULL || dlHandle_gpio == NULL)

+        {

+            return GSW_HAL_FAIL;

+        }

+    }

+    return GSW_HAL_SUCCESS;

+}

+

+static int gpio_export(int gpio)

+{

+    int file=-1;

+    int result =-1;

+    char pin_index_buffer[5]= {0};

+

+    if (gpio_check(gpio) == 0)

+    {

+        LOGE("export has been add\n");

+        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 file=-1;

+    int result =-1;

+    char pin_index_buffer[5]= {0};

+    if (gpio_check(gpio) == -1)

+    {

+        LOGE("export has been not add\n");

+        return -1;

+    }

+

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

+}

+

+int32_t gsw_gpio_SetDirection(uint32_t gpioNum, gsw_hal_pinDirection dir)

+{

+    char buffer[128]= {0};

+    int file =-1;

+    int result =-1;

+    char direction[10] = {0};

+    memset(buffer,0,128);

+    if (handle())

+        return GSW_HAL_FAIL;

+    

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in dir export has been not add\n");

+        gpio_export(gpioNum);

+    }

+

+

+    sprintf(buffer,"/sys/class/gpio/gpio%u/direction", gpioNum);

+    file = open(buffer, O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] direct fail.", gpioNum);

+        return -1;

+    }

+    if (dir == GSW_HAL_PINDIR_IN)

+        sprintf(direction,"in");

+    else if (dir == GSW_HAL_PINDIR_OUT)

+        sprintf(direction,"out");

+    

+    result = write(file,direction,strlen(direction));

+    if(result != strlen(direction))

+    {

+        LOGE("Set gpio[%d] direct fail.", gpioNum);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return GSW_HAL_SUCCESS;

+}

+

+gsw_hal_pinLevel gsw_gpio_GetLevel(uint32_t gpioNum)

+{

+    char buffer[50];

+    char path[128];

+    int file =-1;

+    int result =-1;

+    memset(path,0,128);

+    memset(buffer,0,50);

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in get value export has been not add\n");

+        gpio_export(gpioNum);

+    }

+    sprintf(path,"/sys/class/gpio/gpio%u/value", gpioNum);

+    file = open(path,O_RDONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] fail.", gpioNum);

+        return -1;

+    }

+    result = read(file,buffer,50);

+    if(result <= 0)

+    {

+        LOGE("Get gpio[%d] value fail", gpioNum);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return atoi(buffer);

+}

+

+int32_t gsw_gpio_SetLevel(uint32_t gpioNum, gsw_hal_pinLevel level)

+{

+    char buffer[128]= {0};

+    int file =-1;

+    int result =-1;

+    memset(buffer,0,50);

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (gpio_check(gpioNum) == -1)

+    {

+        LOGD("in set value export has been not add\n");

+        gpio_export(gpioNum);

+    }

+

+    sprintf(buffer,"/sys/class/gpio/gpio%u/value", gpioNum);

+    file = open(buffer,O_WRONLY);

+    if(file == -1)

+    {

+        LOGE("Open gpio[%d] value fail.", gpioNum);

+        return -1;

+    }

+    if(level == GSW_HAL_LEVEL_LOW) {

+        result = write(file,"0",1);

+    } else {

+        result = write(file,"1",1);

+    }

+    if(result != 1)

+    {

+        LOGE("Set gpio[%d] value fail err =%d.", gpioNum, errno);

+        close(file);

+        gpio_unexport(gpioNum);

+        return GSW_HAL_FAIL;

+    }

+    close(file);

+    gpio_unexport(gpioNum);

+    return GSW_HAL_SUCCESS;

+}

+

+

+int32_t gsw_gpio_Init(uint32_t gpioNum, gsw_hal_pinDirection dir, gsw_hal_pinLevel level, gsw_hal_pinPullSel pullsel)

+{

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    if (dir != 1 && dir != 0)

+    {

+        LOGE("[lynq_gpio_init] direction fail.");

+        return -1;

+    }

+

+    if (level != 1 && level != 0)

+    {

+        LOGE("[lynq_gpio_init] value fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(gpio_export(gpioNum))

+    {

+        LOGE("[lynq_gpio_init]gpio_export fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(gsw_gpio_SetDirection(gpioNum, dir))

+    {

+        LOGE("[lynq_gpio_init]gpio_direct_set fail.");

+        return GSW_HAL_FAIL;

+    }

+

+    if(dir == 1 && (gsw_gpio_SetLevel(gpioNum, level) != 0))

+    {

+        LOGE("[lynq_gpio_init]gpio_value_set fail.");

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}

+gsw_hal_usbStatus gsw_hwpin_is_usb_connected(void)

+{

+    FILE *fp;

+    char cmd[128] = {0};

+    char tmp_rsp[20] = {0};

+    //char *CONNECTED = "configured";

+    char *DISCONNECTED = "not attached";

+    if (handle())

+        return GSW_HAL_FAIL;

+

+    sprintf(cmd,"cat /sys/devices/platform/soc/d4200000.axi/c0000000.usb/udc/c0000000.usb/state");

+    fp=popen(cmd, "r");

+    if (fgets(tmp_rsp,sizeof(tmp_rsp),fp) == NULL)

+        LOGE("gsw_hwpin_is_usb_connected fail.");

+    pclose(fp);

+    if (strncmp(tmp_rsp,DISCONNECTED,strlen(DISCONNECTED)) == 0)

+        return GSW_HAL_USB_DISCONNECTED;

+    else

+        return GSW_HAL_USB_CONNECTED;

+}

+

+int32_t gsw_setWakeupLevel(gsw_hal_pinLevel level)

+{

+    if (gsw_gpio_SetLevel(wakeout, level) == GSW_HAL_FAIL)

+    {

+        return GSW_HAL_FAIL;

+    }

+    return GSW_HAL_SUCCESS;

+}