blob: 2ca23821aa84baa1dee4cf64b9d108e4c8e51c64 [file] [log] [blame]
#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 GSW_OEM_RW "[HAL][GSW_OEM_RW]"
#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: "GSW_OEM_RW"" 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: "GSW_OEM_RW"" 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: "GSW_OEM_RW"" 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: "GSW_OEM_RW"" 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: "GSW_OEM_RW"" 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;
}
/**
* @brief SDK interface to read data from spec page of flash
* @param [in] read data
* @param [in] size, it must be less than (64 * 4096 - 8)Byte
* @retval 0: success
* @retval other: fail
*/
int gsw_oem_read_data(void *data, unsigned int *len)
{
int ret = 0;
return ret;
}
/**
* @brief SDK interface to write data to spec page of flash
* @param [in] write data
* @param [in] size, it must be less than (64 * 4096 - 8)Byte
* @retval 0: success
* @retval other: fail
*/
int gsw_oem_write_data(void *data, unsigned int len)
{
int ret = 0;
return ret;
}