diff --git a/osp/inc/ospCfgToBin.h b/osp/inc/ospCfgToBin.h index 34c0102..fd7781b 100644 --- a/osp/inc/ospCfgToBin.h +++ b/osp/inc/ospCfgToBin.h @@ -1,35 +1,36 @@ -#ifndef __OSP_CFG_TO_BIN_H__ -#define __OSP_CFG_TO_BIN_H__ - -#define APE_CFG_FILE_NAME_LEN (32) //(64) /* 为节省内存开销,文件名长度由64->32字节 */ -#define APE_CFG_FILE_NUM (64) -#define APE_SPE_CFG_FILE_NUM (128) - -typedef struct OSP_CFG_FILE_REG -{ - char name[APE_CFG_FILE_NAME_LEN]; - uint32_t phy_addr; - uint32_t len; -}osp_cfg_file_reg; - - -typedef struct OSP_SPE_CFG_FILE_REG -{ - char name[APE_CFG_FILE_NAME_LEN]; - uint64_t vir_addr; - uint32_t len; -}osp_spe_cfg_file_reg; - -extern int32_t osp_read_cfg_file(void); - - -/* TestMac interface */ -extern int32_t osp_read_spe_cfg_file(char* path); -extern int32_t osp_get_cfg_file(char* name, uint64_t *paddr, uint32_t *psize); - -#ifdef HEARTBEAT_ENABLE -extern int8_t osp_get_im2ddr_to_file(uint8_t u8CoreId); -#endif - -#endif /* __OSP_CFG_TO_BIN_H__ */ - +#ifndef __OSP_CFG_TO_BIN_H__ +#define __OSP_CFG_TO_BIN_H__ + +#define APE_CFG_FILE_NAME_LEN (32) //(64) /* 为节省内存开销,文件名长度由64->32字节 */ +#define APE_CFG_FILE_NUM (64) +#define APE_SPE_CFG_FILE_NUM (128) +#define APE_SPE_CFG_FILE_NAME_LEN (64) + +typedef struct OSP_CFG_FILE_REG +{ + char name[APE_CFG_FILE_NAME_LEN]; + uint32_t phy_addr; + uint32_t len; +}osp_cfg_file_reg; + + +typedef struct OSP_SPE_CFG_FILE_REG +{ + char name[APE_SPE_CFG_FILE_NAME_LEN]; + uint64_t vir_addr; + uint32_t len; +}osp_spe_cfg_file_reg; + +extern int32_t osp_read_cfg_file(void); + + +/* TestMac interface */ +extern int32_t osp_read_spe_cfg_file(char* path); +extern int32_t osp_get_cfg_file(char* name, uint64_t *paddr, uint32_t *psize); + +#ifdef HEARTBEAT_ENABLE +extern int8_t osp_get_im2ddr_to_file(uint8_t u8CoreId); +#endif + +#endif /* __OSP_CFG_TO_BIN_H__ */ + diff --git a/osp/src/ospCfgToBin.c b/osp/src/ospCfgToBin.c index 87a843b..e8fbe61 100644 --- a/osp/src/ospCfgToBin.c +++ b/osp/src/ospCfgToBin.c @@ -1,659 +1,659 @@ -#include -#include -#include -#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 */ -#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_SPE_CFG_FILE_NUM) -#define ARM_SPE_CFG_OFFSET (0x8A000000) /* 目前改到APE_PHY段,从0x1000 0000开始,故需要偏移0x8A00 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_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; - 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_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; /* 在内存规划中,配置文件的起始地址需要偏移 */ - - 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_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_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_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); - - /* 回到文件头部 */ - 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_SPE_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_PHY, 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 - - +#include +#include +#include +#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 */ +#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_SPE_CFG_FILE_NUM) +#define ARM_SPE_CFG_OFFSET (0x8A000000) /* 目前改到APE_PHY段,从0x1000 0000开始,故需要偏移0x8A00 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_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; + 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_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; /* 在内存规划中,配置文件的起始地址需要偏移 */ + + 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); + + /* 回到文件头部 */ + 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; + } + for (loop = 0; loop < APE_SPE_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_PHY, 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 + +