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