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