Add mbtk_reboot

Change-Id: I16682b505016b15c9f69819bd100da7e7fd75ae4
diff --git a/mbtk/libmbtk_lib/src/mbtk_device_info.c b/mbtk/libmbtk_lib/src/mbtk_device_info.c
index 4aa87dc..31d9523 100755
--- a/mbtk/libmbtk_lib/src/mbtk_device_info.c
+++ b/mbtk/libmbtk_lib/src/mbtk_device_info.c
@@ -20,7 +20,10 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <sys/ioctl.h>
+#include <mtd/mtd-user.h>
 
+#include "mbtk_type.h"
 #include "mbtk_device.h"
 #include "mbtk_log.h"
 #include "mbtk_str.h"
@@ -143,3 +146,117 @@
     return -1;
 }
 
+int mbtk_dev_info_write(mbtk_device_info_item_enum item_type, void *item_ptr, int item_size)
+{
+    if(item_ptr == NULL) {
+        LOGE("ARG error.");
+        return -1;
+    }
+
+    switch(item_type) {
+        case MBTK_DEVICE_INFO_ITEM_BASIC:
+        {
+            if(item_size != sizeof(mbtk_device_info_basic_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_basic_t)\n\r");
+                return -1;
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_FOTA:
+        {
+            if(item_size != sizeof(mbtk_device_info_fota_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_fota_t)\n\r");
+                return -1;
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_MODEM:
+        {
+            if(item_size != sizeof(mbtk_device_info_modem_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_modem_t)\n\r");
+                return -1;
+            }
+            break;
+        }
+        case MBTK_DEVICE_INFO_ITEM_LOG:
+        {
+            if(item_size != sizeof(mbtk_device_info_log_t)) {
+                LOGE("item_size != sizeof(mbtk_device_info_log_t)\n\r");
+                return -1;
+            }
+            break;
+        }
+        default:
+        {
+            LOGE("Item type[%d] error.\n\r", item_type);
+            return -1;
+        }
+    }
+
+    mbtk_partition_info_t info;
+    memset(&info, 0x0, sizeof(mbtk_partition_info_t));
+    if(mbtk_partition_get_by_name("device_info", &info)) {
+        LOGE("mbtk_partition_get_by_name() fail.");
+        return -1;
+    }
+
+    LOGD("device_info name : %s, dev : %s, addr : %08x, size : %08x, erase_size : %08x", info.name,
+        info.dev, info.partition_start, info.partition_size, info.erase_size);
+
+    if(info.erase_size <= 0 || info.partition_size <= 0) {
+        LOGE("partition info error.");
+        return -1;
+    }
+
+    int fd = open(info.dev, O_RDWR);
+    if (fd < 0) {
+        LOGE("Fatal error: can't open device_info %s\n", info.dev);
+        return -1;
+    }
+
+    char *mtd_buff = (char*)malloc(info.erase_size);
+    if(mtd_buff == NULL) {
+        LOGE("malloc() failed\n");
+		return -1;
+    }
+    memset(mtd_buff, 0xFF, info.erase_size);
+    int len = read(fd, mtd_buff, info.erase_size);
+    if (len != info.erase_size) {
+        LOGE("Fatal error: read %d[%d] bytes(expect %d)\n", len, errno, info.erase_size);
+        goto fail;
+    }
+
+    struct erase_info_user mtdEraseInfo;
+	if (lseek(fd, 0, SEEK_SET) < 0)
+	{
+		LOGE("seek failed\n");
+		return -1;
+	}
+
+	mtdEraseInfo.length = info.partition_size;
+	mtdEraseInfo.start = 0;
+	ioctl(fd, MEMUNLOCK, &mtdEraseInfo);
+	ioctl(fd, MEMERASE, &mtdEraseInfo);
+
+    mbtk_device_info_header_t *info_header = (mbtk_device_info_header_t*)mtd_buff;
+    memcpy(mtd_buff + info_header->item_header[item_type].addr, item_ptr, item_size);
+
+    lseek(fd, 0, SEEK_SET);
+    if (write(fd, mtd_buff, info.erase_size) != info.erase_size) {
+        LOGE("Write fail:%d", errno);
+        goto fail;
+    }
+
+    if(mtd_buff) {
+        free(mtd_buff);
+    }
+
+    close(fd);
+    return 0;
+
+fail:
+    close(fd);
+    return -1;
+}
+
+