Fix mbtk from v1265 GSW

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

+#include <stdlib.h>

+#include <string.h>

+#include <fcntl.h>

+#include <unistd.h>

+#include <sys/ioctl.h>

+#include <mtd/mtd-user.h>

+#include <errno.h>

+#include <dlfcn.h>

+

+#include "gsw_oem_rw_interface.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 ERASE_BLOCK_SIZE (256*1024)

+

+#define LIB_PATH "/lib/libmbtk_lib.so"

+

+

+#define StatFunc(x,y) stat(x,y)

+

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

+    

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

+           

+typedef int (*mbtk_oem_read_data_ext)(unsigned int block_id, void *data, unsigned int *len);

+            

+typedef int (*mbtk_oem_write_data_ext)(unsigned int block_id, void *data, unsigned int len);

+

+static mbtk_log fun_ptr_log = NULL;

+

+static mbtk_oem_read_data_ext mbtk_read_fun_ptr = NULL;

+static mbtk_oem_write_data_ext mbtk_write_fun_ptr = NULL;

+

+static void *handle = NULL;

+

+static int  init_fun_handle()

+{

+    if(handle == NULL)

+    {

+        handle = dlopen(LIB_PATH, RTLD_NOW );

+        if(handle == NULL)

+        {

+            return -1;

+        }

+        if(fun_ptr_log == NULL)

+        {

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

+            if(fun_ptr_log ==  NULL)

+            {

+                return -1;

+            }

+        }

+        if(mbtk_read_fun_ptr == NULL)

+        {

+            mbtk_read_fun_ptr = (mbtk_oem_read_data_ext)dlsym(handle, "mbtk_oem_read_data_ext");

+            if(mbtk_read_fun_ptr ==  NULL)

+            {

+                return -1;

+            }

+        }

+        if(mbtk_write_fun_ptr == NULL)

+        {

+            mbtk_write_fun_ptr = (mbtk_oem_write_data_ext)dlsym(handle, "mbtk_oem_write_data_ext");

+            if(mbtk_write_fun_ptr ==  NULL)

+            {

+                return -1;

+            }

+        }

+       

+     }

+    return 0;

+}

+

+static void deinit_fun_handle()

+{

+    if(handle != NULL)

+    {

+        dlclose(handle);

+        handle = NULL;

+    }

+    

+    fun_ptr_log = NULL;

+    mbtk_write_fun_ptr = NULL;

+    mbtk_read_fun_ptr = NULL;

+    

+}

+

+/**

+ * @brief Read data from spec block of flash

+ * @param [in] unsigned int

+ * @param [out] void *

+ * @param [out] unsigned int * 

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+

+int gsw_oem_read_data_ext(unsigned int block_id, void *data, unsigned int *len) 

+{

+

+    int ret = -1;

+    unsigned int actual_len = 0;

+    char *temp_buffer = NULL;

+    ret  = init_fun_handle();

+    if(ret == -1)

+    {

+        printf(" init_fun_handle error ret %d\n",ret);

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+   

+    if (!data || !len) 

+    {

+        LOGE("invalid :data or len us NULL\n");

+        deinit_fun_handle();

+        return GSW_HAL_ARG_INVALID;

+    }

+

+    temp_buffer = (char *)malloc(ERASE_BLOCK_SIZE);

+    if (temp_buffer == NULL) 

+    {

+        LOGE("Failed to allocate read buffer ");

+        deinit_fun_handle();

+        return -1;

+    }

+    

+    memset(temp_buffer, 0, ERASE_BLOCK_SIZE);

+    

+    ret = mbtk_read_fun_ptr(block_id,temp_buffer,&actual_len);

+    if(ret != 0)

+    {

+        LOGE("mbtk_read_fun_ptr  failed");

+        free(temp_buffer); 

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    *len = actual_len;

+    memcpy(data, temp_buffer, *len);

+    free(temp_buffer); 

+    deinit_fun_handle();

+    

+    return GSW_HAL_SUCCESS;

+}

+

+/**

+ * @brief Write data to spec block of flash

+ * @param  [in] unsigned int

+ * @param  [in] void *

+ * @param  [in] unsigned int

+ * @retval 0: success

+ * @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL

+ */

+

+int gsw_oem_write_data_ext(unsigned int block_id, void *data, unsigned int len) 

+{

+    int ret = -1;

+    ret  = init_fun_handle();

+    if(ret == -1)

+    {

+        printf("init log error ret %d\n",ret);

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    if (!data || len > ERASE_BLOCK_SIZE) 

+    {

+        LOGE("invalid data is NULL ");

+        deinit_fun_handle();

+        return GSW_HAL_ARG_INVALID;

+    }

+    

+    ret = mbtk_write_fun_ptr(block_id,data,len);

+    if(ret != 0)

+    {

+        LOGE("mbtk_write_fun_ptr  failed");

+        deinit_fun_handle();

+        return GSW_HAL_NORMAL_FAIL;

+    }

+    deinit_fun_handle();

+    return GSW_HAL_SUCCESS;

+}