yb_arm/osp/src/ospCfgToBin.c
lishuang.xie a2ae96715d 1. New Feature#891
spe cfg file addr change(malloc --> 0x9A00 0000)
   when phy get the cfg file addr return the phy addr, not the vir addr
2023-07-22 22:12:02 +08:00

660 lines
22 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "ospTypes.h"
#include "ospCfgToBin.h"
#include "ospHeap.h"
#include "ospSem.h"
#include "ospSoftQue.h"
#include "ospMsg.h"
#include "ucp_printf.h"
/***************************************************************************/
/* ARM <---> APE */
#define ARM_READ_CFG_FILE_OK (0xA0A0A0A0) /* ARM侧与APE侧约定 */
#define ARM_CFG_FILE_OFFSET (0x00400000) /* 配置文件起始地址相对于PHY空间偏移4MB */
#define ARM_CFG_PHY_ADDR (0x10400000) /* 配置文件首地址 */
#define ARM_CFG_PHY_SIZE (0x4000000) /* 配置文件区域长度64M */
#define APE_CFG_INFO_ONE sizeof(osp_cfg_file_reg)
#define ARM_CFG_INDXN (8) /* 4字节FlAG4字节NUM */
#define ARM_CFG_FLAG (4)
#define ARM_CFG_NUM (4)
#define ARM_CFG_INFO_ADDR (ARM_CFG_PHY_ADDR + ARM_CFG_INDXN) /* 配置文件头信息地址 */
#define ARM_CFG_INFO_SIZE (APE_CFG_INFO_ONE * APE_CFG_FILE_NUM)
#define ARM_CFG_FILE_ADDR (ARM_CFG_INFO_ADDR + ARM_CFG_INFO_SIZE) /* 配置文件文件信息地址 */
#define ARM_CFG_FILE_SIZE (ARM_CFG_PHY_SIZE - ARM_CFG_INFO_SIZE -ARM_CFG_INDXN) /* 配置文件文件总长度 */
/***************************************************************************/
/* ARM <---> ARM */
#define ARM_SPE_CFG_PHY_SIZE (0x1400000) /* 约定在20M以内 */
#define ARM_SPE_CFG_INFO_ONE sizeof(osp_spe_cfg_file_reg)
#define ARM_SPE_CFG_INFO_SIZE (ARM_SPE_CFG_INFO_ONE * APE_CFG_FILE_NUM)
#define ARM_SPE_CFG_OFFSET (0x0A000000) /* 目前改到APE_TEXT段从0x9A00 0000开始故需要偏移0x0A00 0000 */
#if 0
#define ARM_SPE_CFG_PHY_ADDR (0xB8000000) /* 指定配置文件首地址 */
#define ARM_SPE_CFG_PHY_SIZE (0x10000) /* 指定配置文件区域长度64K */
#define ARM_SPE_CFG_INFO_ADDR (ARM_SPE_CFG_PHY_ADDR + ARM_CFG_INDXN) /* 指定配置文件头信息地址 */
#define ARM_SPE_CFG_FILE_ADDR (ARM_SPE_CFG_INFO_ADDR + ARM_SPE_CFG_INFO_SIZE) /* 指定配置文件文件信息地址*/
#endif
/***************************************************************************/
/* ARM <---> APE */
osp_cfg_file_reg g_osp_cfg_file_reg[APE_CFG_FILE_NUM];
uint32_t g_osp_cfg_file_idx = 0;
void *g_ptr_static_mem = NULL;
uint64_t g_static_mem_size = 0;
/***************************************************************************/
/* ARM <---> ARM */
osp_spe_cfg_file_reg g_spe_osp_cfg_file_reg[APE_CFG_FILE_NUM];
uint32_t g_spe_osp_cfg_file_idx = 0;
void *g_spe_ptr_static_mem = NULL;
uint64_t g_spe_static_mem_size = 0;
/***************************************************************************/
/* ARM <---> APE */
/* ARM侧配置文件模块初始化 */
int32_t osp_cfg_file_init()
{
memset(&g_osp_cfg_file_reg, 0, sizeof(g_osp_cfg_file_reg));
g_osp_cfg_file_idx = 0;
g_static_mem_size = 0;
g_ptr_static_mem = get_static_mem(APE_PHY, &g_static_mem_size);
if (0 == g_static_mem_size)
{
UCP_PRINT_ERROR("get_static_mem(APE_PHY) error......\r\n");
return OSP_ERROR;
}
g_ptr_static_mem += ARM_CFG_FILE_OFFSET; /* 在内存规划中,配置文件的起始地址需要偏移 */
/* 先把NUM位写成0 */
*(uint32_t*)(g_ptr_static_mem+ARM_CFG_NUM) = 0;
return OSP_OK;
}
/***********************************************************/
/* 约定如下:
1. 所有原始文件为文本文件
2. 所有原始文件存放在目录: /ramfs/cfgDat/
3. 所有原始文件都以.dat为后缀
4. 需要将文本文件转化成二进制文件
5. 所有二进制文件存放在目录: /ramfs/config/
*/
/* 将所有文本文件转化成二进制文件 */
int32_t osp_cfg_file_to_bin()
{
FILE *file = NULL; /* 遍历临时文件,获取所有文件名 */
FILE *read_file = NULL; /* 原始文件 */
FILE *write_file = NULL; /* 目的文件 */
uint8_t len = 0;
uint8_t osp_cfg_file_idx = 0; /* 文件个数 */
uint32_t value = 0;
char *p_line_file_name = NULL;
char line_file_name_full[APE_CFG_FILE_NAME_LEN*2] = {0};
char write_file_name[APE_CFG_FILE_NAME_LEN] = {0};
char line_buf[100] = {0};
/* 遍历原始目录,获取所有文件的文件名及路径输出到:tmpfile */
system("find /ramfs/cfgDat/* -name '*.dat' > tmpfile");
/* 遍历原始目录,获取所有文件的文件名输出到:tmpfilename */
//system("find /ramfs/cfgDat/* -name '*.dat' | sed 's#.*/##' > tmpfilename");
/* 打开tmpfile内所有需要处理的文件 */
file = fopen("./tmpfile", "rb");
if (NULL == file)
{
UCP_PRINT_ERROR("Open file(tmpfile) error.\r\n");
return OSP_FILE_ERROR;
}
/* 逐一转化(文本文件 --> 二进制文件 */
while(osp_cfg_file_idx < APE_CFG_FILE_NUM)
{
/* 每行是原始文件的全路径 */
if (NULL == fgets(line_file_name_full, sizeof(line_file_name_full), file))
{
/* 遍历至最后结束 */
break;
}
p_line_file_name = strrchr(line_file_name_full, '/');
p_line_file_name++;
len = strlen(line_file_name_full);
line_file_name_full[len - 1] = '\0';
read_file = fopen(line_file_name_full, "rb");
if (NULL == read_file)
{
UCP_PRINT_ERROR("Can not open src file: %s \r\n", line_file_name_full);
fclose(file);
return OSP_FILE_ERROR;
}
sprintf(write_file_name, "/ramfs/config/%s", p_line_file_name);
UCP_PRINT_DEBUG("dst file: %s \r\n", write_file_name);
write_file = fopen(write_file_name, "wb+");
if (NULL == write_file)
{
UCP_PRINT_ERROR("Can not open dst file: %s \r\n", write_file_name);
fclose(file);
fclose(read_file);
return OSP_FILE_ERROR;
}
/* 开始转化 */
while(fgets(line_buf, 100, read_file))
{
sscanf(line_buf, "0x%x", &value);
fwrite(&value, sizeof(value), 1, write_file);
}
osp_cfg_file_idx++;
fflush(read_file);
fclose(read_file);
fflush(write_file);
fclose(write_file);
}
fclose(file);
system("rm tmpfile");
return OSP_OK;
}
/* 将二进制文件定入DDR */
int32_t osp_bin_cfg_file_to_ddr()
{
char *p_line_file_name = NULL;
char *p_line_file_name_begin = NULL;
char line_file_full_name[2*APE_CFG_FILE_NAME_LEN] = {0};
char file_name[APE_CFG_FILE_NAME_LEN] = {0};
uint32_t len = 0;
uint32_t tmp_len = 0;
uint8_t osp_cfg_file_idx = 0; /* 文件个数 */
uint32_t ret = 0; /* 返回值判断 */
uint32_t file_len = 0; /* 文件长度 */
uint32_t ddr_offset = 0;
FILE *file = NULL;
FILE *read_file = NULL;
/* 全路径文件名写入: tmpfile文件 */
system("find /ramfs/config/* -name '*' > tmpfile");
/* 遍历 */
file = fopen("./tmpfile", "rb");
if (NULL == file)
{
UCP_PRINT_ERROR("[to_ddr]: Open file(tmpfile) error.\r\n");
return OSP_FILE_ERROR;
}
while(osp_cfg_file_idx < APE_CFG_FILE_NUM)
{
/* 每行是原始文件的全路径 */
if (NULL == fgets(line_file_full_name, sizeof(line_file_full_name), file))
{
/* 遍历至最后结束 */
break;
}
p_line_file_name = strrchr(line_file_full_name, '/');
p_line_file_name++;
len = strlen(line_file_full_name);
line_file_full_name[len - 1] = '\0';
p_line_file_name_begin = line_file_full_name;
memcpy(file_name, p_line_file_name, len-(p_line_file_name - p_line_file_name_begin));
//UCP_PRINT_DEBUG("[to_ddr]: file name : %s \r\n", file_name);
read_file = fopen(line_file_full_name, "rb");
if (NULL == read_file)
{
UCP_PRINT_ERROR("[to_ddr]: Can not open src file: %s \r\n", line_file_full_name);
fclose(file);
return OSP_FILE_ERROR;
}
/* 找到文件结束符 */
ret = fseek(read_file, 0, SEEK_END);
if (ret)
{
UCP_PRINT_ERROR("[to_ddr]: Can not fseek: %s \r\n", line_file_full_name);
fclose(file);
fclose(read_file);
return OSP_FILE_ERROR;
}
/* 计算文件长度 */
file_len = (uint32_t)ftell(read_file);
UCP_PRINT_DEBUG("[to_ddr]: file: %s ,Size: %d\r\n", line_file_full_name, file_len);
/* 保护:文件太多,空间不够 */
if ((file_len + ddr_offset) > ARM_CFG_FILE_SIZE)
{
UCP_PRINT_ERROR("[to_ddr]: too much file, no space... \r\n");
fclose(read_file);
fclose(file);
system("rm tmpfile");
return OSP_ERROR;
}
/* 回到文件头部 */
ret = fseek(read_file, 0, SEEK_SET);
/* 更新全局变量 */
len = 0;
while(len < file_len)
{
tmp_len = fread((char*)(g_ptr_static_mem+ARM_CFG_INDXN+ARM_CFG_INFO_SIZE+ddr_offset+len), 1, file_len, read_file);
len += tmp_len;
}
/* 更新全局变量 */
g_osp_cfg_file_reg[g_osp_cfg_file_idx].len = file_len;
memcpy(g_osp_cfg_file_reg[g_osp_cfg_file_idx].name, file_name, strlen(file_name));
g_osp_cfg_file_reg[g_osp_cfg_file_idx].phy_addr = ARM_CFG_FILE_ADDR+ddr_offset;
g_osp_cfg_file_idx++;
ddr_offset += file_len;
osp_cfg_file_idx++;
fclose(read_file);
}
/* 更新配置文件头信息 */
*(uint32_t *)(g_ptr_static_mem + ARM_CFG_NUM) = g_osp_cfg_file_idx;
memcpy((g_ptr_static_mem+ARM_CFG_INDXN), g_osp_cfg_file_reg, APE_CFG_INFO_ONE*g_osp_cfg_file_idx);
*(uint32_t *)g_ptr_static_mem = ARM_READ_CFG_FILE_OK;
fclose(file);
system("rm tmpfile");
return OSP_OK;
}
int32_t osp_read_cfg_file(void)
{
int32_t ret = -1;
/* 配置文件初始化 */
ret = osp_cfg_file_init();
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_cfg_file]: osp_cfg_file_init return error: %d\r\n", ret);
return ret;
}
/* 读配置文件 */
ret = osp_cfg_file_to_bin();
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_cfg_file]: osp_cfg_file_to_bin return error: %d\r\n", ret);
return ret;
}
/* 转化并写入 */
ret = osp_bin_cfg_file_to_ddr();
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_cfg_file]: osp_bin_cfg_file_to_ddr return error: %d\r\n", ret);
return ret;
}
return OSP_OK;
}
/***************************************************************************/
/* ARM <---> ARM */
int32_t osp_spe_cfg_file_init()
{
memset(&g_spe_osp_cfg_file_reg, 0, sizeof(g_spe_osp_cfg_file_reg));
g_spe_osp_cfg_file_idx = 0;
g_spe_static_mem_size = 0;
#if 0
g_spe_ptr_static_mem = malloc(ARM_SPE_CFG_PHY_SIZE);
if (NULL == g_spe_ptr_static_mem)
{
UCP_PRINT_ERROR("get_static_mem(ARM_STACK) error......\r\n");
return OSP_ERROR;
}
return OSP_OK;
#endif
g_spe_ptr_static_mem = get_static_mem(APE_TEXT, &g_spe_static_mem_size);
if (0 == g_spe_static_mem_size)
{
UCP_PRINT_ERROR("get_static_mem(ARM_STACK) error......\r\n");
return OSP_ERROR;
}
g_spe_ptr_static_mem += ARM_SPE_CFG_OFFSET; /* 在内存规划中,配置文件的起始地址需要偏移 */
return OSP_OK;
}
int32_t osp_read_spe_cfg_to_bin(char* in_path)
{
FILE *file = NULL; /* 遍历临时文件,获取所有文件名 */
FILE *read_file = NULL; /* 原始文件 */
FILE *write_file = NULL; /* 目的文件 */
uint8_t len = 0;
uint8_t osp_cfg_file_idx = 0; /* 文件个数 */
uint32_t value = 0;
char *p_line_file_name = NULL;
char line_file_name_full[APE_CFG_FILE_NAME_LEN*2] = {0};
char write_file_name[APE_CFG_FILE_NAME_LEN] = {0};
char line_buf[100] = {0};
char cmd_string[APE_CFG_FILE_NAME_LEN*2] = {0};
if (NULL == in_path)
{
UCP_PRINT_ERROR("osp_read_spe_cfg_to_bin() in_path error......\r\n");
return OSP_PAR_ILL;
}
system("rm -rf /ramfs/config_bak/*.*");
/* 遍历原始目录,获取所有文件的文件名及路径输出到:tmpfile */
sprintf(cmd_string, "find /%s/* -name '*.dat' > tmpfile", in_path);
system(cmd_string);
/* 遍历原始目录,获取所有文件的文件名输出到:tmpfilename */
//system("find /ramfs/cfgDat/* -name '*.dat' | sed 's#.*/##' > tmpfilename");
/* 打开tmpfile内所有需要处理的文件 */
file = fopen("./tmpfile", "rb");
if (NULL == file)
{
UCP_PRINT_ERROR("Open file(tmpfile) error.\r\n");
return OSP_FILE_ERROR;
}
/* 逐一转化(文本文件 --> 二进制文件 */
while(osp_cfg_file_idx < APE_CFG_FILE_NUM)
{
/* 每行是原始文件的全路径 */
if (NULL == fgets(line_file_name_full, sizeof(line_file_name_full), file))
{
/* 遍历至最后结束 */
break;
}
p_line_file_name = strrchr(line_file_name_full, '/');
p_line_file_name++;
len = strlen(line_file_name_full);
line_file_name_full[len - 1] = '\0';
read_file = fopen(line_file_name_full, "rb");
if (NULL == read_file)
{
UCP_PRINT_ERROR("Can not open src file: %s \r\n", line_file_name_full);
fclose(file);
return OSP_FILE_ERROR;
}
sprintf(write_file_name, "/ramfs/config_bak/%s", p_line_file_name);
//UCP_PRINT_DEBUG("dst file: %s \r\n", write_file_name);
write_file = fopen(write_file_name, "wb+");
if (NULL == write_file)
{
UCP_PRINT_ERROR("Can not open dst file: %s \r\n", write_file_name);
fclose(file);
fclose(read_file);
return OSP_FILE_ERROR;
}
/* 开始转化 */
while(fgets(line_buf, 100, read_file))
{
sscanf(line_buf, "0x%x", &value);
fwrite(&value, sizeof(value), 1, write_file);
}
osp_cfg_file_idx++;
fflush(read_file);
fclose(read_file);
fflush(write_file);
fclose(write_file);
}
fclose(file);
system("rm tmpfile");
return OSP_OK;
}
int32_t osp_spe_bin_cfg_file_to_ddr()
{
char *p_line_file_name = NULL;
char *p_line_file_name_begin = NULL;
char line_file_full_name[2*APE_CFG_FILE_NAME_LEN]={0};
char file_name[APE_CFG_FILE_NAME_LEN] = {0};
uint32_t len = 0;
uint32_t tmp_len = 0;
uint8_t osp_cfg_file_idx = 0; /* 文件个数 */
uint32_t ret = 0; /* 返回值判断 */
uint32_t file_len = 0; /* 文件长度 */
uint32_t ddr_offset = 0;
FILE *file = NULL;
FILE *read_file = NULL;
/* 全路径文件名写入: tmpfile文件 */
system("find /ramfs/config_bak/* -name '*' > tmpfile");
/* 遍历 */
file = fopen("./tmpfile", "rb");
if (NULL == file)
{
UCP_PRINT_ERROR("[to_ddr]: Open file(tmpfile) error.\r\n");
return OSP_FILE_ERROR;
}
while(osp_cfg_file_idx < APE_CFG_FILE_NUM)
{
/* 每行是原始文件的全路径 */
if (NULL == fgets(line_file_full_name, sizeof(line_file_full_name), file))
{
/* 遍历至最后结束 */
break;
}
p_line_file_name = strrchr(line_file_full_name, '/');
p_line_file_name++;
len = strlen(line_file_full_name);
line_file_full_name[len - 1] = '\0';
p_line_file_name_begin = line_file_full_name;
memcpy(file_name, p_line_file_name, len-(p_line_file_name - p_line_file_name_begin));
//UCP_PRINT_DEBUG("[to_ddr]: file name : %s \r\n", file_name);
read_file = fopen(line_file_full_name, "rb");
if (NULL == read_file)
{
UCP_PRINT_ERROR("[to_ddr]: Can not open src file: %s \r\n", line_file_full_name);
fclose(file);
return OSP_FILE_ERROR;
}
/* 找到文件结束符 */
ret = fseek(read_file, 0, SEEK_END);
if (ret)
{
UCP_PRINT_ERROR("[to_ddr]: Can not fseek: %s \r\n", line_file_full_name);
fclose(file);
fclose(read_file);
return OSP_FILE_ERROR;
}
/* 计算文件长度 */
file_len = (uint32_t)ftell(read_file);
UCP_PRINT_DEBUG("[to_ddr]: file: %s ,Size: %d\r\n", line_file_full_name, file_len);
/* 回到文件头部 */
ret = fseek(read_file, 0, SEEK_SET);
/* 更新全局变量 */
len = 0;
while(len < file_len)
{
tmp_len = fread((char*)(g_spe_ptr_static_mem+ARM_CFG_INDXN+ARM_SPE_CFG_INFO_SIZE+ddr_offset+len), 1, file_len, read_file);
len += tmp_len;
}
/* 更新全局变量 */
g_spe_osp_cfg_file_reg[g_spe_osp_cfg_file_idx].len = file_len;
memcpy(g_spe_osp_cfg_file_reg[g_spe_osp_cfg_file_idx].name, file_name, strlen(file_name));
g_spe_osp_cfg_file_reg[g_spe_osp_cfg_file_idx].vir_addr = (uint64_t)(g_spe_ptr_static_mem
+ ARM_CFG_INDXN
+ ARM_SPE_CFG_INFO_SIZE
+ ddr_offset);
g_spe_osp_cfg_file_idx++;
ddr_offset += file_len;
osp_cfg_file_idx++;
fclose(read_file);
}
/* 更新配置文件头信息 */
*(uint32_t *)(g_spe_ptr_static_mem+ARM_CFG_NUM) = g_spe_osp_cfg_file_idx;
memcpy((g_spe_ptr_static_mem + ARM_CFG_INDXN), g_spe_osp_cfg_file_reg, ARM_SPE_CFG_INFO_ONE * g_spe_osp_cfg_file_idx);
*(uint32_t *)g_spe_ptr_static_mem = ARM_READ_CFG_FILE_OK;
fclose(file);
system("rm tmpfile");
return OSP_OK;
}
/********************************************************************/
/* TestMac Interface */
/********************************************************************/
int32_t osp_read_spe_cfg_file(char* path)
{
uint32_t ret = 0;
/* 每次调用前,清空全局变量 */
ret = osp_spe_cfg_file_init();
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_spe_cfg_file]: osp_cfg_file_init return error: %d\r\n", ret);
return ret;
}
/* 读文本配置文件 */
ret = osp_read_spe_cfg_to_bin(path);
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_spe_cfg_file]: osp_read_spe_cfg_to_bin return error: %d\r\n", ret);
return ret;
}
/* 转化 */
ret = osp_spe_bin_cfg_file_to_ddr();
if (OSP_OK != ret)
{
UCP_PRINT_ERROR("[osp_read_spe_cfg_file]: osp_spe_bin_cfg_file_to_ddr return error: %d\r\n", ret);
return ret;
}
return OSP_OK;
}
int32_t osp_get_cfg_file(char* name, uint64_t *paddr, uint32_t *psize)
{
uint16_t loop = 0;
osp_spe_cfg_file_reg *head = NULL;
if (strlen(name) > APE_CFG_FILE_NAME_LEN)
{
UCP_PRINT_ERROR("[osp_get_cfg_file]: name too long\r\n");
return OSP_ERROR;
}
for (loop = 0; loop < APE_CFG_FILE_NUM; loop++)
{
head = g_spe_osp_cfg_file_reg + loop;
if (0 == memcmp(head->name, name, strlen(name)))
{
/* 物理层需要物理地址,而还是虚拟地址 */
osp_virt_to_phy(APE_TEXT, head->vir_addr, paddr);
//*paddr = head->vir_addr;
*psize = head->len;
return OSP_OK;
}
}
UCP_PRINT_DEBUG("[osp_get_cfg_file]: no this file(%s)\r\n", name);
return OSP_ERROR;
}
#ifdef HEARTBEAT_ENABLE
#define OSP_IM2DDR_FLAG_OK (0x5a5a5a5a)
#define OSP_IM2DDR_SIZE (0x40000) /* 256k */
#define DUMP_IM_CORE_FILE_NAME "./dump_im_core%02d_%04d%02d%02d_%02d%02d%02d" /* dump dm file */
#define DUMP_IM_CORE_FILE_LEN (36)
int8_t osp_get_im2ddr_to_file(uint8_t u8CoreId)
{
int32_t ret = OSP_OK;
uint32_t u32_im2ddr_flag = 0;
char file_name[DUMP_IM_CORE_FILE_LEN]= {0};
char *pbuf = g_ptr_static_mem;
FILE *fp = NULL;
struct tm *t;
time_t tt;
time(&tt);
t = localtime(&tt);
UCP_PRINT_DEBUG("[osp_get_im2ddr_to_file]: Start ... \r\n");
while(1)
{
u32_im2ddr_flag = *(uint32_t*)(g_ptr_static_mem);
if (OSP_IM2DDR_FLAG_OK == u32_im2ddr_flag)
{
UCP_PRINT_DEBUG("[osp_get_im2ddr_to_file]: ape write im2ddr ok\r\n");
break;
}
}
sprintf(file_name, DUMP_IM_CORE_FILE_NAME, u8CoreId, t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
UCP_PRINT_DEBUG("[osp_get_im2ddr_to_file]: file_name = %s\r\n", file_name);
fp = fopen(file_name, "wb+");
if (fp < 0)
{
UCP_PRINT_ERROR("[osp_get_im2ddr_to_file]: file open failure \n");
return OSP_ERROR;
}
ret = fwrite((pbuf+4), sizeof(char), OSP_IM2DDR_SIZE, fp);
if(ret < 0)
{
UCP_PRINT_ERROR("[osp_get_im2ddr_to_file]: fwrite error ret:%d\n", ret);
fclose(fp);
return OSP_ERROR;
}
fflush(fp);
fclose(fp);
UCP_PRINT_DEBUG("[osp_get_im2ddr_to_file]: End ... \r\n");
return OSP_OK;
}
#endif