FreeCalypso > hg > freecalypso-sw
diff gsm-fw/services/dar/dar_task.c @ 305:4dccc9d3305f
gsm-fw: checking in DAR from Leonardo source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 16 Mar 2014 05:48:58 +0000 |
parents | |
children | a7087f91c752 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/services/dar/dar_task.c Sun Mar 16 05:48:58 2014 +0000 @@ -0,0 +1,278 @@ +/****************************************************************************/ +/* */ +/* File Name: dar_task.c */ +/* */ +/* Purpose: This function is the main function. It contains the dar_core */ +/* which waits for messages or function calls. */ +/* */ +/* */ +/* Version 0.1 */ +/* */ +/* Date Modification */ +/* ------------------------------------ */ +/* 16 October 2001 Create */ +/* */ +/* Author Stephanie Gerthoux */ +/* */ +/* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/ +/****************************************************************************/ + +#include "rv/rv_defined_swe.h" +#ifdef RVM_DAR_SWE + #ifndef _WINDOWS + #include "config/swconfig.cfg" + #include "config/sys.cfg" + #include "config/chipset.cfg" + #endif + + #include <string.h> + #include "rvm/rvm_gen.h" + #include "rvm/rvm_use_id_list.h" + #include "dar/dar_api.h" + #include "dar/dar_macro_i.h" + #include "dar/dar_handle_message.h" + #include "dar/dar_structs_i.h" + #include "dar/dar_error_hdlr_i.h" + #include "dar/dar_const_i.h" + + #include "ffs/ffs_api.h" + + /* Variables definitions */ + T_DAR_RECOVERY_STATUS status=0; + + /**** Global variables ****/ + /* Define a pointer to the Global Environment Control block */ + extern T_DAR_ENV_CTRL_BLK *dar_gbl_var_p; + + /* Write buffer*/ + extern char dar_write_buffer[DAR_MAX_BUFFER_SIZE]; + + /* index used in the circular buffer*/ + extern UINT16 dar_current_index; + + /* DAR previous status : to get the status of the last exception */ + extern UINT8 dar_previous_exception; + + /* Ram buffer that contains the Debug Unit register */ + extern UINT32 debug_RAM[DEBUG_UNIT_WORD_SIZE]; + + /* X_dump buffer defined in the command file */ + /* This buffer contains the general register, the PC, the CPSR....*/ + #ifndef _WINDOWS + extern INT32 xdump_buffer; + #endif + + + /********************************************************************************/ + /* Function dar_core */ + /* */ + /* Description Core of the dar task, which scans the dar mailbox and */ + /* waits for messages. When a message arrives, it sends it to */ + /* proper functions */ + /* */ + /* */ + /********************************************************************************/ + + T_RV_RET dar_core(void) + { + /* Declare local variables */ + /**** Structs ****/ + /* File descriptor type */ + T_FFS_FD ffs_fd; + + /* Variables */ + T_RV_RET error_status = RV_OK; + T_RV_HDR *msg_p = NULL; + UINT16 received_event = 0x0000; + char dar_ffs[20]; + char dar_dir_ffs[20]; + char dar_subdir_ffs[20]; + BOOL dar_ffs_error = FALSE; + + #ifndef _WINDOWS + /* Define the Link register and the CPSR */ + INT32 *link_register_p = &(xdump_buffer) + 14; + INT32 *dar_spsr_p = &(xdump_buffer) + 16; + UINT16 i; + #endif + + /* Dar_ffs file name */ + strcpy(dar_dir_ffs,"/var"); + strcpy(dar_subdir_ffs,"/var/dbg"); + + #ifndef _WINDOWS + strcpy(dar_ffs,"/var/dbg/dar"); + #else + strcpy(dar_ffs,"\var\dbg\dar"); + #endif + + DAR_SEND_TRACE("DAR_TASK started",RV_TRACE_LEVEL_DEBUG_HIGH); + + /*---------------------------------*/ + /* FFS */ + /*---------------------------------*/ + + /**** create the dar ffs directories ****/ + if ((ffs_mkdir(dar_dir_ffs) != EFFS_OK) && (ffs_mkdir(dar_dir_ffs) != EFFS_EXISTS)) + { + DAR_SEND_TRACE("DAR entity can't create the '/var' folder into the flash",RV_TRACE_LEVEL_ERROR); + } + + if ((ffs_mkdir(dar_subdir_ffs) != EFFS_OK) && (ffs_mkdir(dar_subdir_ffs) != EFFS_EXISTS)) + { + DAR_SEND_TRACE("DAR entity can't create the '/var/dbg' folder into the flash",RV_TRACE_LEVEL_ERROR); + } + + + /**** create the ffs file ****/ + ffs_fd = ffs_open(dar_ffs, FFS_O_CREATE | FFS_O_WRONLY | FFS_O_TRUNC | FFS_O_APPEND); + + if (ffs_fd < 0) + { + DAR_SEND_TRACE("DAR entity has received wrong file name or the flash is not formatted",RV_TRACE_LEVEL_WARNING); + dar_ffs_error = TRUE; + } + + #ifndef _WINDOWS + + /**** Save the RAM buffer into the FFS ****/ + /* save the buffer in 2 parts in order to have the information in chronological order */ + /* save the oldest information : from dar_current_index to the end of the buffer*/ + if ((ffs_write (ffs_fd, + (void *)(&dar_write_buffer + dar_current_index), + (DAR_MAX_BUFFER_SIZE - dar_current_index))) < 0 & (dar_ffs_error == FALSE)) + { + DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING); + } + + /* save the rest of information: from the beginning of the buffer to dar_current_index */ + if ((ffs_write (ffs_fd, + (void *)(&dar_write_buffer), + (dar_current_index))) < 0 & (dar_ffs_error == FALSE)) + { + DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING); + } + + /* Erase the dar_write_buffer */ + for (i=0;i<DAR_MAX_BUFFER_SIZE; i++) + { + dar_write_buffer[i] = 0; + } + + /**** Save the X_dump_buffer into the Flash. ****/ + /* This buffer is defined in the command file */ + /* And the size of this buffer is defined in the gsm_cs_amd4_lj3_test.cmd */ + /* its size is 38*32 bits = 38*4 bytes = 152 bytes */ + if ((ffs_write (ffs_fd, + (void *)(&xdump_buffer), + (DAR_X_DUMP_BUFFER_SIZE))) < 0 & (dar_ffs_error == FALSE)) + { + DAR_SEND_TRACE("DAR entity can't saved the X_dump_buffer in flash",RV_TRACE_LEVEL_WARNING); + } + + /**** Save the Debug Unit Register into the Flash if necessary (Abort or prefetch)****/ + /* A Prefetch abort exception or a data abort exception is generated */ + #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11)) + if ((dar_previous_exception == DAR_EXCEPTION_PREFETCH_ABORT) || + (dar_previous_exception == DAR_EXCEPTION_DATA_ABORT)) + { + /* Save the Debug Unit into the Flash */ + if ((ffs_write (ffs_fd, + (void *) &debug_RAM, + (4*DEBUG_UNIT_WORD_SIZE))) < 0 & (dar_ffs_error == FALSE)) + { + DAR_SEND_TRACE("DAR entity can't saved the DEBUG UNIT in flash",RV_TRACE_LEVEL_WARNING); + } + } + #endif + + #else + /* save the buffer in 2 parts in order to have the information in chronological order */ + /* save the oldest information : from dar_current_index to the end of the buffer*/ + if ((ffs_write (ffs_fd, + (&dar_write_buffer + dar_current_index), + (DAR_MAX_BUFFER_SIZE - dar_current_index))) != EFFS_OK) + { + DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING); + } + /* save the rest of information: from the beginning of the buffer to dar_current_index */ + if ((ffs_write (ffs_fd, + (&dar_write_buffer), + (dar_current_index))) != EFFS_OK) + { + DAR_SEND_TRACE("DAR entity can't saved the file in flash",RV_TRACE_LEVEL_WARNING); + } + /* The X_dump_buffer and the Debug Unit can't be saved on the PC */ + #endif + + /* Close the ffs file*/ + #ifndef _WINDOWS + if ( ffs_close(ffs_fd) != EFFS_OK & (dar_ffs_error == FALSE)) + { + DAR_SEND_TRACE("DAR entity has not closed the file",RV_TRACE_LEVEL_WARNING); + } + #else + if ( ffs_close(ffs_fd) != EFFS_OK ) + { + dar_error_trace(DAR_ENTITY_FILE_NO_CLOSE); + } + #endif + + #ifndef _WINDOWS + /**** Save the LR and the SPSR when an exception has occured ****/ + if ((dar_previous_exception == DAR_EXCEPTION_PREFETCH_ABORT)|| + (dar_previous_exception == DAR_EXCEPTION_DATA_ABORT) || + (dar_previous_exception == DAR_EXCEPTION_UNDEFINED) || + (dar_previous_exception == DAR_EXCEPTION_SWI) || + (dar_previous_exception == DAR_EXCEPTION_RESERVED)) + { + /* Displays the Link register saved on exception */ + DAR_SEND_TRACE_PARAM("Link register = ", *link_register_p,RV_TRACE_LEVEL_DEBUG_HIGH); + + /* Displays the User mode CPSR saved on exception */ + DAR_SEND_TRACE_PARAM("User mode SPSR before the exception=", *dar_spsr_p,RV_TRACE_LEVEL_DEBUG_HIGH); + } + + /* Displays the status of the last reset of the system */ + dar_recovery_get_status(&status); + #endif + + /* ------------------------------------------- */ + /* loop to process messages */ + /* ------------------------------------------- */ + while (error_status == RV_OK) + { + /* Wait for all events. */ + received_event = rvf_wait(DAR_ALL_EVENT_FLAGS, DAR_NOT_TIME_OUT); + + if (received_event & DAR_TASK_MBOX_EVT_MASK) + { + /* Read the message in the Dar mailbox and handle it. */ + msg_p = (T_RV_HDR *) rvf_read_mbox(DAR_MBOX); + error_status = dar_handle_msg(msg_p); + } + } + + /* If one of the occured events is unexpected (due to an unassigned */ + /* mailbox), then report an internal error. */ + if (received_event & ~(DAR_TASK_MBOX_EVT_MASK )) + { + DAR_SEND_TRACE(" DAR ERROR (env). One of the occured events is unexpected ", + RV_TRACE_LEVEL_ERROR); + + error_status = RV_NOT_SUPPORTED; + } + + /* If a memory error happened .. */ + if (error_status == RV_MEMORY_ERR) + { + dar_gbl_var_p->callBackFctError("DAR", + RVM_MEMORY_ERR, + 0, + " Memory Error : the DAR primitive memory bank is RED "); + } + + return RV_OK; + } /* dar_core */ + +#endif /* #ifdef RVM_DAR_SWE */