2023-12-12 14:41:44 +08:00
|
|
|
|
#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字节:FlAG;4字节: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 */
|
2024-01-22 09:41:24 +08:00
|
|
|
|
#define ARM_SPE_CFG_PHY_SIZE (0x3000000) /* 改到系统内存,约定大小为128M */ //(0x1400000) /* 约定在20M以内 */
|
2023-12-12 14:41:44 +08:00
|
|
|
|
#define ARM_SPE_CFG_INFO_ONE sizeof(osp_spe_cfg_file_reg)
|
|
|
|
|
#define ARM_SPE_CFG_INFO_SIZE (ARM_SPE_CFG_INFO_ONE * APE_SPE_CFG_FILE_NUM)
|
2023-12-28 10:59:18 +08:00
|
|
|
|
#define ARM_SPE_CFG_FILE_SIZE (ARM_SPE_CFG_PHY_SIZE - ARM_SPE_CFG_INFO_SIZE - ARM_CFG_INDXN) /* 特殊配置文件总长度 */
|
2024-01-22 09:41:24 +08:00
|
|
|
|
#define ARM_SPE_CFG_OFFSET (0x89000000) /* 目前改到APE_PHY段,从0x1000 0000开始,故需要偏移0x8900 0000 */
|
2023-12-12 14:41:44 +08:00
|
|
|
|
|
|
|
|
|
#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_SPE_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;
|
2024-01-22 09:41:24 +08:00
|
|
|
|
//g_spe_static_mem_size = 0;
|
2023-12-12 14:41:44 +08:00
|
|
|
|
|
2024-01-22 09:41:24 +08:00
|
|
|
|
#if 0
|
2023-12-28 10:59:18 +08:00
|
|
|
|
/* 改成从系统内存中分配128M */
|
2023-12-12 14:41:44 +08:00
|
|
|
|
g_spe_ptr_static_mem = malloc(ARM_SPE_CFG_PHY_SIZE);
|
|
|
|
|
if (NULL == g_spe_ptr_static_mem)
|
|
|
|
|
{
|
2023-12-28 10:59:18 +08:00
|
|
|
|
UCP_PRINT_ERROR("malloc(128M) for spe cfg error......\r\n");
|
2023-12-12 14:41:44 +08:00
|
|
|
|
return OSP_ERROR;
|
|
|
|
|
}
|
2024-01-22 09:41:24 +08:00
|
|
|
|
//g_spe_static_mem_size = ARM_SPE_CFG_PHY_SIZE;
|
|
|
|
|
//return OSP_OK;
|
|
|
|
|
#else
|
2023-12-12 14:41:44 +08:00
|
|
|
|
g_spe_ptr_static_mem = get_static_mem(APE_PHY, &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; /* 在内存规划中,配置文件的起始地址需要偏移 */
|
2023-12-28 10:59:18 +08:00
|
|
|
|
#endif
|
2023-12-12 14:41:44 +08:00
|
|
|
|
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_SPE_CFG_FILE_NAME_LEN*2] = {0};
|
|
|
|
|
char write_file_name[APE_SPE_CFG_FILE_NAME_LEN] = {0};
|
|
|
|
|
char line_buf[100] = {0};
|
|
|
|
|
char cmd_string[APE_SPE_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_SPE_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_SPE_CFG_FILE_NAME_LEN]={0};
|
|
|
|
|
char file_name[APE_SPE_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_SPE_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);
|
|
|
|
|
|
2023-12-28 10:59:18 +08:00
|
|
|
|
/* 保护:文件太多,空间不够 */
|
|
|
|
|
if ((file_len + ddr_offset) > ARM_SPE_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;
|
|
|
|
|
}
|
|
|
|
|
|
2023-12-12 14:41:44 +08:00
|
|
|
|
/* 回到文件头部 */
|
|
|
|
|
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_SPE_CFG_FILE_NAME_LEN)
|
|
|
|
|
{
|
|
|
|
|
UCP_PRINT_ERROR("[osp_get_cfg_file]: name too long\r\n");
|
|
|
|
|
return OSP_ERROR;
|
|
|
|
|
}
|
2023-12-28 10:59:18 +08:00
|
|
|
|
for (loop = 0; loop < g_spe_osp_cfg_file_idx; loop++)
|
2023-12-12 14:41:44 +08:00
|
|
|
|
{
|
|
|
|
|
head = g_spe_osp_cfg_file_reg + loop;
|
|
|
|
|
if (0 == memcmp(head->name, name, strlen(name)))
|
|
|
|
|
{
|
|
|
|
|
/* 物理层需要物理地址,而还是虚拟地址 */
|
2024-01-22 09:41:24 +08:00
|
|
|
|
osp_virt_to_phy(APE_PHY, head->vir_addr, paddr);
|
|
|
|
|
//*paddr = head->vir_addr;
|
2023-12-12 14:41:44 +08:00
|
|
|
|
*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
|
|
|
|
|
|
|
|
|
|
|