/*! @brief fta_initialize FTA initialize function @param none @retval none */ void fta_initialize(void) { boolean dofirst = (fta_manager == NULL ? TRUE : FALSE); if(!dofirst) { memset(&fta_lock_keeper, 0, sizeof(fta_lock_keeper)); memset(&fta_reference, 0, sizeof(fta_reference)); } memset(fta_log_area,0,FTA_CONFIG_STORE_MEMORY_SIZE); fta_manager = (fta_manager_store_header *)fta_log_area; fta_manager_initializer.fta_manager = fta_manager; fta_manager_initializer.memory_addr = FTA_LIB_OFFSET_ADDR(((uint8 *)fta_manager), FTA_CALC_MANAGER_SIZE(FTA_CONFIG_STORE_INITIAL_COUNT)); if(_fta_manage_initialize(&fta_manager_initializer)) { _fta_manage_initialize_store_items(fta_manager); fta_manager->cmn.enabled = FTA_STORE_ENABLED_TRUE; FTA_LIB_CHANGEBIT_SET(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING); fta_manager->parity = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity); FTA_MEMORY_FLUSH(); fta_lock_keeper.manager_status = FTA_MANAGER_STATUS_ENABLED; /* start logging */ FTA_LOG_MESSAGE(FTA_ADMIN, FTA_LOG_LEVEL_NOTICE, "*** FTA INITIALIZED %x %x", fta_log_area, virt_to_phys(fta_log_area),0); } return; }
/*! @brief _fta_manage_check_exportable check data for exportable @param [out] fta_manager check data @param [in] limit_size data size @retval TRUE : data is exportable @retval FALSE: data is not exportable */ boolean _fta_manage_check_exportable(fta_manager_store_header *fta_manager, uint32 limit_size) { if(fta_manager == NULL) return FALSE; if(!(fta_manager->cmn.tag == FTA_TAG_MANAGER && fta_manager->cmn.size >= FTA_CALC_MANAGER_SIZE(fta_manager->count) && fta_manager->cmn.size <= limit_size && fta_manager->cmn.offset == FTA_MANAGER_STORE_HEADER_LEN && fta_manager->reclen == FTA_MANAGER_STORE_ITEM_LEN && fta_manager->count > 0)) { return FALSE; } if(fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, 0) != 0) { return FALSE; } if(!(fta_manager->cmn.enabled == FTA_STORE_ENABLED_TRUE && FTA_LIB_CHECKBIT(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING))) { return FALSE; } FTA_LIB_CHANGEBIT_CLR(fta_manager->cmn.statbit, FTA_STORE_STATBIT_RECORDING); fta_manager->parity = fta_lib_check_parity16( (uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity); return TRUE; }
/*! @brief _fta_manage_initialize initialize manage area @param [in] manager_initializer pointer of the manage area @retval TRUE : success @retval FALSE: failed */ boolean _fta_manage_initialize(const fta_manager_initializer_info *manager_initializer) { fta_manager_store_header *fta_manager; const fta_manager_config_store_item * const *p_config_items; fta_manager_store_item *store_items; uint32 manager_size; fta_common_store_header *store_addr; uint32 var_size; uint32 var_num; uint32 i; uint16 config_cnt; boolean config_err = FALSE; if(manager_initializer == NULL) return FALSE; if(manager_initializer->fta_manager == NULL || manager_initializer->p_config_items == NULL || manager_initializer->lock_keeper == NULL || (manager_initializer->memory_size & 3) != 0) { return FALSE; } fta_manager = manager_initializer->fta_manager; p_config_items = manager_initializer->p_config_items; store_items = (fta_manager_store_item *) FTA_LIB_OFFSET_ADDR(fta_manager, FTA_MANAGER_STORE_HEADER_LEN); manager_size = FTA_CALC_MANAGER_SIZE(manager_initializer->config_count); memset(fta_manager, 0, manager_size); fta_manager->cmn.tag = FTA_TAG_MANAGER; fta_manager->cmn.size = manager_size; fta_manager->cmn.enabled = FTA_STORE_ENABLED_FALSE; FTA_LIB_SETBITVALUE(fta_manager->cmn.statbit, FTA_STORE_STATBIT_ALLCLEAR); fta_manager->cmn.offset = FTA_MANAGER_STORE_HEADER_LEN; fta_manager->id = FTA_MANAGER_ID_DEFAULT; fta_manager->reclen = FTA_MANAGER_STORE_ITEM_LEN; fta_manager->count = 0; fta_manager->parity = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity); manager_initializer->lock_keeper->fta_manager = fta_manager; manager_initializer->lock_keeper->manager_status = FTA_MANAGER_STATUS_UNINIT; /* set the manage info from the config table */ store_addr = (fta_common_store_header *)(manager_initializer->memory_addr); var_size = manager_initializer->memory_size; /* calcurate the variable size */ config_cnt = 0; var_num = 0; /* - - - - - - - - */ for(i = 0; i < manager_initializer->config_count; i++) { if(p_config_items[i] != NULL) { if(p_config_items[i]->tag != FTA_CONFIG_UNDEFINED) { if(config_cnt == 0) { var_num = i; } else { if(var_size < p_config_items[i]->size) config_err = TRUE; if((p_config_items[i]->size & 3) != 0) config_err = TRUE; if(p_config_items[i]->offset > p_config_items[i]->size) config_err = TRUE; var_size -= p_config_items[i]->size; } config_cnt++; } } } if(config_cnt > 0) { if(p_config_items[var_num]->offset > var_size) config_err = TRUE; } /* - - - - - - - - */ config_cnt = 0; /* - - - - - - - - */ for(i = 0; i < manager_initializer->config_count; i++) { if(p_config_items[i] != NULL) { if(p_config_items[i]->tag != FTA_CONFIG_UNDEFINED) { store_items[config_cnt].addr = store_addr; store_items[config_cnt].tag = p_config_items[i]->tag; store_items[config_cnt].size = (i == var_num ? var_size : p_config_items[i]->size); store_items[config_cnt].def = p_config_items[i]; store_items[config_cnt].lock_keeper = manager_initializer->lock_keeper; if(p_config_items[i]->set_to != FTA_CONFIG_UNDEFINED) { *(p_config_items[i]->set_to) = &store_items[config_cnt]; } store_addr = (fta_common_store_header *) FTA_LIB_OFFSET_ADDR(store_addr, store_items[config_cnt].size); config_cnt++; } } } /* - - - - - - - - */ fta_manager->count = config_cnt; fta_manager->parity = fta_lib_check_parity16((uint16 *)fta_manager, fta_manager->cmn.size / 2, fta_manager->parity); /* cannot use FTA when configuration is unrecongnized */ if(config_err) { return FALSE; } return TRUE; }
fta_reference_pointers fta_reference = {0}; /* reference area */ const fta_reference_pointers fta_reference_null = {0}; DEFINE_SPINLOCK(fta_lock); /* -------------------------------- * initial information area * -------------------------------- */ unsigned long fta_log_area[FTA_CONFIG_STORE_MEMORY_SIZE/4] __attribute__((section(".fta.data"))); // char *fta_log_area; fta_manager_initializer_info fta_manager_initializer = FTA_MANAGER_INITIALIZER_INFO_DEF( (fta_manager_store_header *)fta_log_area, fta_initial_config_stores, FTA_CONFIG_STORE_INITIAL_COUNT, FTA_LIB_OFFSET_ADDR(fta_log_area, FTA_CALC_MANAGER_SIZE(FTA_CONFIG_STORE_INITIAL_COUNT)), FTA_CONFIG_STORE_MEMORY_SIZE - FTA_CALC_MANAGER_SIZE(FTA_CONFIG_STORE_INITIAL_COUNT), &fta_lock_keeper, ); /* ========================================================================== * FUNCTIONS * ========================================================================== */ /*! @brief fta_initialize FTA initialize function @param none