diff --git a/mbtk/libmbtk_lib/src/mbtk_gpio.c b/mbtk/libmbtk_lib/src/mbtk_gpio.c
new file mode 100755
index 0000000..0116f60
--- /dev/null
+++ b/mbtk/libmbtk_lib/src/mbtk_gpio.c
@@ -0,0 +1,212 @@
+#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 "mbtk_gpio.h"
+
+
+static int gpio_export(int gpio)
+{
+    int fd = -1;
+    char buffer[50];
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK) == 0)
+    {
+        LOGD("%d has export.", gpio);
+        return 0;
+    }
+
+    fd = open("/sys/class/gpio/export", O_WRONLY);
+    if(fd < 0)
+    {
+        LOGE("Open gpio export file fail.");
+        return -1;
+    }
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer , "%d", gpio);
+    if(write(fd, buffer, strlen(buffer)) <= 0)
+    {
+        LOGE("Gpio[%d] export fail.", gpio);
+        close(fd);
+        return -1;
+    }
+    close(fd);
+    return 0;
+}
+
+static int gpio_unexport(int gpio)
+{
+    int fd = -1;
+    char buffer[50];
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer,"/sys/class/gpio/gpio%d/direction", gpio);
+    if(access(buffer , F_OK))
+    {
+        LOGD("%d not export.", gpio);
+        return 0;
+    }
+
+    fd = open("/sys/class/gpio/unexport", O_WRONLY);
+    if(fd < 0)
+    {
+        LOGE("Open gpio unexport file fail.");
+        return -1;
+    }
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer , "%d", gpio);
+    if(write(fd, buffer, strlen(buffer)) <= 0)
+    {
+        LOGE("Gpio[%d] unexport fail.", gpio);
+        close(fd);
+        return -1;
+    }
+    close(fd);
+    return 0;
+}
+
+mbtk_gpio_direct_t mbtk_gpio_direct_get(int gpio)
+{
+    char buffer[50];
+    int fd = -1;
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer, "/sys/class/gpio/gpio%d/direction", gpio);
+    fd = open(buffer, O_RDONLY);
+    if(fd < 0)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return MBTK_GPIO_DIRECT_UNKNOWN;
+    }
+
+    memset(buffer, 0x0, sizeof(buffer));
+    if(read(fd, buffer, sizeof(buffer)) <= 0)
+    {
+        LOGE("Get gpio[%d] direct fail.", gpio);
+        close(fd);
+        return MBTK_GPIO_DIRECT_UNKNOWN;
+    }
+    close(fd);
+
+    if(strcmp(buffer, "out") == 0) {
+        return MBTK_GPIO_DIRECT_OUT;
+    } else if(strcmp(buffer, "in") == 0) {
+        return MBTK_GPIO_DIRECT_IN;
+    } else {
+        LOGE("direct : %s", buffer);
+        return MBTK_GPIO_DIRECT_UNKNOWN;
+    }
+}
+
+int mbtk_gpio_direct_set(int gpio, mbtk_gpio_direct_t dir)
+{
+    char buffer[50];
+    int fd = -1;
+    int ret = 0;
+
+    if(gpio_export(gpio)) {
+        return -1;
+    }
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer, "/sys/class/gpio/gpio%d/direction", gpio);
+    fd = open(buffer, O_WRONLY);
+    if(fd < 0)
+    {
+        LOGE("Open gpio[%d] direct fail.", gpio);
+        return -1;
+    }
+
+    if(MBTK_GPIO_DIRECT_OUT == dir) {
+        if(write(fd, "out", 3) != 3) {
+            ret = -1;
+            LOGE("Write out fail:%d", errno);
+        }
+    } else if(MBTK_GPIO_DIRECT_IN == dir) {
+        if(write(fd, "in", 2) != 2) {
+            ret = -1;
+            LOGE("Write in fail:%d", errno);
+        }
+    } else {
+        LOGE("Unknown direct : %d", dir);
+        ret = -1;
+    }
+
+    close(fd);
+    return ret;
+}
+
+int mbtk_gpio_value_get(int gpio)
+{
+    char buffer[50];
+    int fd =-1;
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
+    fd = open(buffer, O_RDONLY);
+    if(fd == -1)
+    {
+        LOGE("Open gpio[%d] fail.", gpio);
+        return -1;
+    }
+
+    if(read(fd, buffer, sizeof(buffer)) <= 0)
+    {
+        LOGE("Get gpio[%d] value fail", gpio);
+        close(fd);
+        return -1;
+    }
+
+    close(fd);
+    return atoi(buffer);
+}
+
+int mbtk_gpio_value_set(int gpio, mbtk_gpio_direct_t dir, int value)
+{
+    char buffer[50];
+    int fd = -1;
+    int ret =-1;
+
+    if(gpio_export(gpio)) {
+        return -1;
+    }
+
+    if(mbtk_gpio_direct_set(gpio, dir)) {
+        return -1;
+    }
+
+    memset(buffer, 0, sizeof(buffer));
+    sprintf(buffer, "/sys/class/gpio/gpio%d/value", gpio);
+    fd = open(buffer, O_WRONLY);
+    if(fd == -1)
+    {
+        LOGE("Open gpio[%d] value fail.", gpio);
+        return -1;
+    }
+    if(value == 0) {
+        ret = write(fd, "0", 1);
+    } else {
+        ret = write(fd, "1", 1);
+    }
+
+    close(fd);
+    if(ret != 1)
+    {
+        LOGE("Set gpio[%d] value fail.", gpio);
+        return -1;
+    } else {
+        return 0;
+    }
+}
+
