add mbtk gpio api.
Change-Id: I1e1dd810465627f795242d22248191c01af58add
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;
+ }
+}
+